1

データモデルをテストするためのテストがあります:

<?php
namespace Tests\Model\SQL;

/**
 * @group Model_Users
 * @group Model
 */
class UsersTest extends TestCase {

/** @var Users */
private $model;

public function setUp() {
    parent::setUp();
    $this->connection->execute( file_get_contents(
        __DIR__ . '/fixtures/countries.sql' ) );
    $this->model = new \Users(
        $this->connection
    );
}

    public function testUserExists() {
            $exists = $this->model->userExists( 'johndoe' );
            $this->assertTrue( $exists );
    }

}

SQLiteTests\Model\SQL\TestCaseをデータベースとして使用して、テストを可能な限り高速に保ちます。いずれにせよ、ご想像のとおり、SQLite はPostgresと同じデータベースではないため、SQLite では失敗して PostgreSQL ではパスする、またはその逆の特殊性がいくつかある可能性があります。

私の質問は:

(DRY を念頭に置いて) 効果的にアーキテクチャを設計して、SQLite のみでテストを実行し、次に Postgres でのみテストを実行できるようにする方法。

私がDRYと言っている場合、理想的には、1 つのモデルに対して 1 つのテストケースのみを記述し、テストのアーキテクチャがそれを処理する場合、次のようなテストを実行できることを意味します。

php tests/run.php --group=MockedDbWithSqlite # fast way, prefered, default

php tests/run.php --group=RealDb # slower way, but with more precise results
4

2 に答える 2

1

したがって、コメントから判断すると、この問題は具体的なストレージの問題とは無関係であり、カスタムパラメーターをPHPUnitに渡す方法について詳しく説明しています。

なぜなら、このパラメーターを使用すると、DBドライバーを切り替えることになります。

これを行うにはいくつかのオプションがありますが、公式にサポートされている「カスタムパラメータ」オブジェクトなどはありません。それでも、誰かがこれを追加してくれるといいでしょう:)

私の提案は、オプションに次のいずれかを使用することです。

環境変数

テスト/ブートストラップコードを$_ENV変数に依存させます。

$dbDriverFactory->getInstanceFor(getenv('DB'));

以下のいずれかの方法を使用して

export DB=postgress
phpunit

また

DB=postpress; phpunit;

または、phpunits xml configを使用して、envなどを設定します。

そうすることで、2つのxml構成を提供して実行できphpunit-sqlite.xmlますphpunit-pg.xml

phpunit -c phpunit-sqlite.xml

envである必要はありません。ドキュメントセクションSetting PHP INI settings, Constants and Global Variablesにリストされている方法のいずれかが機能します。

「カスタム」CLIパラメータ

このようにphpunitを呼び出す:

phpunit --colors --usePostgres

テストケースまたはブートストラップコードに次のようなものを追加します。

if (in_array('--usePostgress', $_SERVER['argv'], true) {
    $db = $this->setupPG();
} else {
    $db = $this->setupSqlite();
}
于 2012-10-03T20:26:24.327 に答える
0

これはedorianとは読み方が異なります。私はこの種のものに継承を使用するのが好きです。利点は、同じテスト実行で SQLite と Postgres の両方のテストを実行できることです。欠点は、両方のデータベースで実行する各テスト ファイルにコードを追加する必要があることです。そして、テストする新しいデータベースごとにこれを繰り返す必要があります。仕組みは次のとおりです。

class UsersTestBase extends TestCase {
    //Unchanged
}

class UsersTestSQLite extends UsersTestBase{}

class UsersTestPostgres extends UsersTestBase {
    function __construct(){
        parent::_construct("postgres");
    }
}

そのため、UsersTest はまったく同じですが、名前が「Base」を追加するように変更されています。これで、派生した UsersTestSQLite クラスができました。これは何もしません。この時点で、私たちは何も得も失いもしていません。

次に、UsersTestPostgres がありました。これはどういうわけか、sqlite の代わりに postgres を使用するようにオブジェクトに指示します。この場合、TestCase にはデータベースをオプションのパラメーターとして使用できるコンストラクターがあると仮定しました (デフォルトは "sqlite" です)。もちろん、それに代わるものはたくさんありますが、一般的な考え方を理解していただければ幸いです。

最後に、適切な@groupタグを派生クラスに追加して、いつ実行するかを制御できるようにする必要があります。

于 2012-10-15T02:34:42.153 に答える