我们已经在代码库上实现了一些PHPUnit测试。然而,为了最大限度地减少运行测试所需的时间,我希望将我们的测试分成两组或一组:
这将允许我们在处理基本功能时运行1级测试,在处理更高级别功能时运行1级和2级,或者在提交到主线/构建之前运行。
我将如何使用PHPUnit完成此任务?
答案 0 :(得分:7)
您可以编写一个phpunit.xml
,将您的测试分成可以单独运行的测试套件。
http://phpunit.de/manual/current/en/organizing-tests.html#organizing-tests.xml-configuration
它看起来类似于:
<phpunit>
<testsuites>
<testsuite name="Unit_Tests">
<directory>SomeTests</directory>
<directory>MoreTests</directory>
</testsuite>
<testsuite name="Functional_Tests">
<directory>OtherTests</directory>
</testsuite>
</testsuites>
</phpunit>
然后,当您只想运行一组测试时,可以根据需要调用phpunit --testsuite Unit_Tests
或phpunit --testsuite Functional_Tests
。
答案 1 :(得分:7)
@Schleis的回答完全正确且非常有用。唯一的问题(我承认在我的问题中没有包括)是我希望能够在整个测试文件中分散单元和集成测试 - 我想避免使用两个测试文件 - 一个用于单元测试的文件对于SomeClass,以及一个单独的功能测试文件,也适用于SomeClass。
我发现启用此功能的PHPUnit命令行选项是groups:
--group
Only runs tests from the specified group(s). A test can be tagged as belonging to a group using the @group annotation.
要使用此方法,您只需在测试之前将@group
注释添加到多行注释中:
class SomeClassTest extends PHPUnit_Framework_TestCase {
/**
* @group Unit
*/
public function testSomeUnitFunctionality() {
$this->assertEquals(xyz(' .a1#2 3f4!', true), ' 12 34');
}
/**
* @group Integration
*/
public function testSomeIntegrationFunctionality() {
$this->assertEquals(xyz(' .a1#2 3f4!', true), ' 12 34');
}
}
这允许我执行以下操作:
phpunit --group Unit
(只是单元测试)phpunit --group Integration
(只是集成测试)phpunit
(所有测试)答案 2 :(得分:1)
组的替代方法是使用命名约定:
<testsuites>
<testsuite name="unit-tests">
<directory suffix="Test.php">test</directory>
</testsuite>
<testsuite name="benchmark">
<directory suffix="Benchmark.php">test</directory>
</testsuite>
</testsuites>
test/SomethingTest.php
(class SomethingTest extends TestCase {...}
)之类的文件位于unit-test
套件中,而test/SomeBenchmark.php
(class SomeBenchmark extends TestCase {...}
)之类的文件位于benchmark
套件中
简单,明显和实用。
它还允许我们拥有不属于任何一个套件的test/SomeExperiment.php
(class SomeExperiment extends TestCase {...}
)(因此它不会在CI管道中失败),但仍可以在执行期间显式执行开发。