以某种顺序运行PHPUnit测试

dra*_*ank 57 php phpunit unit-testing

有没有办法让a内部的测试TestCase按特定顺序运行?例如,我想将对象的生命周期从创建分为使用分离,但我需要确保在运行其他测试之前首先设置对象.

mjs*_*mjs 137

PHPUnit通过@depends批注支持测试依赖性.

以下是文档中的示例,其中测试将以满足依赖性的顺序运行,每个依赖测试将参数传递给下一个:

class StackTest extends PHPUnit_Framework_TestCase
{
    public function testEmpty()
    {
        $stack = array();
        $this->assertEmpty($stack);

        return $stack;
    }

    /**
     * @depends testEmpty
     */
    public function testPush(array $stack)
    {
        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack)-1]);
        $this->assertNotEmpty($stack);

        return $stack;
    }

    /**
     * @depends testPush
     */
    public function testPop(array $stack)
    {
        $this->assertEquals('foo', array_pop($stack));
        $this->assertEmpty($stack);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,重要的是要注意,将不会执行具有未解析的依赖关系的测试(这是可取的,因为这会引起对失败测试的快速关注).因此,在使用依赖项时要特别注意.

  • 对于PHPUnit,这意味着如果未执行上一个测试,将跳过测试函数.这不会创建测试订单. (13认同)
  • 只是为了扩展@Dereckson,如果依赖于_either_的测试尚未运行或在运行时失败,则`@ depends`注释将导致跳过测试. (4认同)

Fab*_*mes 48

也许你的测试中存在设计问题.

通常每个测试都不能依赖于任何其他测试,因此它们可以按任何顺序运行.

每个测试都需要实例化并销毁它需要运行的所有东西,这将是完美的方法,你永远不应该在测试之间共享对象和状态.

您能否更具体地说明为什么N测试需要相同的对象?

  • 这对我来说似乎不正确.单元测试的要点是测试整个单元.拥有一个单元的目的是将必须相互依赖的事物组合在一起.在没有类的上下文的情况下编写测试单个方法的测试类似于提倡对oo进行过程编程,因为你提倡单个函数不应该依赖于相同的数据. (48认同)
  • 如果构造函数很复杂,你做错了,可能你的课做得太多了.请阅读"SOLID",更具体地说明"单一责任模式(SRP)",您也应该使用模拟"伪造"测试中的依赖关系,请阅读"模拟,假货和存根". (6认同)
  • 我不同意你的观点.实例化测试的输出是一个有效的对象,可供测试套件中的其他测试使用.没有必要为每个测试实例化一个新对象,特别是如果构造函数很复杂. (4认同)

Gin*_*ane 17

对此的正确答案是用于测试的正确配置文件.我遇到了同样的问题并通过创建具有必要测试文件顺序的testsuite来修复它:

phpunit.xml:

<phpunit
        colors="true"
        bootstrap="./tests/bootstrap.php"
        convertErrorsToExceptions="true"
        convertNoticesToExceptions="true"
        convertWarningsToExceptions="true"
        strict="true"
        stopOnError="false"
        stopOnFailure="false"
        stopOnIncomplete="false"
        stopOnSkipped="false"
        stopOnRisky="false"
>
    <testsuites>
        <testsuite name="Your tests">
            <file>file1</file> //this will be run before file2
            <file>file2</file> //this depends on file1
        </testsuite>
    </testsuites>
</phpunit>
Run Code Online (Sandbox Code Playgroud)

  • 完美的!并非每个测试都是单元测试;例如,在编写 HTTP 请求或功能测试时,可能需要跨测试类保留状态更改,在这种情况下,这是以有意义的顺序运行测试的最可靠方法。 (2认同)

Gar*_*son 8

如果您希望测试共享各种帮助程序对象和设置,则可以使用setUp(),tearDown()添加到sharedFixture属性.


小智 7

PHPUnit允许使用'@depends'注释,它指定依赖测试用例并允许在依赖测试用例之间传递参数.