如何在使用数据提供者时保持较小的测试?
我正在测试Web应用程序的端点/ API。 我有多个小测试,取决于前面测试的返回值。 一些测试甚至依赖于前面测试所产生的副作用。 下面是一个例子(编号列表项代表单个测试用例):
正如你可以看到测试1从测试1中传播出来,所有其他测试都依赖于它的返回值或副作用。
现在我想用来自数据提供者的数据执行这些测试,以测试来自应用程序的多个用户的行为。 根据phpunit文档,这是不可能的。 从文档:
当测试依赖于使用数据提供者的测试时,依赖测试将在它所依赖的测试对至少一个数据集成功时执行。 使用数据提供者的测试的结果不能被注入到依赖测试中。
为了清楚起见,我想要的是测试1使用y值执行x次,并且让所有其他测试每次传播其返回值或检查其副作用。 经过一些Google搜索之后,想到的唯一解决方案就是将所有测试放入一个测试中,以消除所有依赖关系。 然而,我有这种行为的多个测试套件,并且一些测试会变得非常庞大而笨拙。
那么,如何在使用数据提供者时保持小型测试用例之间的依赖关系呢? 我使用的是PHP 5.5以及Silex 1.3和phpunit 4.8
编辑:我应该提到我的测试扩展了Silex的WebTestCase,但我不确定它是否有所作为。
以下是我不清楚的例子:
public function testValidResponse()
{
$client = $this->createClient();
$client->request('POST', '/foo', $this->params);
$this->assertEquals(200, $client->getResponse()->getStatusCode());
return $client->getResponse();
}
/**
* @depends testValidResponse
*/
public function testStatusIsOk(Response $response)
{
$json = json_decode($response->getContent(), true);
$this->assertTrue($json['status']);
return $json;
}
/**
* @depends testStatusIsOk
*/
public function testExecutionTime($json)
{
$this->assertLessThan($this->maxExecutionTime, $json['debug']['executionTimeSec']);
}
/**
* @depends testValidResponse
*/
public function testAnotherEndpointValidResponse()
{
$client = $this->createClient();
$client->request('GET', '/bar');
$this->assertEquals(200, $client->getResponse()->getStatusCode());
return $client->getResponse();
}
/**
* @depends testAnotherEndpointValidResponse
*/
public function testSideEffectsFromFirstTest(Response $response)
{
// ...
}
我认为主要的问题是测试过于复杂,不应相互依赖。 解决方案是通过重构测试来降低一些复杂性。 这是我做了什么的粗略概述:
我对这个解决方案非常满意,我删除了7-8个测试类,而且移到单元测试的复杂测试也被简化了。
链接地址: http://www.djcxy.com/p/64553.html上一篇: How to keep your tests small while using data providers?