是否可以使用PHPUnit @depends而不在相关案例之间调用tearDown和setUp?

Mik*_*nry 7 php phpunit

例如,该操作在test1外部存储数据*test2然后执行断言,但tearDown删除该数据从而中断test2.无法删除缓存删除,tearDown因为其他测试依赖于它.这个问题是询问是否有办法在保持功能的同时跳过依赖情况之间的setUp/tearDown @depends(如果第一次测试失败而不是第二次测试失败,则跳过第二次测试).

public function tearDown() {
    // delete cache
}

// verify the expected data was retrieved from an uncached source
public function test1() {
    $sut = new SystemUnderTest();
    $data = $sut->getDataAndCache();
    $this->assertEquals('expected', $data);
    return $sut;
}

// verify the expected data was cached
/** @depends test1 */
public function test2($sut) {
    $this->assertEquals('expected', $sut->getCache());
}
Run Code Online (Sandbox Code Playgroud)

*我们称之为集成测试,因为它们与外部系统交互.

Ger*_*che 17

在设置方法中,您可以检查测试是否有hasDependencies(),然后跳过设置过程:

public function setUp()
{
    if (!$this->hasDependencies()) {
        // do setup tasks 
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这个方法是最新版本 PHPUnit 的一部分。 (3认同)

Mik*_*nry 0

我的一个想法是使用静态字段,例如is_depends将其设置为 true intest1和 false in ,并test2在运行之前检查 的值。例如setUptearDownis_depends

private static is_depends;

public function setUp() {
    if (self::$is_depends) return;
    // do setup that shouldn't be done between dependencies
}

public function tearDown() {
    if (self::$is_depends) return;
    // delete cache
}

// verify the expected data was retrieved from an uncached source
public function test1() {
    $sut = new SystemUnderTest();
    $data = $sut->getDataAndCache();
    $this->assertEquals('expected', $data);
    self::$is_depends = true;
    return $sut;
}

// verify the expected data was cached
/** @depends test1 */
public function test2($sut) {
    $this->assertEquals('expected', $sut->getCache());
    self::$is_depends = false;
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?