データベース関連のユニットテストを実行する場合、特にテストが故障して複雑なSQL操作が含まれる場合、正確に何が起こっているかをより深く理解する必要がある場合があります。 PHPのMySQLI拡張機能は、非常に実用的なデバッグ機能MySqli :: Debug()を提供します。これにより、基礎となる操作ログをファイルに出力できます。この記事では、mysqli :: debug()を組み合わせて、テストにphpunitを使用する際にデータベース操作のデバッグ機能を実装する方法を紹介します。
mysqli :: debug(string $ debug_options)は、 mysqliクラスのメソッドであり、クライアントデバッグログを有効にするために使用できます。そのパラメーターは、出力ファイルパスやログレベルなどのデバッグ情報の構成を説明する文字列です。自動的にログを有効にしないことに注意してください。また、MySQLサーバーのコンパイルオプションでのデバッグのサポートも必要です。
mysqli::debug("d:t:o,/tmp/client.trace");
で:
Dはデバッグの略です
tはスレッド情報を含むことを意味します
oファイルする出力を意味します
/tmp/client.traceは、ログファイルへのパスです
データベース関連のテストにphpunitを使用する場合、テストのsetup()またはsetupbeforeclass()メソッドでデバッグを有効にすることができます。このようにして、データベース操作を追跡するのに役立つテストが実行されるたびにデバッグ情報が記録されます。
これが実際の例です。
use PHPUnit\Framework\TestCase;
class DatabaseTest extends TestCase
{
private static $mysqli;
public static function setUpBeforeClass(): void
{
// デバッグ出力を有効にします
mysqli::debug("d:t:o,/tmp/php-mysqli-debug.log");
self::$mysqli = new mysqli("localhost", "user", "password", "testdb");
if (self::$mysqli->connect_error) {
die("接続に失敗しました: " . self::$mysqli->connect_error);
}
}
public function testInsertData()
{
$stmt = self::$mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
$name = "ユーザーをテストします";
$email = "test@m66.net";
$this->assertTrue($stmt->execute());
}
public static function tearDownAfterClass(): void
{
self::$mysqli->close();
}
}
ログファイルの権限:PHPが、 /tmp/ php-mysqli-debug.logなどの指定されたログファイルパスに書き込む権限を持っていることを確認してください。
生産環境では注意してください: mysqli :: debug()は、主に開発段階とデバッグ段階で使用されます。機密情報の漏れを避けるために、生産環境でそれを有効にすることは推奨されません。
ファイルのデバッグには多くの内容があります。特に多数のデータベーステストを実行する場合、デバッグファイルはすぐに大きくなる可能性があります。ファイルパスを合理的に計画し、定期的にログをクリーニングしてください。
/tmp/php-mysqli-debug.logファイルを開いた後、以下を含む詳細なデバッグ情報が表示されます。
各接続の確立と閉鎖
クエリステートメント実行ステータス
パラメーターのバインディングおよび実行プロセス
スレッド情報など。
この情報は、特にテストが失敗したときに問題を見つける場合、PHPプログラムがMySQLとどのように通信するかをより明確に理解するのに役立ちます。
MySqli :: Debug()を使用すると、特にデータベースドライバー、ORM、または統合テストを実行する場合は、非常に実用的なデバッグ方法です。データベース関連のテストやデバッグをしている場合は、この方法を試すこともできます。トラブルシューティングの問題を大幅に節約するのに役立ちます。
mysqli :: debug()の使用に関する詳細については、公式のPHPドキュメントを参照してください: https://www.php.net/zh/mysqli.debug.php