如何跳过PHPunit中的测试?


88

我在与jenkins结合使用phpunit,并且我想通过在XML文件中设置配置来跳过某些测试 phpunit.xml

我知道我可以在命令行上使用:

phpunit --filter testStuffThatBrokeAndIOnlyWantToRunThatOneSingleTest

由于<filters>标记仅用于代码覆盖,我如何将其转换为XML文件?

我想除了运行所有测试 testStuffThatAlwaysBreaks


1
KO:修理测试怎么样?顺便说一句,您好,welly ;-)
zerkms 2012年

我没有编写测试,这无关紧要,也不想更改核心文件
Filype 2012年

无疑,您可以这样做。这是一个非常奇怪的要求
zerkms

PS:您提到了过滤器-但它无济于事,因为它排除了所有路径。否则<exclude>-会做对你的工作
zerkms

您可以张贴建议的phpunit.xml.dist文件吗?
Filype

Answers:


167

跳过已损坏或您以后需要继续进行的测试的最快,最简单的方法是将以下内容添加到单个单元测试的顶部:

$this->markTestSkipped('must be revisited.');

您可以始终将目录或测试添加到xml配置文件中,但是,如果这是一个控制器或类似的设备,那实际上不是很实用,因为该文件中可能还有许多其他测试。我想如果您无法访问单元测试,不确定我是否理解为什么,那么除了排除之外,您别无选择。
jsteinmann

5
由于它是静态方法(至少在PHPUnit 3中是这样),并且某些类使用后期静态绑定afaik,因此应使用static::markTestSkipped('');代替$this->。它将在较新的PHP版本中生成警告。签名: public static function markTestSkipped($message = '')
Daniel W.

需要完整单元测试文件的更好示例。不只是片段。
Ligemer '17

@DanielW。该官方PHPUnit的手册有例子表示$this->markTestSkipped()
nulll

您可以在6.5的源代码中看到@nulll ,markTestSkipped()它仍然是静态方法。
Daniel W.

30

如果您可以忽略整个文件,那么

<?xml version="1.0" encoding="UTF-8"?>

<phpunit>

    <testsuites>
        <testsuite name="foo">
            <directory>./tests/</directory>
            <exclude>./tests/path/to/excluded/test.php</exclude>
                ^-------------
        </testsuite>
    </testsuites>

</phpunit>

这是我尝试过的,仍然说不使用893测试<exclude>和使用<exclude>
Filype 2012年

1
这些测试大约需要20分钟才能运行,是否有一种简单的方法可以查看将要运行多少测试?目前,我必须等到第一行完成....... 63 / 893 ( 7%)
Filype

5
@Filype:那么您可能指定了错误的路径。这对我来说很有用。不确定是否可以进行测试计数。PS:单元测试不应运行太长时间。我建议@group按其性质使用注释和拆分测试
zerkms 2012年

20

有时,根据定义为php代码的自定义条件从特定文件中跳过所有测试很有用。您可以使用makeTestSkipped也可以正常运行的setUp函数轻松地做到这一点。

protected function setUp()
{
    if (your_custom_condition) {
        $this->markTestSkipped('all tests in this file are invactive for this server configuration!');
    }
}

your_custom_condition可以通过某些静态类方法/属性,在phpunit bootstrap文件中定义的常量甚至是全局变量来传递。


什么是Config课程?我在哪里放置?
cronfy

@cronfy可以是任何全局范围可访问的类(Singleton / Register设计模式),甚至可以是在phpunit的引导文件中设置的全局变量。基本上,逻辑是:if($ testsFromThisFileShouldBeSkipped){$ this-> markTestSkipped(...); }
KonradGałęzowski16年

删除条件,您的答案将很直接...“ markTestSkipped在安装程序内跳过整个文件”
SparK

1
@SparK我明白您的意思,但是我提供了有条件跳过整个测试类的方法。我已对其进行了一些更改,删除了我的自定义方式,以支持一般规则。
KonradGałęzowski19年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.