我有以下非常简单的PHPUnit XML配置:
<phpunit bootstrap="/_tests/TestAutoload.php">
<testsuites>
<testsuite name="Unit Tests">
<directory suffix=".php">_tests</directory>
</testsuite>
</testsuites>
</phpunit>
如何从测试套件中排除此目录中的某些文件?我尝试了<exclude>
和<blacklist>
,但它似乎不适用于此上下文。还找不到除phpunit.de之外的任何其他文档,其中没有提及任何相关内容。除此之外,这个配置完美无缺。
答案 0 :(得分:35)
有很多方法可以不运行特定的测试 - 将其放入黑名单,因此它永远不会运行 - 因为更改它意味着编辑黑名单,并且您经常会最终将其弹出和弹出版本控制。
还有其他几种方式可能更合适:
如果测试尚未准备好运行:
$this->markTestIncomplete('This test has not been implemented yet.');
如果有外部原因不应该运行,请跳过它:
if (!extension_loaded('mysqli')) {
$this->markTestSkipped('The MySQLi extension is not available.');
}
您也可以将其放入setUp()
函数中,因此它将跳过测试类中的所有测试。
您可以根据前一个成功进行测试:
public function testEmpty()
{
$stack = array();
$this->assertTrue(empty($stack));
return $stack; // also sends this variable to any following tests - if this worked
}
/**
* only runs if testEmpty() passed
*
* @depends testEmpty
*/
public function testPush(array $stack)
{
}
@group -name-注释是专门停止或运行一组测试的最佳方法之一
/**
* @group database
* @group remoteTasks
*/
public function testSomething()
{
}
testSomething()
现在分为两组,如果在命令行(或config.xml)--exclude-group
参数中添加了任一组。它不会被运行。同样,您只能运行属于特定组的测试 - 例如以功能或错误报告命名。
答案 1 :(得分:29)
排除文件名Child1
。
将此添加到您的TestCase.php
phpunit.xml
以下是a real-live test-suite的其他摘录,我可以确认它与之合作:
<testsuites>
<testsuite name="BLABLA">
<directory suffix=".php">./tests</directory>
<exclude>./tests/TestCase.php</exclude>
</testsuite>
</testsuites>
答案 2 :(得分:8)
使用这个PHPUnit配置文件,我已经取得了非常好的经验。
<?xml version="1.0" encoding="UTF-8"?>
<phpunit
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
colors="true"
processIsolation="true"
stopOnFailure="true"
syntaxCheck="false"
backupGlobals="false"
bootstrap="test-bootstrap.php">
<testsuites>
<testsuite name="php-dba-cache">
<directory suffix="Test.php">tests</directory>
</testsuite>
</testsuites>
<logging>
<log type="coverage-html"
target="build/coverage"
charset="UTF-8"
yui="true"
highlight="true"
lowUpperBound="35"
highLowerBound="70"/>
</logging>
<filter>
<whitelist addUncoveredFilesFromWhitelist="true">
<directory suffix=".php">src</directory>
<exclude>
<file>test-bootstrap.php</file>
</exclude>
</whitelist>
</filter>
</phpunit>
答案 3 :(得分:4)
phpunit documentation在测试套件中排除时有点简约。显然,只能整个目录,但不能单个文件。我很高兴被证明是错的。解决方法似乎是使用Alister Bulman的@group功能posted above。
在我想要保留的测试套件中标记每一个测试都是一种痛苦。
答案 4 :(得分:2)
通过上述解决方案,您可以使用更多由体系结构驱动的测试工作流,您可以在其中管理phpunit.xml
中的测试,目录和测试套件,如下所示:
tests/Unit
,tests/Feature
); <testsuite>
元素对目录进行分组; All
测试套件,它将您将作为完整测试套件运行的所有默认测试组合在一起,并通过<phpunit>
元素中的defaultTestSuite="All"
键进行分配。Tinker
测试套件,其中包含可用于修补,保留示例测试等的测试,这些测试将从正常测试工作流程中排除。不要将其包含在All
测试套件中。因此您将能够:
phpunit
CLI命令始终运行默认的All
测试。phpunit --testsuite SuiteOne
,phpunit --filter SomeTest
或phpunit --filter SomeTest::test_some_test_method
--testsuite
与--filter
自变量结合起来将此工作流与从IDE中运行当前测试或测试文件的功能结合在一起(对于Sublime Text,有Mac和Linux/Windows插件),您将完全有能力立即选择测试执行。
答案 5 :(得分:1)
对于Phpunit 6.5,exclude
在whitelist
下
<filter>
<whitelist>
<directory suffix=".php">src</directory>
<exclude>
<directory>src/Migrations</directory>
<file>src/kernel.php</file>
</exclude>
</whitelist>
</filter>
答案 6 :(得分:0)
我在一个测试类中遇到了这个问题,我想为其他测试扩展它。 PHPUnit 会发出有关不包含测试的测试文件的警告。只需在文件 abstract
中声明类,PHPunit 就会对此保持沉默。
abstract class SetupSomeCommonThingsTestCase {
protected function setUp(): void {
parent:setUp();
...
}
}
答案 7 :(得分:-4)
嘿那里,请确保将您的排除项放在白名单中。例如:
<phpunit>
<filter>
<blacklist>
<directory suffix=".php">/not/even/looked/at/</directory>
</blacklist>
<whitelist>
<directory suffix=".php">/path/to/test/dir/</directory>
<exclude>
<file suffix=".php">/path/to/fileToExclude.php</file>
</exclude>
</whitelist>
</filter>
</phpunit>