单元测试 - Specify

  • 作者:KK

  • 发表日期:2015.12.13


通常断言失败时就会退出这个测试方法,使用specify这个特性可以使得断言失败时不会退出,先看例子:

class HelloWorldTest extends \Codeception\TestCase\Test{
	use \Codeception\Specify;	//要先在这里use一下

	public function testDemo(){
		$this->specify('环节1:测试time函数', function(){
			//断言失败了不会往这个函数的代码下面跑而已,但外面还是会继续往下跑的
			$this->assertInternalType('string', time());		//失败
			$this->assertInternalType('string', md5(time()));	//成功,但上面失败,跑不到这里,退出这一次的specify
		});

		//无论上面的specify里成还是败都还会继续跑这里
		$this->assertTrue(true);	
		$this->specify('环节2:测试date函数', function(){
			$testTimeStamp = 1447171200;
			$this->assertNotEquals(1990, date('Y', $testTimeStamp));
			$this->assertEquals(2015, date('Y', $testTimeStamp));
			$this->assertEquals(5, count(explode('-', date('Y-m-d'))));	//失败
		});

		$this->assertTrue(false, '外面也失败了');	
	}
}

使用$this->specify('测试目标的说明', $具体的测试工作代码函数)

可以实现一块specify中断不会导致specify外面的测试代码中断而只会中断specify里面的代码而已,这种情况在复杂业务测试时,当一个测试方法中的两个测试逻辑没有依赖关系时比较有用,而且这里还有一个说明的作用,将一大块代码进行一个说明,但这样说不是算完美,不过specify是比较有用的,只是小规模测试时一般用不上

另外顺带一提,使用specify方法前先要在类里面的顶部use \Codeception\Specify;这个Trait

class HelloWorldTest extends \Codeception\TestCase\Test{
	use \Codeception\Specify;	//看这里看这里

	//...
}