3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Fixture利用のTips

Posted at

1. Fixtureのロードは、各テストケースごとに行う

冒頭で public $autoFixtures = false; を記述しておく

    /**
     * Fixtures
     *
     * @var array
     */
    public $fixtures = [
        'app.Hoge',
        'app.Fuga',
    ];
    public $autoFixtures = false;

各テストケース内でFixtureをロードする

    /**
     * Test something method
     *
     * @return void
     */
    public function test_something()
    {
        $this->loadFixtures(
            'Hoge',
            'Fuga'
        );

参照

2. テストごとにFixtureを分ける

同じテーブルに対して、複数のテストから利用していると、
AテストのためにFixtureを編集すると
Bテストがコケる、ということに遭遇します。
あっちをいじると、こっちがおかしくなる・・・・で、めんどくさいので
テストケースごとに Fixtureを用意する。

テストケースごとのFixture置き場

Fixtureディレクトリに任意のディレクトリ(something)を作ってその中に配置。

tests/Fixture/something/somethingTableFixture.php

テスト側での呼び出し

    /**
     * Fixtures
     *
     * @var array
     */
    public $fixtures = [
        'app.something/somethingTable',
    ];
    public $autoFixtures = false;

    /**
     * Test something method
     *
     * @return void
     */
    public function test_something()
    {
        $this->loadFixtures(
            'somethingTable'
        );

loadFixturesするときは Fixtureクラスの名前だけでおk。

Fixture作成に便利なコマンドオプション

$ bin/cake bake fixture -s -c [default以外のDB] [Table名] -r -n 5
$ bin/cake bake fixture -s -c [default以外のDB] [Table名] -r -n 5 --conditions "city='Tokyo'"

  • -s:スキーマの定義はDBから取得して利用する。Fixtureファイルに直接定義が書かれない。
  • -c:default以外のDBのコネクション名を指定。
  • -r:実際のDBデータからレコードをとってくる。
  • -n:何件とってくるか。
  • --conditions:とってくる条件。SQLのwhere。

3. 謎のトランザクションエラー回避のためのおまじない

たまに起きる 謎のトランザクションエラー

phpunit <ファイル名>

↑で、単体実行するとエラーが出ないのに、
全体実行すると ↓下記のようなエラーが出ることがある。

ERROR: current transaction is aborted, commands ignored until end of transaction block

MySQLだと出たことがないけど、PostgreSQLだと高い確率で遭遇する。
phpunit実行時、裏っかわでは、テスト用のTableをcreateしたり、dropしたりしてるんだが
どうやらこの時、2に記述したような、同Tableを複数のFixtureが利用していると起きるらしい?

ので、tearDown() におまじないを書いておく

    /**
     * tearDown method
     *
     * @return void
     */
    public function tearDown()
    {
        $this->fixtureManager->shutdown(); //ポスグレトランザクションエラー回避
        parent::tearDown();
    }

参照

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?