上篇日记中我介绍了phpunit的配置方法,今天就开始介绍如何用PHPUnit来编写测试用例,下面我来引入一个测试PHP数组操作的测试用例,这个例子会给你展示PHPUnit常规的用法和测试用例编写的步骤。当前目标主要是对PHPUnit的基本使用有一个大概的了解,类似开发程序教程中的Hello World程序,知道程序怎么写,怎么去运行。
编写一个栈测试的例子的步骤:
1. 定义一个测试类StackTest保存于StackTest.php中
2. 这个类继承于PHPUnit_Framework_TestCase
3. 定义类中的测试方法,类的所有的测试用例方法需要用test开头,当然,你也可以在使用@test注释来定义一个名字不为test开头的方法为测试方法
4. 在这些测试方法中,我们需要使用断言方法(assertion methods)如assertEquals()来断言实际传入的参数和期待的参数的值相同来达到测试的目的.
下面我们来看代码:
例子代码中我使用断言方法assertEquals来断言我期待$stack相关的值
注意代码中高亮的方法indexEquals,它并没有使用test开头,但是我在注释中增加了@test标签,那么phpunit依然会将其作为一个测试方法运行,下面我们来运行方法和运行结果
进入命令行,使用phpunit StackTest来执行StackTest.php的测试,运行结果如下:
.F 表示执行完毕且出现断言失败
Time: 0 seconds, Memory: 5.50Mb
表示执行时间为0秒,使用5.50MB内存
There was 1 failure:
这里有一个失败
1) StackTest::indexEuqals
StackTest类的indexEquals方法
Failed asserting that <integer:1> matches expected <integer:2>.
断言值为2但是传入的值却是1
/home/colt/workspace/PHP/test/StackTest.php:28
FAILURES!
Tests: 2, Assertions: 6, Failures: 1.
执行了2个测试,共6个断言,失败1
由于我们在indexEquals断言$stack索引0的值为2,但是实际上值的是1,所以这个断言没有通过测试并向我们报告了失败。
本例子通过一个简单易懂的测试类解开测试的神秘面纱:
通俗的讲,单元测试就是在测试用例类中,定义一系列的测试方法,在方法中使用断言(assert)来测试你程序中的相关函数、类、接口、过程的执行结果是否和你预期的是一样的,如果某个部分的执行结果没有与你期待的结果相同,PHPUnit就会向你报告问题,你也可以方便的根据报告确认和修复程序中的Bug。针对你的程序写好详细的完整单元测试,你就不用每次完成一个新功能后逐个的测试你软件的所有功能,而且在程序发布之前,你至少可以通过测试消灭大部分的内部逻辑Bug和缺陷。同样,你在之后的维护开发中,如果在某个功能的修改中不小心改坏了与其相关连的其他模块,那么先前完善的单元测试也会向你报告出相关的问题让你及时发现和修复问题。