phpunit跳过具有不同测试用例之间依赖关系的测试

Posted

技术标签:

【中文标题】phpunit跳过具有不同测试用例之间依赖关系的测试【英文标题】:phpunit skipping tests with dependencies between different test cases 【发布时间】:2017-11-24 14:09:16 【问题描述】:

对于集成测试,我想重用测试结果。依赖项是通过注解定义的。对于要执行的依赖测试,需要获得先前测试的结果。因此,测试需要以固定的顺序执行。否则会跳过依赖于其他测试的测试。为了确保测试以固定的顺序执行,我们定义了一个测试套件。仍然跳过具有依赖关系的测试。这是为什么呢?

ATest.php:

<?php

use PHPUnit\Framework\TestCase;

class ATest extends TestCase

    public function testA()
    
        self::assertTrue(true);
        return $this;
    

BTest.php:

<?php

use PHPUnit\Framework\TestCase;

class BTest extends TestCase


    /**
    * @depends ATest::testA()
    */
    public function testB($a)
    
        self::assertTrue(true);
    

phpunit.xml:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit
         verbose="true"
>
    <testsuites>
        <testsuite name="dependency">
            <file>ATest.php</file>
            <file>BTest.php</file>
        </testsuite>
    </testsuites>
</phpunit>

phpunit --testsuite 依赖

Sebastian Bergmann 的 PHPUnit 5.5.7 和 贡献者。

运行时:PHP 7.1.5 和 Xdebug 2.5.4 配置: /phpunit.xml

.S 2 / 2 (100%)

时间:49 毫秒,内存:4.00MB

有 1 个跳过的测试:

1) BTest::testB 这个测试依赖于“ATest::testA()”才能通过。

好的,但是不完整、跳过或有风险的测试!测试:1,断言:1, 跳过:1。

【问题讨论】:

【参考方案1】:

您不能让测试依赖于不同 TestCase 中的测试。测试需要包含在同一个测试用例中。由于测试不在测试用例中,因此它会被视为失败的测试,并且在您运行测试时会跳过该测试。

您的测试需要合并到一个测试中才能使依赖项起作用。

https://phpunit.de/manual/current/en/writing-tests-for-phpunit.html#writing-tests-for-phpunit.test-dependencies

造成这种情况的部分原因是您的每个测试都应该被隔离并且能够以任何顺序运行。让测试依赖于单独测试用例中的测试意味着测试文件将需要以特定顺序运行。这很容易因为循环测试依赖而变得复杂。

此外,您现在有一些不包含在您的测试用例中的影响测试的东西。这可能导致维护测试的噩梦。

【讨论】:

以上是关于phpunit跳过具有不同测试用例之间依赖关系的测试的主要内容,如果未能解决你的问题,请参考以下文章

用例之间如何建立依赖关系?需要这个工具

如何跳过 PHPunit 中的测试?

Python Unittest - 根据不同测试环境跳过用例详解

如何强制 PHPUnit 在跳过的测试中失败?

Laravel PhpUnit 依赖注入

Laravel phpunit 跳过自定义测试文件