Pendant le développement de PHP, il est courant d'utiliser les extensions MySQLI pour les opérations de base de données. La fonction MySQLI :: STMT_INIT est utilisée pour initialiser une instruction de prétraitement, qui est très importante pour améliorer la sécurité et l'efficacité des requêtes SQL. Cependant, lors de l'exécution de tests unitaires, en raison de l'existence de connexions de base de données, comment tester efficacement la méthode de fonctionnement de la base de données contenant la fonction MySQLI :: STMT_INIT devient un problème difficile.
Cet article introduira le test unitaire en PHP, en particulier comment tester les méthodes de fonctionnement de la base de données contenant mysqli :: stmt_init . Nous utiliserons Framework de test unitaire de PHP - PHPUNIT, et combinerons certains objets simulés et outils de simulation de base de données pour simuler les opérations de la base de données et éviter l'interaction directe avec la base de données.
Tout d'abord, nous créons une classe de fonctionnement de base de données simple qui contient une méthode de fonctionnement de la base de données à l'aide de mysqli :: stmt_init . L'exemple de code est le suivant:
<?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');
}
}
}
Dans cette classe, la méthode PrepareAndexecute utilise la fonction mysqli :: stmt_init pour initialiser une instruction de prétraitement et exécuter la requête SQL entrante.
Afin de tester cette classe d'opération de base de données, nous devons simuler la fonction MySQLI :: STMT_INIT et les opérations de base de données connexes. Nous utilisons PHPUnit et Mockery pour créer un objet MySQLI moqué pour éviter les interactions réelles de la base de données lors des tests.
Voici le code de test unitaire:
<?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();
}
}
Dans ce test, nous utilisons la moquerie pour simuler les objets MySQLI et MySQLI_STMT , et vérifiez si la méthode PrepareAndexECUTE effectue correctement Prépare , Bind_param , exécuter et d'autres opérations.
Assurez-vous que le phpunit et la moquerie sont installés. Vous pouvez l'installer via la commande suivante:
composer require --dev phpunit/phpunit mockery/mockery
Ensuite, vous pouvez exécuter le test:
php vendor/bin/phpunit DatabaseTest.php
Si le test passe, vous verrez un message similaire à ce qui suit:
OK (1 test, 1 assertion)
En utilisant l'objet simulé et le framework PHPUnit, nous pouvons tester efficacement la méthode de fonctionnement de la base de données contenant MySQLI :: STMT_INIT sans interagir avec la base de données réelle. Cela nous permet d'assurer l'exactitude de la logique de fonctionnement de la base de données tout en évitant la dépendance à la disponibilité de la base de données dans les tests unitaires.
Ce qui précède est une introduction à la façon de tester la méthode de fonctionnement de la base de données contenant la fonction mysqli :: stmt_init . J'espère que cet article peut vous aider et vous permettre d'effectuer des tests d'unité PHP plus efficacement.