はじめに
筆者はフリーランスエンジニアになってしばらく、PHPの案件をやっていたのですが
直近の案件ではTypescriptに触れる機会がありました。
Typescript(npm)の世界ではJestがデファクトスタンダードかと思われますが
例に漏れず、その現場でも利用されています。
今まではPHPUnitでテストすることが多かったですので、少々の違いに戸惑うこともあり
各ライフサイクルメソッドの比較をしてみようかなと思いました。
JestとPHPUnitの比較
ライフサイクル | PHPUnit | Jest |
---|---|---|
テスト全体で開始時に1度実行 | setUpBeforeClass() | beforeAll() |
テスト全体で終了時に1度実行 | tearDownAfterClass() | afterAll() |
各テスト開始時に実行 | setUp() | beforeEach() |
各テスト終了時に実行 | tearDown() | afterEach() |
名前から大体予測できそうな感じですね。
その他の特徴についても比較してみます。
特徴 | PHPUnit | Jest |
---|---|---|
テスト開始時のDBマイグレーション | RefreshDatabase等のTraitで可能 | 自前でロジックを書く必要がある |
DBアサーション | assertDatabaseHas等のアサーションが可能 | なし(カスタムアサーションを作れば実現可能 |
JSON(オブジェクト)アサーション | assertJSONStructure等のアサーションがある | expect(Object).toMatchObject(diffrenceObject)で可能 |
クラス、オブジェクトのmock | Mockeryで実装が必要 | jest.fn()でモック可能 |
ダミーデータ作成 | LaravelであればFactory::faker()またはfake()ヘルパーで作成可能 | faker-jsを導入すれば可能 |
テスト時の環境変数設定 | Laravelであれば.env.testingを用意すれば半自動的に読み込む(PHPUnit.xmlの設定も必要) | jest.config.jsを用意し、setupFilesで読み込むファイルを指定。ここで環境変数を設定することができる |
ざっと並べてみました。
個人的な感触ですが、JestはDBマイグレーション、DBアサーションは少し弱そうだなという印象を受けました。
まぁそれもカスタムアサーションなどで回避できることなので、大きな差では無い様に思えます。
Jestはまだ触り始めたばかりなので、上記の内容に間違いがあるかもしれませんが
その場合はコメントなどでアドバイス頂けると幸いです。