初心者から初心者までのユニットテスト

こんにちは。

この投稿は私に記事を書くよう促しました。 ツールの説明といくつかの理論情報を提供します。

私自身はユニットテストとテスト全般を理解し始めたばかりなので、この問題に関するいくつかの情報を共有することにしました。 また、知識とスキルを整理します。 さらに言えば、インターネット上のどこにも噛み付いた記述を見つけられなかったので、テストプロセスを簡単なフィリピン語で段階的に説明しようとします。 興味のある人、誰でも同じように理解したい人は誰でも、歓迎します。

つまり、自動化されたテストと単体テストについては書いていません。これにはウィキペディアがあります。

テストでは、おそらく最も人気のあるフレームワークPHPUnitを使用します。 最初にインストールする必要があります。 これを行う最も簡単な方法は、PEARを使用することです。 これを行う方法は、ドキュメントに記載されています。 2つのコマンドが使用されます( ドキュメントから ):

pear config-set auto_discover 1 pear install pear.phpunit.de/PHPUnit 


当然、PEARへのパスはPATHで綴られる必要があります。 必要なファイルがロードされると、PHPUnitはコードをテストする準備が完全に整います。

ロックしましょう


それでは始めましょう。 ある種のデータモデルを考えてみましょう。 文字列と数値の2つの属性があります。 セッターメソッドと、値を(ファイルに)保存およびロードするメソッドがあります。

TestModel.php
 class TestModel { public $num; public $str; public function setAttributes($i, $s) {} /* @return: true,    false,    */ public function saveData() {return false;} /* @return: true,       false,    */ public function loadData() {return false;} } 

クラスの基本的なメソッドと属性を定義しました。 私たちの場所では何も読み書きされないため、条件によってfalseを返します。

属性にいくつかの人為的な制限を導入します。

もちろん、実際のプロジェクトではより多くの制限がありますが、初心者には十分です:)

次に、モデルをしばらく延期し、テストを開始します。 テストは、基本クラス(この場合はPHPUnit_Framework_TestCase)から継承された通常のクラスです。 このクラスのメソッドはテストです。 テスト用のユニットフォルダーを作成します。

ユニット/ TestModelTest.php:
 require_once 'PHPUnit/Autoload.php'; class TestModelTest extends PHPUnit_Framework_TestCase { function testTrue() { $this->assertTrue(true); } } 


TestModelTestは、TestModelクラスのテストクラスです。
testTrue()はテスト自体です。 その中で、特定のケースのシナリオを定義します。 このテストでは、trueがtrueであることを確認します:)これはassertTrueメソッド(assert-assert)を使用して行われます。 つまり 真実は真実だと主張します。
テストを実行します。 PHPUnitは、すべてのテストが存在するフォルダーを指定するだけです。
 phpunit unit 

取得するもの:
 PHPUnit 3.6.10 by Sebastian Bergmann. . Time: 0 seconds, Memory: 2.75Mb OK (1 test, 1 assertion) 

ほら、テストが動作します! さらに進みます。

TDD

TDD-テスト駆動開発-大まかに言って、最初にテストを記述し、次にそれらに基づいて徐々にメインクラスを記述するアプローチ。 ウィキペディアの詳細。 このように行きましょう。 すでにモジュールフレームワークがあります。 要件も。 次に、要件に基づいてテストケースを作成します。

ユニット/ TestModelTest.php:
 <?php require_once 'PHPUnit/Autoload.php'; require_once dirname(__FILE__).'/../TestModel.php'; class TestModelTest extends PHPUnit_Framework_TestCase { // ,       function testStringCannotBeEmpty() { $model=new TestModel; $model->setAttributes(15,''); $this->assertFalse($model->saveData()); // ,      ! $model->setAttributes(15,'aaaa'); $this->assertTrue($model->saveData()); //   } //  10<i<20 function testIntMustBeGreaterThanTenAdnSmallerThanTwenty() { $model=new TestModel; /*   */ $model->setAttributes(2,'test1'); $this->assertFalse($model->saveData()); $model->setAttributes(10,'test2'); $this->assertFalse($model->saveData()); $model->setAttributes(20,'test3'); $this->assertFalse($model->saveData()); $model->setAttributes(25,'test4'); $this->assertFalse($model->saveData()); /*   */ $model->setAttributes(15,'test5'); $this->assertTrue($model->saveData()); } //  / function testSaveLoad() { $i=13; $str='test'; $model=new TestModel; $model->setAttributes($i,$str); $this->assertTrue($model->saveData()); //  $fetchModel=new TestModel; $this->assertTrue($fetchModel->loadData()); //  //     $this->assertEquals($fetchModel->num,$i); $this->assertEquals($fetchModel->str,$str); } } 


3つの方法すべてで3つのケースを説明しました。 それぞれ自分の。 次に、テストを実行します。

 PHPUnit 3.6.10 by Sebastian Bergmann. FFF Time: 0 seconds, Memory: 2.75Mb There were 3 failures: 1) TestModelTest::testStringCannotBeEmpty Failed asserting that null is false. ... 2) TestModelTest::testIntMustBeGreaterThanTenAdnSmallerThanTwenty Failed asserting that null is false. ... 3) TestModelTest::testSaveLoad Failed asserting that null is true. ... FAILURES! Tests: 3, Assertions: 3, Failures: 3. 


くそー! まあ、何も、そうではないはずです:)では、モデルにコードを追加しましょう。

ユニット/ TestModelTest.php:
 class TestModel { public $num; public $str; public $fname="file.txt"; public function setAttributes($i, $s) { $this->num=(int)$i; $this->str=$s; } public function saveData() { $h=fopen($this->fname,'w+'); $res=fputs($h, $this->str."\r\n".$this->num); fclose($h); return (bool)$res; } public function loadData() { $arr=file($this->fname); if ($arr==false) return false; list($this->str,$this->num)=$arr; return (bool)$arr; } } 

コードで難しいことは何もないと思います。

テストを実行します。
 There were 3 failures: 1) TestModelTest::testStringCannotBeEmpty Failed asserting that true is false. ... 2) TestModelTest::testIntMustBeGreaterThanTenAdnSmallerThanTwenty Failed asserting that true is false. ... 3) TestModelTest::testSaveLoad Failed asserting that two strings are equal. --- Expected +++ Actual @@ @@ -'test - -' +'test' FAILURES! Tests: 3, Assertions: 6, Failures: 3. 


すでに良い。 すでに2倍のチェックに合格しています。 順番に行きましょう:
1. testStringCannotBeEmpty。 文字列を空にすることはできません。 チェックを追加します。
  public function saveData() { if (!strlen($this->str)) return false; ...... } 

2. testIntMustBeGreaterThanTenAdnSmallerThanTwenty。 条件10 <x <20。 検証:
  public function saveData() { if (!strlen($this->str)) return false; if ($this->num<10 || $this->num>20) return false; ...... } 

3. testSaveLoad。 うん! もう1つの間違いは、一見すると気づきにくいことです。 書き込まれた行は、読み取られた行と等しくありません。 それはすべて行末にあります。 ドキュメントにアクセスして、FILE_IGNORE_NEW_LINESフラグを読んでください。
修正中です。
  public function loadData() { $arr=file($this->fname, FILE_IGNORE_NEW_LINES); .... } 

(ネタバレ:条件2は特に満たされない)

実行:
 There was 1 failure: 1) TestModelTest::testIntMustBeGreaterThanTenAdnSmallerThanTwenty Failed asserting that true is false. TestModelTest.php:30 C:\Program Files\php\phpunit:46 FAILURES! Tests: 3, Assertions: 8, Failures: 1. 

46行目(私にとって)を見てください:$ model-> setAttributes(20、 'test3'); 極端なケースは考慮しませんでした! 修正します:
  public function saveData() { if (!strlen($this->str)) return false; if ($this->num<=10 || $this->num>=20) return false; ...... } 


テストを実行します。
 Time: 0 seconds, Memory: 2.75Mb OK (3 tests, 11 assertions) 

やれやれ、3つのテストはすべて合格しました。 このモデルは要件を満たしています。 必要でした:)

おわりに


この記事は、完全な単体テストガイドではなく、TDDマニュアルであることを主張しています。 この記事の目的は、主にこの分野の私の(初心者)知識を体系化することです。 そして、自動テストの深い世界に飛び込むための初期援助として誰かが助けることを本当に望んでいます。
ご清聴ありがとうございました。

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


All Articles