私はファイル全体の内容に対して複数のテストケースを実行したいと思います。私は自分のファイルをロードし、このようなすべてのテストで同じプロバイダを使用するために、データプロバイダを使用することができます。phpunit:reusing dataprovider
class mytest extends PHPUnit_Framework_TestCase {
public function contentProvider() {
return glob(__DIR__ . '/files/*');
}
/**
* @dataProvider contentProvider
*/
public function test1($file) {
$content = file_get_contents($file);
// assert something here
}
...
/**
* @dataProvider contentProvider
*/
public function test10($file) {
$content = file_get_contents($file);
// assert something here
}
}
もちろん、それは私が10のテストケースを持っている場合、各ファイルは10回ロードされることを意味します。
データプロバイダを調整してすべてのファイルをロードし、すべてのコンテンツを含む1つの大きな構造を返すようにできました。しかし、プロバイダーはテストごとに個別に呼び出されるため、各ファイルが10回読み込まれ、同時にすべてのファイルが同時にメモリに読み込まれることを意味します。
もちろん、10回のテストを10回のアサーションで1回のテストに集約することはできますが、最初のアサーションが失敗した直後に中断してしまいます。
私はデータプロバイダもイテレータを返すことができることを知っています。しかし、phpunitは各テストごとに別々にイテレータを再実行し、各ファイルを10回ロードしているようです。
phpunitをイテレータで一度だけ実行させ、各テストに結果を渡すような巧妙な方法がありますか?
これは静的に保存されていますしかし、それは同時に私がメモリ内のすべてのファイルの内容を同時に持つことを意味します。理想的ではない。 –
@AndreasGohr:あなたが望むのは、各ファイルのテストクラスのすべてのテストを実行することです。しかし、ファイルごとにファイルを作成し、テストではなく、すべてのテストに対して各ファイルに一度メモリを割り当て/解放します。これにより、各ファイルに対して1回だけメモリを割り当て/解放し、同時に1つのファイルをメモリに保存することができます。これは、テストクラス全体に適用されたデータプロバイダのようです。テスト方法だけでなく、 –
@AndreasGohr:TestSuiteクラスの[createTest()メソッド](https://github.com/sebastianbergmann/phpunit/blob/218eb7494c010b6f5a6343e9bca9fa9212664b50/src/Framework/TestSuite.php#L549)に示されているように、テストが実行される前にプロバイダーが保管されます。したがって、最初のテストが実行されると、[current()](http://php.net/)の各呼び出しで現在のファイルの内容を読み取るイテレータを使用しても、プロバイダによって返されたすべてのデータが既にインスタンス化されていますmanual/en/iterator.current.php)メソッドを使用します。 PHPUnitを使用したソリューションはありません。 –