自动化测试开发 - 尝试一个测试

  • 作者:KK

  • 发表日期:2016.11.20


我们继续完善在引入Yii2里创建的UrlTest用例:

public function testMe()
{
	$urlReflection = new ReflectionClass(UrlValidator::className());
	$method = $urlReflection->getMethod('validateValue');
	$method->setAccessible(true); //因为这个方法是protected的,咱改成public以实现单元测试调用
	$thisContext = $urlReflection->newInstanceArgs(); //方法里的 $this 对象
	
	$result = $method->invokeArgs($thisContext, ['http://xxx.com']);
	$this->assertNull($result, '协议头+域名 是个正常的URL');
	
	$result = $method->invokeArgs($thisContext, ['http://xxx.com/a/b/c']);
	$this->assertNull($result, '协议头+域名+pathinfo 是个正常的URL');
	
	$result = $method->invokeArgs($thisContext, ['http://xxx.com/a/b/c.html?a=b']);
	$this->assertNull($result, '协议头+域名+pathinfo+queryInfo 是个正常的URL');
	
	$result = $method->invokeArgs($thisContext, ['http://xxx.com/a/b/c.html?a=b#somewhere']);
	$this->assertNull($result, '协议头+域名+pathinfo+queryInfo+fragment 是个正常的URL');
	
	$result = $method->invokeArgs($thisContext, ['abc']);
	$this->assertNotNull($result, '这不是个正常的URL');
	
	$result = $method->invokeArgs($thisContext, ['xxx.com']);
	$this->assertNotNull($result, '只有域名却不带协议头 也不是个正常的URL');
}

填好这些测试代码后,跑一下命令运行单元测试,结果就是:

Codeception PHP Testing Framework v2.0.9
Powered by PHPUnit 5.3.2 by Sebastian Bergmann and contributors.

Unit Tests (1) ---------------------------------------------
Test me (UrlTest::testMe)                              Ok
---


Time: 184 ms, Memory: 6.00Mb

OK (1 test, 6 assertions)

实际上你应该写什么测试代码?

以上代码是针对Yii框架的某个类进行测试的,其实这些类能否正常工作我们不需要去怀疑,因为官方已经有了一套测试用例去监测它的运行情况了

附:电梯直达Yii2框架的测试项目(基于PHPUnit)

回到正题,实际上在测试项目里我们就只要针对自己在项目里写的代码做测试就行了,这些代码可以称为“业务代码”,包括支撑业务运作的自定义类

比如有个User业务,可以获取当天新注册的人数,那就针对获取当天新注册人数的方法做测试吧

  • 参考项目

    我为此也创立了一个叫xoa的开源项目托管在Github上,项目地址:https://github.com/kk8686/xoa

    可以在此项目的server/tests目录里找到Codeception测试项目,unit里面有写好了的业务测试示例,这样确保业务代码被更新维护时依然可以按照指定的逻辑执行业务

    当然,业务的逻辑规则有更新的时候也是要更新单元测试里的代码的

    并且项目也附带了技术指引

    指引了如何运行测试用例