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

Source: https://habr.com/ru/post/J252489/


All Articles