gpt4 book ai didi

php - 如何在使用数据提供程序的同时保持测试的小型化?

转载 作者:行者123 更新时间:2023-11-28 20:40:13 25 4
gpt4 key购买 nike

我正在测试网络应用程序的端点/API。我有多个小测试取决于前面测试的返回值。一些测试甚至依赖于前面测试产生的副作用。这是一个如何进行的示例(编号的列表项代表单个测试用例):

  1. 向端点发出请求并断言 http 代码为 200,返回响应
  2. 解析响应体并对其做一些断言,返回解析后的响应体
  3. 对解析后的响应体的调试值做一些断言
  4. 向另一个端点发出新请求并断言 http 代码为 200,返回响应
  5. 解析响应主体并断言测试 1 的副作用确实发生了

如您所见,测试从测试 1 开始传播,所有其他测试都取决于它的返回值或副作用。

现在我想使用来自数据提供者的数据执行这些测试,以测试来 self 们应用程序的多个用户的行为。根据 phpunit 文档,这是不可能的。来自文档:

When a test depends on a test that uses data providers, the depending test will be executed when the test it depends upon is successful for at least one data set. The result of a test that uses data providers cannot be injected into a depending test.

需要说明的是,我想要的是让测试 1 执行 x 次并使用 y 值,并让所有其他测试每次都传播其返回值或检查其副作用。经过一些谷歌搜索后,想到的唯一解决方案是将所有测试放入一个测试中以删除所有依赖项。然而,我有多个具有这种行为的测试套件,并且一些测试会变得非常庞大和笨拙。

那么,如何在使用数据提供程序的同时保持小测试用例之间的依赖关系呢?我正在使用 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)
{
// ...
}

最佳答案

我认为主要问题是测试太复杂了,不应该太依赖彼此。解决方案是通过重构测试来降低一些复杂性。以下是我所做工作的粗略概述:

  1. 从集成测试中移出了一些更复杂的测试用例到单元测试。所以我不再测试端点,而是测试当您转到端点时执行的方法。
  2. 添加了一个通用测试用例,该用例对来自数据提供者的数据进行操作,其中包括但不限于不同端点的网址。这个测试用例只是测试端点是否返回了预期的 http 代码和其他一些小东西。这使我能够将所有集成测试放入一个简单的测试用例中。

我对这个解决方案非常满意,我删除了 7-8 个测试类,并且转移到单元测试的复杂测试也得到了简化。

关于php - 如何在使用数据提供程序的同时保持测试的小型化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36304442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com