ホームページ > バックエンド開発 > PHPチュートリアル > PHP 単体テスト ツール PHPUNIT 詳しい使い方 (3) ページ 1/2_PHP チュートリアル

PHP 単体テスト ツール PHPUNIT 詳しい使い方 (3) ページ 1/2_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:31:11
オリジナル
929 人が閲覧しました

在本文中,笔者将为大家介绍phpunit中的两个高级概念和用法,尽管它不一定在你的日常单元测试中都用到,但理解和学会它们的用法对学习phpunit还是十分重要的。

  Phpunit中的Annotations

  如果有其他编程语言经验的开发者,应该对Annotations(注解)不陌生,其实在phpunit中,一个简单的如下面的一段注释也可以认为是Annotations:

php
class MyTestClass extends PHPUnit_Framework_TestCase
{
/**
* Testing the answer to “do you love unit tests?”
*/
public function testDoYouLoveUnitTests()
{
$love = true;
$this->assertTrue($love);
}
}
?>

   可以看到,其实一段以/** **/为标记的文字,就可以认为是一种Annotations,但Annotations其实不单单是简单的注释,它是与一个程序元素相关联信息或者元数据的标注,它不影响程序的运行,但相关的软件工具或框架能够将其转换成特殊的元数据标记,以方便开发者以更少的代码去提高效率(比如通过。如果你熟悉Java,则会发现在Java SE 5中及象Spring等框架中,都大量使用了Annotations。

  然而,由于php并不象Java那样是编译性语言,因此本身缺乏去解析Annotations的机制,但幸好phpunit去提供了这样的功能,我们以下面的代码为例:

php
class MyMathClass
{
/**
* Add two given values together and return sum
*/
public function addValues($a,$b)
{
return $a+$b;
}
}
?>

   上面的只是一个简单的加法的例子,为此,我们使用Annotations去编写一个单元测试,在上两篇文章中,我们采用的是手工编写单元测试的方法,而本文中,将介绍使用phpunit命令行的方法,自动生成单元测试的框架,方法如下:

  首先把上面的类保存为MyMathClass.php,然后在命令行下运行如下命令:

phpunit –skeleton-test MyMathClass

   这时phpunit会自动生成如下的框架单元测试代码:

php
require_once '/path/to/MyMathClass.php';
/* *
* のテストクラスMyMathClass.
* 2011-02-07 12:22:07 に PHPUnit によって生成されました。 PHPUnit_Framework_TestCase
{
/*
*
* @var MyMathClass*/

protected
$object
;
/* *
* フィクスチャーをセットアップします。たとえば、ネットワーク接続を開きます。
* このメソッドは、テストが実行される前に呼び出されます。*/
protected
function
setUp()
{
$this
->
オブジェクト =
新しい
MyMathClass;
}
/**
* Tears down the fixture, for example, closes a network connection.
* This method is called after a test is executed.
*/
protected function tearDown()
{
}
/**
* @todo Implement testAddValues().
*/
public function testAddValues()
{
// Remove the following lines when you implement this test.
$this->markTestIncomplete(
'This test has not been implemented yet.'
);
}
}
?>

   可以看到,phpunit为我们生成的单元测试代码自动引入了原来的MyMathClass.php,同时也生成了setUp和tearDown方法,但唯一的核心单元测试代码是留给了我们编写。如果想在这个基础上更快速的生成我们想要的单元测试代码,要如何实现呢?没错,就是使用annotations!我们可以在原来的MyMathClass.php中加入如下的annotations。

php
class MyMathClass
{
/**
* Add two given values together and return sum
* @assert (1,2) == 3
*/
public function addValues($a,$b)
{
return $a+$b;
}
}
?>

  然后再象上述一样在命令行运行:

  phpunit –skeleton-test MyMathClass

  这个时候会为我们生成如下的单元测试代码:

php
/**
* Generated from @assert (1,2) == 3.
*/
public function testAddValues()
{
$this->assertEquals(
3,
$this->object->addValues(1,2)
);
}
?>

  看到了么?我们在原有的类中加入了注解@assert(1,2)==3,则phpunit自动为我们生成了正确的单元测试代码。当然,可以参考phpunit手册,学习到更多的关于@assert注解使用的规则。

  下面再举一个例子来讲解annotations。假设我们的程序中的一个方法,只是仅需要数据的输入,并且不依赖XML或者数据库提供数据源,则为了测试这个方法,我们可能想到的一个方法是在程序中设置一个测试数据集去测试,但这里介绍一个比较简单的方法,就是使用注解@dataProvider,修改MyMathClass.php如下:

php
/**
* 以下のテストメソッドのデータプロバイダー
*/
public 静的 関数プロバイダー()
{
return array(
array(1,2 3)
配列(4,2,6),
配列(1,5 7)
);
}
/**
* Testing addValues returns sum of two values
* @dataProvider provider
*/
public function testAddValues($a,$b,$sum)
{
$this->assertEquals(
$sum,
$this->object->addValues($a,$b)
);
}
?>

   可以看到,这里使用了注解@dataProvider,指明了测试用例的数据提供者是由provider方法返回的一个数组。所以在单元测试时,数组中的第0个元素则会赋值给$a,第1个元素则会赋值给b,第3个元素则会赋值给sum,可以看到,上面的第3个数组提供的数据是不能通过单元测试的,因为1+5不等于7。

  此外,这里还简单介绍两个常用的annotations,比如@expectedException注解可以测试代码中是否正确抛出了异常,比如:

phprequire_once 'PHPUnit/Framework.php';
class ExceptionTest extends PHPUnit_Framework_TestCase{
/**
* @expectedException InvalidArgumentException
*/
public function testException() {
}
}

?>

ここでは、アノテーション メソッドを使用して、testException でスローされる必要がある例外の種類が InvalidArgumentException であることを示します。

もう 1 つは @cover アノテーションです。その機能は、phpunit が次のようなテスト コードのみを生成するクラス内のメソッドまたはスコープを識別することです。

#div_code img{border:0px;}*/

public

function
testMethod()
method();}
次に、phpunit は、SampleClass クラスの publicMethod メソッド、SampleClass クラスのすべての非 public 宣言メソッド、および HelperClass クラスまたはその親クラスの 1 つの単体テスト コードのみを生成します。
http://www.bkjia.com/PHPjc/323097.html
www.bkjia.com
tru​​ehttp://www.bkjia.com/PHPjc/323097.html技術記事この記事では、著者が phpunit の 2 つの高度な概念と使用法を紹介します。日常の単体テストでは使用されないかもしれませんが、その使用法を理解して学習することは学習にとって非常に重要です...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート