单元测试 - 编写测试代码

  • 作者: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方法。