单元测试 - 编写测试代码 ¶
作者:KK
发表日期:2015.12.13
那么打开E:\project1-tests\tests\unit\HelloWorldTest.php
吧,通过之前的命令生成出来的测试用例呢,里面是已经自带了一些代码的,大概如下:
其中有一个testMe的公共方法,我们在这个方法里执行$this->assertTrue(2 == 2);
然后运行测试用例,怎么运行?命令如下:
php E:\codecept.phar run unit HelloWorldTest
运行后它会输出很多行信息,当然也不超过半个屏幕,最后一句话是这样的:
Codeception PHP Testing Framework v2.0.9
Powered by PHPUnit 4.4.0 by Sebastian Bergmann.
Project1_tests.unit Tests (1) -------------------------------------------------
Trying to test m1 (project1_tests\HelloWorldTest::testM1) Ok
---
Time: 455 ms, Memory: 4.25Mb
OK (1 test, 1 assertion)
这些信息中说明了当前的单元测试框架版本,运行了哪个项目的哪个单元测试,是否成功和时间/内存使用统计等,以后你运行单元测试也会看到这样的输出。
重点是看最后一行OK (1 test, 1 assertion)
,表示运行了1个测试用例和执行了1个断言,这是测试正常的表现特征。
*以后引术运行后输出测试结果时我都只会引述最后输出的部分,前面那些版本信息呀,运行哪个用例呀那些就忽略掉了哦。
让命令简短一点吧 ¶
啊哦……这里我们暂停一下,你说吧,老是敲php E:\codecept.phar run
这个东西是不是很烦?教你,在设置环境变量的窗口里点击当前用户变量区域下的"新建"啥的(没必要设置成系统变量,所以不用去系统变量里新建,除非你真的喜欢),看下图吧我已经没力打字了……
然后重启cmd会话,还是要切换到测试项目目录
你就可以这样玩命令了:
%ceptRun% unit HelloWorldTest
就是利用%ceptRun%
这个变量来代替之前那个命令的一部分吧,用linux的同学就创建命令别名就行了你懂的。
言归正转 ¶
然后我们将上面testMe
方法里的2 == 2
表达式改成1 == 2
,重新运行测试后就会输出:
FAILURES!
Tests: 1, Assertions: 1, Failures: 1.
表示测试不通过,运行了1个测试脚本,1次断言,并且产生了1次失败断言,如果你是第一次接触单元测试的话可能还没感觉到什么。
首先致了解单元测试的同学们:这里的代码$this->assertTrue
方法跟PHPUnit一样,当然还有$this->assertEqual
,$this->assertInstanceof
等方法了,因为这是完全兼容PHPUnit的。
接下来要跟第一次接触单元测试的同学们讲讲这个,比如assertTrue
方法,这是一个断言方法(只要是assert
开头的方法都是),根据单元测试的API说明,我们必须至少传递一个结果为true
的变量或者表达式进去,如果不是true
的话,它就会在测试结果的报告里标注上累加1次失败的断言记录。
接下来试试,删除测试用例里的testMe
方法,把以下几个方法粘贴进去(顺便你先看看代码)。
public function testM1(){
$this->assertTrue(false); //传的参数不是true,断言失败
}
public function testM2(){
$isOK = false;
$this->assertTrue($isOK); //你换汤不换药咋行?不还是传了个false进去?失败!
}
public function testM3(){
$isOK = time() < 0; //呵呵,当前时间戳肯定不小于0,不成立,于是这个比较运算得到结果是false
$this->assertTrue($isOK); //你又换汤不换药了亲!
}
public function testM4(){
$this->assertTrue(time() < 0); //后果你懂的
}
public function testM5(){
$this->assertTrue(time() > 0); //好,恭喜你这次成功了!
$this->assertTrue(false); //又失败了
}
准备好了吧,跑一趟,得出以下结果:
FAILURES!
Tests: 5, Assertions: 6, Failures: 5.
意思是:
Tests: 5
运行了5次测试(分别是5个测试方法)。Assertions: 6
运行了6个断言(就是执行了6次名字是assert
开头的方法)。Failures: 5
有5次断言是失败的。
好了,到此你已经知道,我们必须将一个最终结果为true
的东西传给assertTrue
方法。