明らかなテストの大失敗…もう少し短い単語が必要で、どうしてもそうしたい場合は、-db- の部分を省略してもいいと思います。
Test-DB-Acle は、データベース層の簡単かつ簡潔なテストの作成を容易にする PHP ライブラリです。
テストの作成は開発者にとってできるだけ簡単であるべきであり、他の開発者にとってもできるだけ読みやすくなければならない、というのが私の信念です。
これは、テスト内のテスト データはテスト シナリオにのみ関連する必要があることを意味します。ただし、ほとんどのデータベース テーブルには null 以外の列があり、テストに認知ノイズをもたらすだけのダミー データを入力する必要があります。
Test-Db-Acle は、開発者からこの負担を取り除くことを目的としています。テスト フレームワークは、データベース レイヤー クラスがどのように動作するかについていかなる仮定も行いません。Doctrine などの ORM、ストアド プロシージャ、またはストレート SQL を使用する場合、原則は常に同じであり、ある時点でコードが DB テーブル内のデータと対話します。 、これをテストする必要があります。
Composer によるインストール
データベースの外部キーチェックを無効にします
Null 以外の列を自動的に処理する
値が DB テーブルにあることをアサートするときに、mysql の日付/時刻列を自動的にトリミングします - 挿入されたタイムスタンプに役立ちます (Sqlite ではこれらの列を指定する必要があります)
ほぼすべてのコンポーネントを交換したり、カスタムの種類に置き換えたりすることができます
現時点では Mysql と Sqlite をサポートしています
フレームワークに依存せず、たとえば ORM が使用されるかどうかを想定せず、他の単体テスト フレームワークにも簡単に適応できるはずです。
現時点でサポートされているデータベースは、MySql (拡張子は MariaDB) と Sqlite です。
このアーキテクチャでは、さらにデータベースを追加できるようにする必要があります。
このライブラリは、PHPUnit ですぐに使用できます。提供された特性を使用し、「assertEquals」メソッドを同等のメソッドにデリゲートさせることで、他のテスト フレームワークでこれを使用するのはかなり簡単になるはずです (たとえば、SimpleTest では「assertEqual」だったと記憶しています)。
PHP 5.4 を使用していて特性の使用を気にしない場合は、単純な TestDbAclePhpUnitAbstractTestCase と TestDbAclePhpUnitTraitsDatabaseHelperTrait を提供しました。
公平に言うと、データベース層のテストは費用がかかり、テストの速度が遅くなります。可能な限り、データベースへの依存関係を模擬する必要があります。しかし、場合によってはこれを行う必要がある場合もあります。適切に構造化されたアプリケーションでは、これを最小限に抑えることができれば幸いです。
データベースのテストに役立つツールやアプローチは数多くあります (たとえば、DBUnit や単体テストでのファクトリ メソッドの使用) があり、それぞれに独自の長所があります。次の理由から、このアプローチは私にとっては役に立ちます。
Null 列や外部キー制約について心配する必要はありません
テスト用に最小限のデータセットを提供します
テストの上にグリッドのような形式でテストデータが表示され、データベース内のデータをアサートするときにもテストデータが表示されます。
そこで私は独自のソリューションを設定しました。
###では、それはどのように機能し、どのように見えるのでしょうか?例を見せてください!###
このアイデアは、「パイプで区切られた値」テキスト文字列 (CSV と同様に、パイプを使用して PSV と呼びます) を使用して、次のようなテスト フィクスチャを設定することです。
(PSV の形式は、優れた Behat BDD フレームワーク (https://github.com/Behat/Behat) で使用される形式に非常に似ています)
$dbTablesToSetup="[table_name]id |date |name |value |dependent_table_id10 |2001-01-01 |foo |900 |60[dependent_table]id |name20 |Bar60 |Baz";// したくない場合はこれを使用してください提供された特性または抽象テスト ケースを使用します$testDbAcle = TestDbAcleTestDbAcle::create($pdo);$testDbAcle->runCommand(new TestDbAcleCommandsSetupTablesCommand($dbTablesToSetup));//TestDbAclePhpUnitAbstractTestCase からテスト ケースを拡張した場合、またはTestDbAclePhpUnitTraitsDatabaseHelperTrait:$this->setupTables($dbTablesToSetup);
フレームワーク自体は、テーブル内のどの列が NULL 可能ではないかを認識し、デフォルト値を挿入します...実際、テーブルtable_nameには 30 個の列があり、そのすべてが NULL ではないものと仮定します。
また、バックグラウンドでさまざまな外部キー制約が発生している可能性があります。 Test-Db-Acle は外部キー チェックを一時的に無効にするため、これについて、またはテスト データを挿入する順序について心配する必要はありません。
###実際のテストはどうでしょうか....?### まず、PHP5.4 を使用している場合は、traits バージョンを使用できます。
クラス ExampleTest は PHPUnit_Framework_TestCase を拡張し、TestDbAclePhpUnitAbstractTestCaseInterface を実装します。 {TestDbAclePhpUnitTraitsDatabaseHelperTrait を使用します。 /** * このメソッドは実装する必要があります。データベース フィクスチャで使用される PDO オブジェクトを返す必要があります * * @return Pdo */public function ProvidePdo() {return new Pdo("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); } /* * テストの例 */public function test_AddressService() {$this->setupTables(" [住所] address_id |company 1 |me 3 |you [user] user_id |name 10 |John 20 |Mary "); $this->setAutoIncrement('アドレス', 100); $this->addressService->addEntry("them");$this->assertTableStateContains(" [住所] address_id |company 1 |me 3 |you 100 |them [user] user_id |name 10 |John 20 |Mary ", array(), "うまくいきます"); } }
特性を使用しない場合は、 AbstractTestCase
を使用できますが、その場合は独自の基本テスト クラスを使用できません。
クラス ExampleTest は TestDbAclePhpUnitAbstractTestCase を拡張します { protected $addressService;function Setup(){parent::Setup();$this->addressService = new ServicesAddressService(); }/** * このメソッドは実装する必要があります。データベース フィクスチャで使用される PDO オブジェクトを返す必要があります * * @return Pdo */public function ProvidePdo() {return new Pdo("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); }関数test_AddressService() {$this->setupTables(" [住所] address_id |company 1 |me 3 |you [user] user_id |name 10 |John 20 |Mary "); $this->setAutoIncrement('アドレス', 100); $this->addressService->addEntry("them");$this->assertTableStateContains(" [住所] address_id |company 1 |me 3 |you 100 |them [user] user_id |name 10 |John 20 |Mary ", array(), "うまくいきます"); } }
OK、明らかにここには ServicesAddressService は存在しません (テストファーストですよね?)。例は非常に単純です。
実際には、getPdo メソッドをプロジェクトの共通の基本テスト クラスに追加すると、こことはまったく異なる方法で取得される可能性があります。しかし、まあ、これは一例です。
ご覧のとおり、setupTables は複数のテーブルを一度にセットアップでき、assertTableStateContains はさまざまなテーブルの状態を同時に確認することもできます。
setupTables が指定された列よりも多くの列を持つテーブルをセットアップできるのと同様に、assertTableStateContains も指定された列の値を比較してアサートするだけです。
Test-Db-Acle をインストールする最も簡単な方法は、composer (詳細はこちら: http://packagist.org ) を使用することです。このアプローチを使用することを強くお勧めしますが、パッケージをフォルダーに解凍して自動ロードを有効にすることもできます。任意の形式で手動で作成します (psr-0 命名規則を使用します)。
Composer で使用するには、これを Composer.json ファイルに追加します。
"require": { "test-db-acle/test-db-acle" : "dev-master" }, "repositories" : [ { "type": "git", "url": "https://github.com/malteriesch/test-db-acle.git" } ]
必要に応じて、https://packagist.org/packages/test-db-acle/test-db-acle を使用することもできます。
貢献 (および批判) は大歓迎です...!
###Test-Db-Acle テストの実行方法### テストを実行するには、選択した MySql サーバー上に空のデータベースを作成し、tests/Functional/config.php.dist を testing/ にコピーする必要があります。 Functional/config.php にデータベースの詳細を入力します。その後、すべてのテストが実行されるはずです。 (データベースは実際には機能スモークテストにのみ必要です)
PSV 構文
抽象的なテストケース
TestDbAcle の拡張とカスタマイズ
変更履歴