こんにちは。たいら(@tairaengineer2)です。
転職を繰り返し現在5社経験している、14年目エンジニアです。
この記事では、 Laravelのテストで使用するPHPUnitにあるDataProviderについて
- DataProviderとは
- DataProviderの使い方
と、丁寧に解説していきます。
前提:実行環境
実行環境は以下の通りです。
OS | Windows11 |
---|---|
PHPのバージョン | 8.2.4 |
Laravelのバージョン | 10.45.1 |
この記事では
C:\Laravel
配下に【LaravelSample】という名前でプロジェクトを作成しています。
DataProviderとは
DataProviderとは、同じテストメソッドに対して複数の値を与えることができる仕組みです。
基本的にPHPUnitのテストメソッドは、1つの入力値から1つの結果をテストします。
入力値が異なるが結果が同じになるテストケースでもそれぞれテストメソッドを作る必要があり、同じ処理をするコードがたくさん生まれるためテストメソッドが増大します。
そういうときにDataProviderが便利です。
値を渡す箇所を別に切り出して、処理するテストメソッドは1つにすることができます。
文章だとよくわからないので、次の章で具体例を使って解説していきます。
DataProviderの使い方
2つの文字列を連結させて期待通りになっているかのテストメソッドで考えてみます。
こんな感じになります。
1 2 3 4 5 6 7 |
public function test_concat1(): void { $expect_result = "aabb"; $str1 = "aa"; $str2 = "bb"; $this->assertEquals($expect_result, ($str1 . $str2)); } |
もっと引数にほかの値を入れてもテストしたい!となった場合、それぞれの値でのテストメソッドを作る必要があるので、こんな感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public function test_concat1(): void { $expect_result = "aabb"; $str1 = "aa"; $str2 = "bb"; $this->assertEquals($expect_result, ($str1 . $str2)); } public function test_concat2(): void { $expect_result = "ccdd"; $str1 = "cc"; $str2 = "dd"; $this->assertEquals($expect_result, ($str1 . $str2)); } public function test_concat3(): void { $expect_result = "eeff"; $str1 = "ee"; $str2 = "ff"; $this->assertEquals($expect_result, ($str1 . $str2)); } |
処理するところは同じなのに、入力値が異なるのでそれぞれテストメソッドを作る必要があります。
これは重複しまくりなので、保守が大変で読みやすいコードではないです。
こういうときにDataProviderが便利です!
まず、渡したい値のテストデータの配列を渡すメソッドを作成します。
(メソッド名に縛りはないです)
今回だとこんな感じになります。
1 2 3 4 5 6 7 8 |
public static function data_str() { return [ ["aabb", "aa", "bb"], ["ccdd", "cc", "dd"], ["eeff", "ee", "ff"] ]; } |
注意点は
1 |
public static |
で宣言することです。
次にテストメソッドを作成します。
コメントの箇所にdataProviderアノテーションを使って、テストデータの配列を渡すメソッド名を指定します。
配列の各要素をテストメソッドの引数として渡していきます。
なので、引数の数や順番にはご注意ください。
今回だとこんな感じになります。
1 2 3 4 5 6 7 |
/** * @dataProvider data_str */ public function test_concat1($expect_result, $str1, $str2): void { $this->assertEquals($expect_result, ($str1 . $str2)); } |
これでさっきの長~いテストメソッドと同じ意味になってます。
実行してみると、data_strメソッドで宣言している配列が渡されてテストできることが確認できます。
1 2 3 4 5 6 7 8 9 |
php artisan test tests\Unit\SampleTest.php PASS Tests\Unit\SampleTest ✓ concat1 with data set #0 ✓ concat1 with data set #1 ✓ concat1 with data set #2 Tests: 3 passed (3 assertions) Duration: 0.09s |
ちなみにテストコードの全体は、こんな感じになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php namespace Tests\Unit; use PHPUnit\Framework\TestCase; class SampleTest extends TestCase { /** * @dataProvider data_str */ public function test_concat1($expect_result, $str1, $str2): void { $this->assertEquals($expect_result, ($str1 . $str2)); } public static function data_str() { return [ ["aabb", "aa", "bb"], ["ccdd", "cc", "dd"], ["eeff", "ee", "ff"] ]; } } |
DataProviderがいかに、テストコードをスッキリさせたかが分かります。
まとめ:DataProviderを使ってみよう!
以上がPHPUnitのDataProviderの使い方の解説でした!
あなたのご参考になったのなら、とても嬉しいです(*´▽`*)
ではでは~(・ω・)ノシ
コメント