modera/tests-runner

v0.3 2018-05-19 15:39 UTC

This package is auto-updated.

Last update: 2024-09-23 20:05:55 UTC


README

Build Status

该软件包提供了一个PHPUnit监听器,可以在执行测试套件之前/之后执行某些操作。例如,当运行功能测试时,您可能希望在测试运行之前创建数据库,并在测试完成后将其删除。

安装

  • 将此依赖项添加到您的composer.json文件中
"modera/tests-runner": "dev-master"
  • (可选,推荐) 如果您已安装Docker,那么在您想要运行测试的项目中,请使用以下命令安装runner脚本
wget https://raw.githubusercontent.com/modera/tests-runner/master/scripts/phpunit.sh && chmod +x phpunit.sh

稍后您将能够使用此脚本运行测试,在首次运行此脚本时,它还将安装其他所需组件。

  • 在您的phpunit.xml/phpunit.xml.dist旁边创建一个名为.mtr(注意开头有一个点)的文件,例如
<?php

return [
    new \Modera\TestsRunner\Interceptors\ServerEnvExportingInterceptor(array(
        'SYMFONY__DB_HOST' => 'mysql',
        'SYMFONY__DB_PORT' => 3306,
        'SYMFONY__DB_USER' => 'root',
        'SYMFONY__DB_PASSWORD' => '123123'
    )),
    new \Modera\TestsRunner\Interceptors\SymfonyPhpUnitEnvInterceptor(),
    new \Modera\TestsRunner\Interceptors\MySqlInterceptor(
        function() { // config provider
            return array(
                'host' => $_SERVER['SYMFONY__DB_HOST'],
                'user' => $_SERVER['SYMFONY__DB_USER'],
                'password' => $_SERVER['SYMFONY__DB_PASSWORD'],
                'port' => $_SERVER['SYMFONY__DB_PORT'],
                'attempts' => isset($_SERVER['DB_ATTEMPTS']) ? $_SERVER['DB_ATTEMPTS'] : 40,
            );
        }
    ),
];

此文件负责创建所谓的拦截器——在测试用例之前和之后执行的一些额外代码。更多关于它们的信息,您可以在本文件的后面阅读。

  • 更新您的phpunit.xml文件以引用测试运行器的监听器,这里我们假设测试运行器位于名为vendor/modera/tests-runner的目录中(默认情况下,第一步中安装的脚本将测试运行器安装在那里)
<listeners>
    <listener class="Modera\TestsRunner\PhpUnitListener" file="./vendor/modera/tests-runner/src/Modera/TestsRunner/PhpUnitListener.php"></listener>
</listeners>
  • 现在您可以使用第一步中创建的phpunit.sh脚本来运行您的测试。

使用默认脚本运行测试

对于使用测试运行器运行的项目,最简单的方法是使用提供的phpunit.sh脚本。请参阅脚本的源代码以了解您在使用它时可以使用的所有选项。

拦截器

在我们查看测试运行器提供的具体拦截器实现之前,让我们先谈谈拦截器究竟是什么以及它们用于什么。本质上,正如您可能已经猜到的,拦截器允许您在PHPUnit切换为正在运行的包之前和之后执行额外的操作。该包本身由存在composer.json文件指定。假设您有以下文件结构

src\
    Acme\
        FooBundle\
            Tests\
                ...
            composer.json
        BarBundle\
            Tests\
                ...
            composer.json

当测试运行器为src/目录运行测试时,它将运行拦截器两次,具体来说

  • 进入FooBundle之前
  • 离开FooBundle并进入BarBundle之前
  • 进入BarBundle之前
  • 离开BarBundle并可能进入下一个包之前

要实现拦截器,您需要实现Modera\TestRunner\InterceptorInterface,有关更多信息,请参阅其API文档。现在您已经了解了拦截器是什么,让我们看看那些开箱即用的拦截器

  • MySqlInterceptor - 此拦截器允许创建和删除MySQL数据库。例如,如果包的名称是modera/foo(名称来自composer.json文件中的“name”参数),那么在PHPUnit运行测试之前,此拦截器将创建一个名为“modera_foo”的表,在测试执行完成后,它将自动删除该表。
  • ServerEnvExportingInterceptor - 允许定义尚不存在的环境变量。
  • SymfonyPhpUnitEnvInterceptor - 这个很有趣,如果您正在对包含Symfony组件的单体仓库运行测试,您可能需要使用它。这个拦截器会检查是否存在与composer.json相邻的phpunit.xml或phpunit.xml.dist文件,如果存在,拦截器将扫描其部分以检测环境变量KERNEL_DIR是否设置。如果已定义,它将动态更新其路径,以便Symfony的WebTestCase知道从哪里加载内核类。请阅读Symfony提供的文档,了解如何为运行功能测试准备您的组件 - https://symfony.com.cn/doc/current/testing.html#your-first-functional-test