ホームページ  >  記事  >  バックエンド開発  >  PHP 単体テストに PHPUnit を使用する_PHP チュートリアル

PHP 単体テストに PHPUnit を使用する_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-20 11:13:56713ブラウズ

PHPUnit は、PHP プログラミング言語で開発されたオープンソース ソフトウェアであり、単体テスト フレームワークです。 PHPUnit は Sebastian Bergmann によって作成され、Kent Beck の SUnit から派生したもので、xUnit ファミリのフレームワークの 1 つです。この記事では、PHPUnit について詳しく説明し、特に自動化された単体テストの基本的な使用法を紹介します。続行するには、PHP プログラミング言語の基本的な知識が必要です。

著者: Kendrick Curtis、Stainless Software、http://www.stainless-software.com/

はじめに

単体テストは、関数、クラス、メソッドのテストなど、個々のコード オブジェクトをテストするプロセスです。単体テストでは、作成済みの任意のテスト コードを使用することも、JUnit、PHPUnit、Cantata++ などの既存のテスト フレームワークを使用することもできます。単体テスト フレームワークは、自動検出ユニットの作成に役立つ一連の一般的で便利な関数を提供します。 . 、実際の値が期待値と一致するかどうかを確認するアサーションなど。単体テスト フレームワークには多くの場合、各テストのレポートが含まれており、カバーしたコード カバレッジが示されます。

PHP 単体テストに PHPUnit を使用する_PHP チュートリアル
PHP 単体テストに PHPUnit を使用する_PHP チュートリアル
昨日 (9:23) を翻訳しました

2いいね

いいね 素敵な翻訳ですね!

インストール

PHPUnit は通常、PEAR パッケージ、Composer バンドル、または PHAR ファイルの形式で存在します。これをインストールする場合は、最初に PHP コード カバレッジの依存関係をインストールする必要があります。 PEAR では、非常に高い phpunit.de チャネルが必要で、コマンド ライン経由で両方のパッケージをインストールします。

PHP Unit Testing with PHPUnit
(入力時点では、デフォルトの XAMPP PEAR インストールが壊れていることに注意してください。上記のコードを試す前に PEAR PHAR をインストールする必要があります)。

簡単なクラスをテストする

1 つのメソッドを含む単純なクラスを試してください:

1 class TruthTeller
2 {
3 public function() tellTruth
4 {
5 return true;
6 }
7 }

はい、現在、tellTruth メソッドは常に TRUE を返します。では、その戻り値が将来も変更されないことを確認するには、単体テストをどのように使用すればよいでしょうか?

PHP 単体テストに PHPUnit を使用する_PHP チュートリアル
PHP 単体テストに PHPUnit を使用する_PHP チュートリアル
昨日 (14:12) を翻訳しました

1いいね

いいね 素敵な翻訳ですね!

PHPUnit を使用する各テストセットは、判定などの共通機能を提供する PHPUnit_Framework_TestCase クラスの拡張クラスです。上記の TellTruth メソッドの基本的なテストは次のとおりです:
01 require_once 'PHPUnit/Autoload.php';
02 require_once 'TruthTeller.class.php';
03 class TruthTester extends PHPUnit_Framework_TestCase
04 {
05 function testTruthTeller()
06 {
07 $tt = new TruthTeller();
08 $this->assertTrue($tt->tellTruth());
09 }
10 }

PHPUnit のオートローダーと「テスト対象のオブジェクト」、この場合は TruthTeller クラス ファイルを含める必要があることに注意してください。

PHP 単体テストに PHPUnit を使用する_PHP チュートリアル
Yuanyuan Xiaoyi
昨日 (10:18) を翻訳しました

0いいね

いいね 素敵な翻訳ですね!

コマンドラインプロンプトを起動し、テストが配置されているディレクトリに切り替えて、phpunit TruthTester (パラメータはテストファイルの名前から .php 拡張子を除いたものです) を実行すると、PHPUnit は見つけられるすべてのテストを実行します。 (テストは名前が test で始まるすべてのメソッドになります)。

PHP Unit Testing with PHPUnit

TruthTeller クラスに戻り、そのメソッドの戻り値を FALSE に変更すると、次のようなメッセージが表示されます。

PHP Unit Testing with PHPUnit

これは単体テストの中核です - アサーションを作成し、それが合格するかどうかを判断することです。以前に作成してテストしたコードが失敗し始めると、変更されたコードが既存のコードに悪影響を与えることがわかります。

PHP 単体テストに PHPUnit を使用する_PHP チュートリアルPHP 単体テストに PHPUnit を使用する_PHP チュートリアル
昨日(14:22)翻訳しました

0いいね

いいね 素敵な翻訳ですね!

より複雑なテスト 実際には、前回よりもさらに複雑な状況に対処する必要があることは間違いありません。たとえば、一般的なテストは、以下の OutputArray メソッドが特定のデータ構造の配列を返すかどうかを確認することです。

1 class ArrayTeller
2 {
3 public function outputArray()
4 {
5 return array(1,2,3);
6 }
7 }

このメソッドの簡単なテストは次のように記述できます:

01 class ArrayTester extends PHPUnit_Framework_TestCase
02 {
03 function testArrayTeller()
04 {
05 $at = new ArrayTeller();
06 $result = $at->outputArray(1);
07 $this->assertInternalType("array", $result);
08 $this->assertCount(3, $result);
09 $this->assertEquals(1, $result[0]);
10 $this->assertEquals(3, $result[2]);
11 }
12 }

ご覧のとおり、単体テストに PHPUnit を使用する場合、各行でさまざまなチェックを実行できます。ArrayTeller が他のデータ クラスではなく配列を返すかどうかをチェックできます。 type; 配列の長さをチェックできます; 配列内の単一の値をチェックできます。これらに加えて、他の関数アサーションもあります。たとえば、より複雑な判断が必要な場合、戻り値が 2 つの整数の間にあるかどうかを知りたいとします。 数値の範囲内で、IF ステートメントの結果で表現できる限り、アサーション AssertTrue を使用して結果をテストできます。次のリンクをクリックすると、PHPUnit 公式 Web サイトのドキュメントで利用可能なすべてのアサーションのリストにアクセスできます。

PHP 単体テストに PHPUnit を使用する_PHP チュートリアル
Zhao Liang-I
昨日(14:25)翻訳しました

0いいね

いいね 素敵な翻訳ですね!

その他の翻訳(1)
テストコードのパス

簡単に言うと、単体テストとは、できれば仕様書に基づいて、テスト対象のメソッドの予想される動作をすべてカバーするテストを作成することを意味します。ただし、既存のコードをカバーする単体テストを作成する場合は、次のように考えるとより便利です。ホワイトボックステストの一種。以下のような簡単な切り替え方法を知っている場合:

01 class Switcher
02 {
03   public function aOrB($switch, $a, $b)
04   {
05     if ($switch == TRUE)
06     {
07       return $a;
08     }
09     else
10     {
11       return $b;
12     }
13   }
14 }

… 状況ごとに 1 つずつ、合計 2 つのテストを作成する必要があることがわかります。しかし、どうやってこれを知るのか疑問になり始めます。後でメソッドが True になった場合は $a を返し、False になった場合は $b を返します。それ以外の場合は例外をスローします。仕様ドキュメントのどこかに記載されているのが理想的です。とにかく、上記のメソッドのテストは次のとおりです:

01 class SwitcherTester extends PHPUnit_Framework_TestCase
02   {
03     function testSwitchTrue()
04     {
05       $switcher = new Switcher();
06       $result = $switcher->aOrB(TRUE, 1, 2);
07       $this->assertEquals(1, $result);
08     }
09     function testSwitchFalse()
10     {
11       $switcher = new Switcher();
12       $result = $switcher->aOrB(FALSE, 1, 2);
13       $this->assertEquals(2, $result);
14     }
15 }

両方のテストの実行は、コマンドラインから phpunit SwitcherTester を実行するのと同じくらい簡単です。

PHP 単体テストに PHPUnit を使用する_PHP チュートリアル
PHP 単体テストに PHPUnit を使用する_PHP チュートリアル
昨日 (14:46) を翻訳しました

0いいね

いいね 素敵な翻訳ですね!

setUp を使用して複数のテストを簡素化する

テストでさらに多くの入力の組み合わせとデータ設定をカバーする必要がある場合、関数 setUp を使用すると非常に役立ちます。セットアップはい PHPUnit_Framework_TestCase クラス内のすべてのテストが実行される前に実行するようにオーバーライドできるクラス内のコード。 (すべてのテストが終了した直後に実行される簡単なメソッド、tearDown もあることに注意してください。これは、テストを終了するのに役立ちます ソケットとファイル ポインタが役立ちます)

以下は、コードを合理化する方法の簡単な例です。オブジェクト データと入力に依存する方法を試してください。

01 class DataTeller
02   {
03   private $data;
04   public function __construct($data)
05   {
06     $this->data = $data;
07   }
08   public function outputData($switch)
09   {
10     if ($switch == TRUE)
11     {
12       if (!empty($this->data))
13         return $this->data;
14       else
15         return FALSE;
16     }
17     else
18     {
19       return "switch off";
20     }
21   }
22 }

以前の単純なアプローチを続ける場合は、テストごとに 1 回ずつ、3 つのテストを作成し、3 つの DataTeller オブジェクトをインスタンス化する必要があります。ただし、 setUp を実行すると、3 つのうち少なくとも 2 つである DataTellers オブジェクトの作成を外部委託できます。最後のテストのみ、新しい DataTeller を作成する必要があります。

01 class DataTellerTester extends PHPUnit_Framework_TestCase
02 {
03   private $dt;
04   protected $data = "valid data";
05   function setUp()
06   {
07     $this->dt = new DataTeller($this->data);
08   }
09   function testOutputArraySwitchOff()
10   {
11     $this->assertEquals("switch off", $this->dt->outputData(FALSE));
12   }
13   function testOutputArraySwitchOn()
14   {
15     $this->assertEquals($this->data, $this->dt->outputData(TRUE));
16   }
17   function testOutputArrayEmptySwitchOn()
18   {
19     $new_dt = new DataTeller("");
20     $this->assertEquals(FALSE, $new_dt->outputData(TRUE));
21   }
22 }
PHP 単体テストに PHPUnit を使用する_PHP チュートリアル
PHP 単体テストに PHPUnit を使用する_PHP チュートリアル
昨日 (15:03) を翻訳しました

0いいね

いいね 素敵な翻訳ですね!

結論

PHPUnit はアサーションを使用して、テストしているコードが期待どおりに動作しているかどうかを通知します。これを学習すると、比較的独立した関数を持ついくつかのクラスをカバーするための簡単なテストをいくつか作成できるようになります。 しかし、本当の課題は、相互に対話するクラスをテストするときに起こります。これを行うには、次のチュートリアルを聞いて、静的クラスのテストの作成方法とモックの使用方法を学びます。 スタブ (スタブ、スタブ) は、テストするオブジェクトをその環境内の他のコードから分離します。

多読

* PHPUnit マニュアル
* PEAR サイトの PHPUnit チュートリアル

著者について

Kendrick Curtis は 10 年の経験を持つ Web 開発者です。彼は、受託 Web デザイン、開発、テスト、コンテンツ作成を提供する会社、Stainless Software の創設者です。詳細については、同社の Web サイトをご覧ください: http://www.stainless-software.com/

www.bkjia.com本当http://www.bkjia.com/PHPjc/440325.html技術記事 PHPUnit は、PHP プログラミング言語で開発されたオープン ソース ソフトウェアであり、単体テスト フレームワークです。 PHPUnit は Sebastian Bergmann によって作成され、Kent Beck の SUnit から派生したもので、xUnit ファミリのフレームワークの 1 つです。 ...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。