PHP開発中は、データベース操作にMySQLI拡張機能を使用することが一般的です。 MySQLI :: STMT_INIT関数は、SQLクエリのセキュリティと効率を改善するために非常に重要な前処理ステートメントの初期化に使用されます。ただし、データベース接続が存在するため、ユニットテストを実行する場合、 MySQLI :: STMT_INIT関数を含むデータベース操作方法を効果的にテストする方法が困難な問題になります。
この記事では、PHPでユニットテストを行う方法、特にmysqli :: stmt_initを含むデータベース操作方法をテストする方法を紹介します。 PHPのユニットテストフレームワーク-PHPunitを使用し、いくつかのモックオブジェクトとデータベースシミュレーションツールを組み合わせて、データベース操作をシミュレートし、データベースとの直接的な相互作用を回避します。
まず、 mysqli :: stmt_initを使用してデータベース操作方法を含む簡単なデータベース操作クラスを作成します。コードの例は次のとおりです。
<?php
class Database
{
private $connection;
public function __construct($host, $username, $password, $dbname)
{
$this->connection = new mysqli($host, $username, $password, $dbname);
if ($this->connection->connect_error) {
die("Connection failed: " . $this->connection->connect_error);
}
}
public function prepareAndExecute($query, $params)
{
$stmt = $this->connection->stmt_init();
if ($stmt->prepare($query)) {
$stmt->bind_param(...$params);
$stmt->execute();
return $stmt->get_result();
} else {
throw new Exception('Query preparation failed');
}
}
}
このクラスでは、 PrepeAnDexecuteメソッドでMySQLI :: STMT_INIT関数を使用して、前処理ステートメントを初期化し、着信SQLクエリを実行します。
このデータベース操作クラスをテストするには、 mysqli :: stmt_init関数と関連データベース操作をシミュレートする必要があります。 phpunitとmockeryを使用して、テスト中の実際のデータベースの相互作用を回避するために、 mysqliオブジェクトを模造したmysqliオブジェクトを作成します。
これがユニットテストコードです:
<?php
use PHPUnit\Framework\TestCase;
use Mockery;
class DatabaseTest extends TestCase
{
private $db;
private $mockConnection;
public function setUp(): void
{
$this->mockConnection = Mockery::mock('mysqli');
$this->db = new Database('localhost', 'user', 'password', 'test_db');
$this->db->connection = $this->mockConnection;
}
public function testPrepareAndExecute()
{
// Mock stmt_init to return a mocked statement object
$mockStmt = Mockery::mock('mysqli_stmt');
$this->mockConnection->shouldReceive('stmt_init')->once()->andReturn($mockStmt);
// Mock the prepare method to return true
$mockStmt->shouldReceive('prepare')->once()->andReturn(true);
$mockStmt->shouldReceive('bind_param')->once();
$mockStmt->shouldReceive('execute')->once();
$mockStmt->shouldReceive('get_result')->once()->andReturn(true);
// Call the method
$result = $this->db->prepareAndExecute('SELECT * FROM users WHERE id = ?', ['i', 1]);
// Assert that the result is true
$this->assertTrue($result);
}
public function tearDown(): void
{
Mockery::close();
}
}
このテストでは、 mockeryを使用してmysqliおよびmysqli_stmtオブジェクトをシミュレートし、 prepereandexecuteメソッドが準備、 bind_param 、実行、およびその他の操作を正しく実行するかどうかを確認します。
phpunitとmockeryがインストールされていることを確認してください。次のコマンドを介してインストールできます。
composer require --dev phpunit/phpunit mockery/mockery
次に、テストを実行できます。
php vendor/bin/phpunit DatabaseTest.php
テストが合格した場合、次のようなメッセージが表示されます。
OK (1 test, 1 assertion)
MOCKオブジェクトとPHPunitフレームワークを使用することにより、実際のデータベースと対話せずにMySQLI :: STMT_INITを含むデータベース操作方法を効果的にテストすることができます。これにより、ユニットテストでのデータベースの可用性への依存性を回避しながら、データベース操作ロジックの正確性を確保することができます。
上記は、MySQLI :: STMT_INIT関数を含むデータベース操作方法をユニットテストする方法の紹介です。この記事があなたを助け、PHPユニットテストをより効率的に実行できるようにすることを願っています。