PHPUnit中两个TestCase类之间的相关测试

Daw*_*hia 12 php phpunit unit-testing

在PHPUnit中,您可以通过使用@depends注释使一个测试依赖于其他测试.是否有可能使整个TestCase依赖于其他TestCase中的测试?或者至少在一个TestCase中进行单个测试依赖于其他TestCase中的测试?

我试过了:

/**
 * @depends A::testMethodName
 */
Run Code Online (Sandbox Code Playgroud)

但正如我所料,它不起作用.

更新:

确切的情况看起来像这样:有class B哪些用途class A.所以我想测试B只有在A(或其中一个测试)的测试没有失败的情况下运行.我怎样才能做到这一点?

Jos*_*ock 14

利用依赖是非常重要的!所提到的松耦合用于实际应用架构,不适用于单元测试用例.如果在功能执行中内置逻辑依赖关系,那么利用这些依赖关系总是一个好主意.

使用测试加倍适合SOA依赖地方不能在黑盒子内映射到特定的故障服务是不可靠的.这不适用于跨应用程序类.

如果测试类之间存在逻辑依赖关系,您肯定希望使用此类功能.从单元测试中掌握的概念是它能够立即将缺陷隔离到特定组件.

此功能在PHPUnit v 3.7.13上可用.但是,唯一可行的方法是在包含两个TestCase类的目录上运行PHPUnit.

例如,使用此文件夹结构

-application\dep -BTest.php -CTest.php

课程......

- application\dep
   |- BTest.php
   |- CTest.php
Run Code Online (Sandbox Code Playgroud)

和...

class BTest extends PHPUnit_Framework_TestCase
{
    /**
     * @depends CTest::testADomino
     */
    public function testDominoDependent()
    {
        $this->assertTrue(true);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是结果

class CTest extends PHPUnit_Framework_TestCase
{
    public function testADomino()
    {
        $this->assertTrue(false);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在同一个文件中同时拥有两个测试用例类,但结构很差.没有必要"确保"一个测试在另一个之前运行.

作为敏捷教练,我认为测试在大型组织中经常加倍,在这些组织中,当另一个组件进行导致测试失败的更改时,专门的细分市场希望避免构建失败.这当然会破坏单元测试的整个目的,即在最终用户之前识别组件故障.


Dav*_*ess 6

没有内置的方法可以做到这一点,但是任何数量的测试依赖于其他一些测试传递也不难.您必须确保ATest之前执行BTest.

class ATest extends PHPUnit_Framework_TestCase {
    public static $passed = false;

    function testThatMustPass() {
        // ... the actual test ...
        // ok, test passed
        self::$passed = true;
    }
}

class BTest extends PHPUnit_Framework_TestCase {
    function testThatDependsOnA() {
        if (!ATest::$passed) {
            self::markTestSkipped('A failed');
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

测试依赖于整个测试用例也是可能的.

class ATest extends PHPUnit_Framework_TestCase {
    public static $passed = true;

    protected function onNotSuccessfulTest(Exception $e)
        self::$passed = false;
        parent::onNotSuccessfulTest($e);
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过跟踪失败的测试名称来改进这些,这样您就可以依赖每个案例的测试子集.


小智 5

对于那些仍然对这个问题感到疑惑的人,您可以使用@Depends参考而不是@depends. 似乎小写版本只能以跨功能的方式使用,而大写字母可以用于类到类。

/**
 * @Depends FirstTest::testMethodName
 */
Run Code Online (Sandbox Code Playgroud)

确保依赖的测试类将在依赖它的实际测试类之前运行。您可以通过在声明测试类的顺序做这个测试包phpunit.xml

<phpunit
        bootstrap="./vendor/autoload.php"
        colors="true"
>
    <testsuites>
        <testsuite name="App\\Tests">
            <directory>./test</directory>
        </testsuite>
        <testsuite name="sample-testsuite">
         <directory>./test/FirstTest.php</directory>
         <directory>./test/SecondTest.php</directory>
        </testsuite>
    </testsuites>

    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">src</directory>
        </whitelist>
    </filter>
</phpunit>
Run Code Online (Sandbox Code Playgroud)

然后,您运行测试套件。

./vendor/bin/phpunit --testsuite sample-testsuite
Run Code Online (Sandbox Code Playgroud)

我只用6.1.0+版本对此进行了测试。您可以在此处查看有关此问题的讨论。谢谢 :)