PHPUnit:データプロバイダーとしてのスプレッドシート

PHPUnitのドキュメントには、テストに大量のデータを提供できるデータプロバイダー専用の小さなセクションがあり、そのすぐ下にCSVファイルのデータソースの例さえあります。





もちろん、完全なスプレッドシートを使用してください!



私たちは次のことに同意します:



そして、ポイント(最小テキスト、最大コード)を見てみましょう。すべてのコードは、ノートの下部にあるリンクからも入手できます。



ステップ#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つのポイントに注意する必要があります(残りは明らかです)。

  1. $position = 2;



    -データを含む最初の行(番号は1から始まります)、コメントの前に使用できるすべてのもの(以下の例を参照)
  2. $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



All Articles