もちろん、完全なスプレッドシートを使用してください!
私たちは次のことに同意します:
- 各テストファイルには独自のデータファイルがあります( CSVファイルの束ではなく、1つだけです)
- ファイル内のデータは個別のページに保存され、テストごとに1つ、ページの名前はテストの名前と一致します(これがすべての理由でした)
そして、ポイント(最小テキスト、最大コード)を見てみましょう。すべてのコードは、ノートの下部にあるリンクからも入手できます。
ステップ#1:依存関係
必要になります(
composer.json
):
{ "name": "PHPUnitSpreadsheetDataProvider", "require": { "php": ">=5.5.0", "phpunit/phpunit": "4.5.*", "phpoffice/phpexcel": "1.8.*" }, "autoload": { "classmap": [ "src/" ] } }
ステップ#2:基本的なロジック
すべては、ファイルからデータを受信し、テスト用のデータソースに変換する独自のメソッドを追加することです。
受信中:
<?php // PHPUnitTestCase.php trait PHPUnitSDP_PHPUnitTestCase { /** * @var PHPExcel_Reader_IReader|PHPExcel_Reader_Abstract */ private $_reader; /** * . * * @param string $resource * * @return string */ protected function getTestResource($resource = null) { $path = (new ReflectionClass($this))->getFileName(); $dirname = pathinfo($path, PATHINFO_DIRNAME); $filename = pathinfo($path, PATHINFO_FILENAME); $resource = $resource ?: 'xml'; return "{$dirname}/{$filename}.{$resource}"; } /** * . * * @param string $test * * @return array|Iterator */ public function getTestDataProvider($test) { // $position = 2; $resource = $this->getTestResource('data.ods'); // Reader? if (is_null($this->_reader)) { $this->_reader = PHPExcel_IOFactory::createReaderForFile($resource); } // $this->_reader->setReadDataOnly(true); $this->_reader->setLoadSheetsOnly($test); // return new PHPUnitSDP_PHPExcelWorksheetRowIterator( $this->_reader->load($resource)->getActiveSheet(), $position); } }
2つのポイントに注意する必要があります(残りは明らかです)。
-
$position = 2;
-データを含む最初の行(番号は1から始まります)、コメントの前に使用できるすべてのもの(以下の例を参照) -
$resource
-データファイルの名前を定義します。この場合、「.data.ods
」
変換:
<?php // PHPExcelWorksheetRowIterator.php class PHPUnitSDP_PHPExcelWorksheetRowIterator extends PHPExcel_Worksheet_RowIterator { /** * @return array */ public function current() { $current = array(); foreach (parent::current()->getCellIterator() as $cell) { /* @var $cell PHPExcel_Cell */ $current[] = $this->getValue($cell->getCalculatedValue()); } return $current; } /** * @param mixed $value * * @return mixed */ protected function getValue($value) { switch (mb_strtolower(trim($value))) { case 'null': $value = null; break; case 'true': $value = true; break; case 'false': $value = false; break; default: /* empty */ break; } return $value; } }
機能のうち、セルで数式を使用する可能性に注目する価値がありますが、値を変換する別の方法を拒否することはできません-最初に、すべてのデータ型が必要な関数(同じ
NULL
)を持っているわけではなく、次に、数式の計算に時間とリソースがかかります
ステップ#3:データ
ステップ#4:テスト
// SDPTest.php class SDPTest extends PHPUnit_Framework_TestCase { use PHPUnitSDP_PHPUnitTestCase; /** * @dataProvider getTestDataProvider * * @param number $base * @param number $exp * @param number $expected * * @return void */ public function testPow($base, $exp, $expected) { $this->assertEquals($expected, pow($base, $exp)); } /** * @dataProvider getTestDataProvider * * @param number $arg * @param number $expected * * @return void */ public function testSqrt($arg, $expected) { $this->assertEquals($expected, sqrt($arg)); } }
すべての魔法はアノテーション
@dataProvider getTestDataProvider
囲まれてい
@dataProvider getTestDataProvider
-テストを開始する前に、PHPUnitは、テストの名前を含み、必要なデータソースを取得する引数で、以前に定義されたメソッド
PHPUnitSDP_PHPUnitTestCase::getTestDataProvider()
を呼び出します
ステップ5:結果
PHPUnitSpreadsheetDataProvider> phpunit PHPUnit 4.5.0 by Sebastian Bergmann and contributors. Configuration read from PHPUnitSpreadsheetDataProvider/phpunit.xml ......F Time: 158 ms, Memory: 8.75Mb There was 1 failure: 1) SDPTest::testSqrt with data set #4 (4.0, 3.0) Failed asserting that 2.0 matches expected 3.0. PHPUnitSpreadsheetDataProvider/tests/SDPTest.php:28 phar://PHPUnitSpreadsheetDataProvider/phpunit.phar/phpunit/TextUI/Command.php:152 phar://PHPUnitSpreadsheetDataProvider/phpunit.phar/phpunit/TextUI/Command.php:104 FAILURES! Tests: 7, Assertions: 7, Failures: 1.
おわりに
このレシピが誰かに役立つことを願っています:)
プロジェクト: yadi.sk/d/AyegnPCqf7i9Y