【发布时间】:2021-12-24 18:07:25
【问题描述】:
问题描述
我使用配置运行目录中的所有测试
phpunit-config.xml
<phpunit bootstrap="./bootstrap.php">
<testsuites>
<testsuite name="all">
<directory>./tests</directory>
</testsuite>
</testsuites>
</phpunit>
在某些文件中有多个类(即它不遵循 PSR,请参阅底部的注释)可能扩展 *Test 类,但不应运行。他们的名字不以Test 结尾。例如ExampleHelper:
测试/AllTest.php
<?php declare(strict_types=1);
use PHPUnit\Framework\TestCase;
class ExampleTest extends TestCase
{
public function testShouldRun(): void
{
$this->assertSame(0, 0);
}
}
final class ExampleHelper extends ExampleTest
{
public function testShouldNotBeExecuted(): void
{
$this->assertSame(0, 1);
}
}
正如方法所暗示的,应该执行ExampleTest,但不应该执行ExampleHelper。
复制
目录结构
├── Dockerfile
├── bootstrap.php
├── docker-compose.yml
├── phpunit-config.xml
└── tests
└── AllTest.php
Dockerfile
FROM --platform=linux/amd64 php:7.4
RUN apt-get update \
&& apt-get install -y git zip libzip-dev
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
WORKDIR /app
RUN composer require --dev phpunit/phpunit:9.5.10
bootstrap.php
<?php
require_once __DIR__ . '/vendor/autoload.php';
docker-compose.yml
version: '3.7'
services:
app:
build: ./
image: phpunit-test
command: ./vendor/bin/phpunit -c phpunit-config.xml
volumes:
- ./bootstrap.php:/app/bootstrap.php
- ./phpunit-config.xml:/app/phpunit-config.xml
- ./tests:/app/tests
运行
docker-compose build && docker-compose up
实际输出
...
app_1 | There was 1 failure:
app_1 |
app_1 | 1) ExampleHelper::testShouldNotBeExecuted
app_1 | Failed asserting that 1 is identical to 0.
app_1 |
app_1 | /app/tests/AllTest.php:16
app_1 |
app_1 | FAILURES!
app_1 | Tests: 3, Assertions: 3, Failures: 1.
预期输出
...
app_1 | OK (1 test, 1 assertion)
编辑: 实际项目是一个很大的旧代码库。由于某些文件中有多个类,因此它不遵循 PSR。从长远来看,这应该改变,但目前成本太高。我正在寻找一种需要对现有文件进行最少更改的解决方案,例如只有配置。
顺便说一句。 ExampleHelper 未在早期版本的 PHPUnit 中运行。我猜是 4.8。
【问题讨论】:
-
一般来说,同一个文件中不会有多个类。
-
@NigelRen 我知道,但有时你必须使用你得到的东西;)
-
你的
ExampleHelper extends ExampleTest真的很奇怪。ExampleHelper类不包含任何测试的目的是什么? -
至于如何只运行您想要的类,您可以编写一个自定义的
TestSuiteLoader并使用它,这要归功于testSuiteLoaderClass配置。 -
@homer 谢谢,这看起来很有希望。用例很难解释,因为它有点像 hack。
ExampleHelper实例实际上是在ExampleTest的测试方法中创建的,它调用了ExampleHelper的测试方法。ExampleHelper覆盖了测试方法使用的ExampleTest的一些方法。更复杂的是,测试方法继承自使用TestTemplate类的特征,该类定义了实际测试,并且可以使用遵循特定命名约定的方法从实际测试类中查询数据,并且可以覆盖模板的默认值.