PHPUnit配置(phpunit.xml) - 在bootstrap中加载?

时间:2010-10-20 14:43:09

标签: php configuration phpunit bootstrapping

情况

我们在项目中使用PHPUnit并使用phpunit.xml来确保关闭backupGlobals之类的内容。

为了进一步确保包含路径已设置且自动加载处于活动状态,我们还会对测试引导进行级联。也就是说,每个测试和所有测试套件都在顶部有一个require_once(__DIR__ . '/../bootstrap.php');,一直到基本文件夹级别,它显然读取require_once(__DIR__ . '/bootstrap.php');,并且实际的引导程序文件驻留。 / p>

基本上,我们的测试是自主的。您可以自行调用任何文件夹和任何AllTests.php中的任何*Test.php,它们将以正确的配置运行。

除了没有。 '等一下。'

如果我们要么强制我们的开发人员使用phpunit --configuration=path/to/phpunit.xml,要么他们在phpunit.xml的文件夹中(以便PHPUnit在执行时将其从当前工作目录中拉出),这是唯一的。

有时,这使得很难确定为什么一台开发人员的计算机上的测试正在破坏,以及为什么他们在另一台计算机上运行。只需要忘记引导程序是而不是我们需要拥有相同测试环境的唯一东西。请记住,因为如果你尝试过,你就不会忘记引导程序,因为它在测试本身中,忘记了其他设置,特别是通常是可选的设置(如果你在phpunit.xml的文件夹中,它是自动拉动的,很容易。

事实上 - 它发生了几次。

问题

有没有办法可以提供在运行的测试文件中使用哪个phpunit.xml ,例如在我们方便无处不在的引导程序文件中,而不是将它提供给PHPUnit事先,是通过命令行开关还是在其目录中

粗略地看一下代码表明答案是否定的 - 配置良好且真正似乎在测试文件被拉出之前加载:

[PHPUnit/TextUI/Command.php]
...
if (isset($this->arguments['configuration'])) {
    $configuration = PHPUnit_Util_Configuration::getInstance(
        $this->arguments['configuration']
    );
    $phpunit = $configuration->getPHPUnitConfiguration();
    ...

这确实有意义,因为配置可以包含测试白名单或黑名单。

实际上,在测试引导程序本身中加载测试过滤器是没有意义的,所以这是窗口中可能配置的一半,但PHPUnit的实际行为标志...... < / p>

[sample of part of our phpunit.xml]
<phpunit
    backupGlobals="false" 
    backupStaticAttributes="false" 
    convertErrorsToExceptions="true"  
    convertNoticesToExceptions="true"
    convertWarningsToExceptions="true"
    syntaxCheck="false"
    processIsolation="false"
    colors="true">

...也许除了'colors'之外,我认为测试本身应该可以在某种程度上决定。

......的安慰奖

不可否认,现在我很高兴知道如果有人知道某种方法,我是否可以从bootstrap文件中教授PHPUnit backupGlobals="false"

(如果没有结果,我将追求的实际答案可能是将phpunit.xml复制到所有子文件夹中。我想避免使用该解决方案,因为它会创建冗余副本,如果我们曾经选择更改设置...是的,哎哟!)

3 个答案:

答案 0 :(得分:10)

直接回答:不,你不能这样做。

更长的故事 - 通过改变开发者的习惯可以更好地解决这类问题。

我们这样做:

  • 所有开发人员总是从测试根目录运行测试,该目录具有唯一的phpunit.xml以及所有必要的配置 - 包括bootstrap,它设置了一个类自动加载器。
  • 我们没有这样的测试套件,测试使用目录分组,没有AllTests.php在任何地方,因为它没有必要。 PHPUnit可以使用目录名称并在其中运行所有测试。
  • 它仍然可以通过给出它或整个测试套件的路径来运行任何单个测试(通过提供目录的路径)。它必须始终从测试根目录完成,否则它将无法正常工作。

这样做意味着放弃从任何目录启动PHPUnit的自由,但说实话 - 我觉得这根本不会丢失。

收益更大:管家代码的数量减少,开发人员不会忘记任何事情,因此结果是一致的。

答案 1 :(得分:4)

我的解决方案是添加一个bash函数

function phpu ()
{
  phpunit --colors --bootstrap ~/path/to/bootstrap.php "$@";
}

然后将其添加到所有dev .bashrc文件中,他们可以切换到使用它。

我们希望从vim拨打电话,因此我必须将其添加到.vimrcset shellcmdflag=-ic

然后添加nmap ;t :! phpu %以运行您当前所在的测试文件。

答案 2 :(得分:0)

您可以更新启动脚本(Windows bat文件或* nix上的shell)并在其中包含逻辑以配置phpunit.xml的位置。如果它在当前目录中,请使用它,否则指向主目录。

我同意Anti,但是所有测试都应该始终运行,因为您希望确保即使在目录分支中的更改也不会影响其他代码。因此,始终从树的顶部运行。这也要求测试快速执行,但我对PHPUnit没有真正的问题。

维护每个目录中的PHPUnit.xml将是一个维护噩梦,除非从其他路径进行符号链接以确保只有一个实际文件。