【问题标题】:PHPUnit - suffix argument ignored in directory tag under testsuitePHPUnit - 在测试套件下的目录标记中忽略后缀参数
【发布时间】:2021-09-01 12:12:28
【问题描述】:

我最近意识到我不能一次运行所有的 phpunit 测试,除非我使用“php artisan test”,我不明白为什么。我会使用其他选项,但我无法使用它。

我认为这与我的配置文件错误有关,因为语法更改,或者我的目录设置错误等等,因为我找不到其他任何东西。

找到了套件,但没有应用后缀,无论我将其写为“.php”还是“Tests.php”或其他任何内容。我知道,因为如果我在最后用 Test 而不是 Tests 重命名所有测试文件,那么它们会突然被 phpunit 识别。我还尝试了所有数量的目录选项,例如“./tests/Unit”和“./tests/Unit/*”,但无济于事。

如果有人知道发生了什么,我将非常感谢一些帮助,因为这让我发疯了。我花了一天的时间才发现我需要重命名我的文件才能让它工作,在这一点上我什至不想这样做,除非我绝对必须这样做,因为有这个后缀功能。

我只是想了解它为什么不起作用,以及如何正确使用它,希望能够学习如何正确使用phpunit。

【问题讨论】:

  • 我无法重现该问题。如果我使用<directory suffix=".php">./tests</directory>,我的测试工作得很好。我不使用php artisan test,因为我在Windows 7 上并且颜色不起作用。我改用./vendor/bin/phpunit --testdox,但我怀疑这会改变什么。

标签: php laravel phpunit


【解决方案1】:

我知道,因为如果我将所有测试文件重命名为末尾的 Test 而不是 Tests,那么它们会突然被 phpunit 识别。

这听起来像是 phpunit 的默认配置,可能表明您试图控制行为的配置文件没有有效。也就是说,无论你如何运行 Phpunit,它都没有配置文件和路径,例如:

/path/to/phpunit -- /path/to/test/directory

Phpunit 然后将使用默认配置 - 但它必须在工作目录中找到它。因此,要么配置文件的名称与 phpunit 用于自动检测的名称不同,要么它们不在工作目录中,phpunit 将在不加载配置文件的情况下启动,并仅执行在默认后缀的目录中可以找到的内容“Test.php”。

(在 Phpstorm 中,调用 Phpunit 时工作目录可能会有所不同,即使在同一操作的运行之间也是如此,但这只是作为注释。)

您可以在 Phpstorm 中做什么:配置要加载的 Phpunit 配置文件。一个好的方法是在 Settings -> PHP -> Test Frameworks 中的 Test 中指定一个默认的 Phpunit 配置文件默认配置文件的Runner部分。

另一件事是在您已经创建的运行操作中明确指定工作目录,但该操作不执行您想要的操作,或者通过修改 Phpunit 运行操作模板。这是模板的屏幕截图:

检查有效性的一种方法是在配置中使用引导文件并使其爆炸。然后你就知道某事是否有效。

如果配置文件正在使用,PHpunit 通常也会写出配置文件的名称。

【讨论】:

  • 您好,感谢您尝试跟进,但我 100% 确定使用了正确的配置文件并且有效。我的测试套件已列出,我可以生成覆盖率。唯一被忽略的似乎是目录标签上的后缀属性。老实说,我不认为我可以在不拔头发的情况下调试为什么会发生这种情况,因为我已经花了整整 2 天的时间来调查这个后果较少的问题。所以我重命名了它们并称之为一天,因为其他一切都有效。但是感谢您的兴趣和努力,感谢它:)
  • @VladMB:是的,只是配置。一旦设置它实际上工作。有时,人们可能会在故障排除中迷失方向。一种方法是在 Phpunit 中使用非标准配置文件。或者使用较新的版本从头开始重新初始化以获得不同的探针。 - 如果您使用它,请注意 IDE 中的任何额外配置。
【解决方案2】:

没有办法修复后缀。我尝试重新安装 xdebug、php 和 phpstorm。正如我所说,我最终只是重命名了文件。我能找到唯一可行的解​​决方案。

【讨论】:

    【解决方案3】:

    我可以看到两个潜在的原因:

    1) 您的phpunit.xml 可能配置不正确。

    尝试更改“testsuite”和“coverage”部分,如下所示:

    <testsuites>
        <testsuite name="Unit">
            <directory suffix="Test.php">./tests/Unit</directory>
        </testsuite>
    
        <testsuite name="Feature">
            <directory suffix="Test.php">./tests/Feature</directory>
        </testsuite>
    </testsuites>
    <coverage processUncoveredFiles="true">
        <include>
            <directory suffix=".php">./app</directory>
        </include>
    </coverage>
    

    2) 确保所有测试方法都在方法的 DocBlock 中使用 @test 注释:

    /** @test */
    public function your_test_method_name()
    {
        ...
    }
    

    见:https://phpunit.readthedocs.io/en/9.5/annotations.html

    作为在测试方法名称前加上 test 前缀的替代方法,您可以在方法的 DocBlock 中使用 @test 注解将其标记为测试方法。

    如果您不包含文档块,请确保您的测试方法名称以“test”开头:

    public function test_method_name()
    {
        ...
    }
    

    见:https://phpunit.readthedocs.io/en/9.5/writing-tests-for-phpunit.html

    测试是名为 test* 的公共方法。

    【讨论】:

    • 嗨,好吧,我所有的测试都以 test 开头,尽管名称是驼峰式的。我之前尝试将注释添加到没有结果。我尝试了您提供的示例 xml,但它不起作用。即使我将后缀更改为“Tests.php”,这也是我的文件的结束方式。我可以使用 PHPStorm 在类中单独运行测试,或者只在一个类中运行测试。因此它们被视为测试和测试类。但是 phpunit 在使用命令行和测试套件时会忽略它们。后缀没有任何作用,我不明白为什么......
    • @VladMB 我已经更新了我的答案。请尝试我在您的phpunit.xml 中提供的配置。由于您所有的测试都在“Unit”文件夹中,因此您的配置应该反映这一点。默认情况下,Laravel 还提供了一个“Feature”文件夹。您也可以对其进行配置,以备日后需要时使用。
    • 嘿,感谢您的更新,但我以它为例。我按顺序排列了文件路径,但这不是问题。另外,我是之前删除 Feature 文件夹的人,因为我不需要它。正如我所说,检测到文件夹,只是未应用的后缀。如果我制作一个以 Test.php 结尾的测试文件,它就可以工作。老实说,我现在只是将其作为一种解决方法,但我觉得我被剥夺了应该并且以前有效的功能。可能重新安装我所有的开发环境将是让它工作的最可靠的方法。谢谢你的努力:)
    • @VladMB 感谢您的跟进。万事如意!
    猜你喜欢
    • 1970-01-01
    • 2011-07-27
    • 2023-01-18
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 2022-11-17
    相关资源
    最近更新 更多