2016/07/21

Laravel :: phpunit with clean database.

Laravel + postgresSQLを使ったサイトで unit test を書いてたが、既存のデータベースを使うと、テストが意図しない挙動になることがあったので、汚れていないDBを使いたくなったので、調べてやってみたら、意外と詰まってしまったという話。

環境

  • laravel 5.x
  • PostgreSQL

sqlite in memory database を使う方法

config/database.php

環境変数で default 値を差し替えれるようにする

'default' => env('DB_DEFAULT', 'pgsql'),

config/database.php

memory database の定義を作る

'sqlite_testing' => [
    'driver'   => 'sqlite',
    'database' => ':memory:',
    'prefix'   => '',
],

phpunit.xml

環境変数追加。環境変数を与える方法は別に何でも良い。

~~~~~~~~~~~~~
        <env name="DB_DEFAULT" value="sqlite_testing"/>
    </php>
</phpunit>

TestCase.php

都度migrateをするようにする。

  public function setUp()
  {
      parent::setUp();

      $this->artisan('migrate');
      $this->artisan('db:seed');
  }

  public function tearDown()
  {
      $this->artisan('migrate:reset');
  }

これで上手くいく人は上手くいく。


Sqliteでエラーがでる場合の対処1

Driver not found

[Symfony\Component\Debug\Exception\FatalErrorException]
Class 'Doctrine\DBAL\Driver\PDOSqlite\Driver' not found

が出たら。

cmposer に

"doctrine/dbal": "^2.5"

ALTER TABLE SYNTAX ERROR

さらにエラーが出る。
ALTER TABLE が syntax エラーと migration 中に出る。

ここからヒントをもらう。

以下のスレッドの中で、SQL Features That SQLite Does Not Implement [sqlite.org] を参照。つまり、sqliteで実装されていないので、エラーになっている。

ここを参考に、

エラーがでない内容の migration だけを行い、
そのsqlite file をテスト前にコピーして、テスト後破棄するというもの。

少々面倒。

また以下問題も見つかる。

migration 中にエラーが出たら、エラーが出たファイルを消して、migration を終了させた後、テストを流してみたが、特定のカラムが無いというエラーが起きた。
一つの migration ファイルの中で、ADD COLUMNDROP COLUMN 両方を入れているとエラーにならず、追加もされない。

Sqliteでエラーがでる場合の対処2

sqlite を諦め、PostgreSQL に一時的な testdb を作成し、
そちらでテストを行い、終了後は drop database する。

script を書きそれを実行した。

psql -U postgres -c "CREATE DATABASE testdb"
php artisan migrate --database=pgsql_testing
php artisan db:seed --database=pgsql_testing
phpunit -c phpunit.xml "$@"
psql -U postgres -c "DROP DATABASE testdb"

これでようやく上手くいった。

2016/07/02

[読書メーター] 2016年6月まとめ

並行して、色々と技術本を読み始めたので、
読了数が少なくなったけど気にしない。



2016年6月の読書メーター
読んだ本の数:1冊
読んだページ数:400ページ
ナイス数:4ナイス

ゲームウォーズ(上) (SB文庫)ゲームウォーズ(上) (SB文庫)感想
フルダイブ型仮想世界がインフラ化してる世界で製作者の仕込んだ謎を解くと国家予算並の遺産をゲットできるエッグハントが始まって数年。80年代マニアの製作者が用意した最初の謎を問いた主人公と続々続いて謎を説いていく他のプレイヤーたち、お互いの姿が見えずとも明日にはライバルが次の謎を解いて先に行ってしまうかもしれないという焦燥感とシンクロする。80年代マニアック知識も良いし、海外小説であることを主張する翻訳も良い。
読了日:6月30日 著者:アーネスト・クライン

読書メーター

2016/06/05

[読書メーター] 2016年5月まとめ

ようやく読書の習慣が少し戻ってきました。
英語の勉強が少しだけひと段落したってのもあります。(まだまだ続きますけど)
仕事本の読み込みが相変わらず終わらないので、速読読了を目指してみたいと思います。
速読中々難しいですね。頭の中の音読音を消すらしいのですが、その状態が長続きしません。
精進精進


2016年5月の読書メーター 読んだ本の数:4冊 読んだページ数:887ページ ナイス数:3ナイス マグダラで眠れ (8) (電撃文庫)マグダラで眠れ (8) (電撃文庫) 読了日:5月13日 著者:支倉凍砂
声優魂 (星海社新書)声優魂 (星海社新書)感想 大塚明夫さんの昨今の声優に対する苦言から始まり、最終的には仕事・人生論。考え方の大枠が私と似てる気がする。大塚さんの方が年食ってる分もっと上の考えを持っていそうですが。すとんと腑に落ちました。 読了日:5月6日 著者:大塚明夫
半値になっても儲かる「つみたて投資」 (講談社+α新書)半値になっても儲かる「つみたて投資」 (講談社+α新書)感想 保険屋の知り合いに進められて読破。色々な例が出てるので実際に自分で計算して言ってる事が正しいかは検証可能。 読了日:5月6日 著者:星野泰平
ダーリンは外国人 ベルリンにお引越し トニー&さおり一家の海外生活ルポダーリンは外国人 ベルリンにお引越し トニー&さおり一家の海外生活ルポ 読了日:5月1日 著者:小栗左多里,トニー・ラズロ
読書メーター

2016/05/11

[読書メーター] 2016年4月まとめ

4月は小説のみ、理由はなんだろう無いかもしれない。
読書が習慣から抜けつつあるな。なんとかしたいところ。


2016年4月の読書メーター
読んだ本の数:1冊
読んだページ数:392ページ
ナイス数:2ナイス

マグダラで眠れ (7) (電撃文庫)マグダラで眠れ (7) (電撃文庫)
読了日:4月18日 著者:支倉凍砂

読書メーター

2016/04/12

[読書メーター] 2016年3月まとめ

先月分の読書も一冊でした。
今回は3月中2週間ほどベトナムに出張しており、
本持っていけば良かったのですが、持って行かず、このような結果になってしまいました。
(空港での待ち時間とか生き返り合計すると優に3時間以上は暇な時間あったのにもったいない)
次回は2冊ぐらいはいきたいものですね。



2016年3月の読書メーター
読んだ本の数:1冊
読んだページ数:236ページ
ナイス数:8ナイス

エンピツ戦記 - 誰も知らなかったスタジオジブリエンピツ戦記 - 誰も知らなかったスタジオジブリ感想
一気に読了。原画チェックとして長年ジブリで仕事をされていた方の回顧録でもあり、ジブリ自体の回顧録でもある。宮崎監督の凄さ理不尽さ、作品を仕上げることの大変さの一片が感じられる。
読了日:3月28日 著者:舘野仁美,平林享子

読書メーター