如何在使用数据提供者时保持较小的测试?

我正在测试Web应用程序的端点/ API。 我有多个小测试,取决于前面测试的返回值。 一些测试甚至依赖于前面测试所产生的副作用。 下面是一个例子(编号列表项代表单个测试用例):

  • 向端点发出请求并声明http代码为200,返回响应
  • 解析响应主体并对其做一些断言,返回解析的响应主体
  • 对解析的响应主体的调试值做一些断言
  • 向另一个端点发出新请求并声明http代码为200,返回响应
  • 解析响应主体并断言来自测试1的副作用实际发生
  • 正如你可以看到测试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)
    {
        // ...
    }
    

    我认为主要的问题是测试过于复杂,不应相互依赖。 解决方案是通过重构测试来降低一些复杂性。 这是我做了什么的粗略概述:

  • 将一些更复杂的测试用例从集成测试移到单元测试。 所以我不再测试端点,而是测试当您进入端点时执行的方法。
  • 增加了一个通用的测试用例,用于处理来自数据提供者的数据,该数据提供者不仅包括不同端点的URL。 这个测试用例简单地测试了端点正在返回预期的http代码和其他一些小东西。 这使我可以将我所有的集成测试集成到一个简单的测试用例中。
  • 我对这个解决方案非常满意,我删除了7-8个测试类,而且移到单元测试的复杂测试也被简化了。

    链接地址: http://www.djcxy.com/p/64553.html

    上一篇: How to keep your tests small while using data providers?

    下一篇: How to run single test method with phpunit?