【问题标题】:phpunit does not find any tests with director xml tag, but does with (some) file tagsphpunit 没有找到任何带有 director xml 标签的测试,但是有(一些)文件标签
【发布时间】:2013-02-21 08:51:40
【问题描述】:

我有这个配置:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit
    backupGlobals               = "false"
    backupStaticAttributes      = "false"
    colors                      = "false"
    convertErrorsToExceptions   = "true"
    convertNoticesToExceptions  = "true"
    convertWarningsToExceptions = "true"
    processIsolation            = "false"
    stopOnFailure               = "false"
    stopOnError                 = "false"
    stopOnIncomplete            = "false"
    syntaxCheck                 = "false"
    bootstrap                   = "test_bootstrap.php"
    >

  <testsuites>
      <testsuite name="UnitTests">
          <file>unit/api/2/ApiControllerTest.php</file>
          <file>unit/api/2/RoutesTest.php</file>
   </testsuite>

它运行测试文件。如果我用

替换文件
<directory>unit</directory>
// or
<directory>unit/api/2</directory>
// or
<directory>unit/api/2/*</directory>
// or
<directory>unit/api/2/*Test.php</directory>
// or
<directory suffix="Test.php">unit/api/2</directory>

它只是说:没有执行任何测试!

请问有什么问题吗?

Ubuntu 12.04 LTS、php 5.3.10、phpunit 3.7.16

【问题讨论】:

  • 这是你的整个文件吗?如果 ApiControllerTest.php,您介意添加类定义吗?

标签: php phpunit


【解决方案1】:

相对于unit 目录的路径在哪里是phpunit.xml 文件?

如果你的路径看起来像这样:

projectroot
|- phpunit.xml
|- unit/
   |- api/

您可以尝试在phpunit.xml 中将目录设置为以下:

<directory>./unit</directory>

然后像这样从 root 运行 phpunit:phpunit -c phpunit.xml

如果这不起作用,则说明其他问题。如果你运行这个会发生什么:

phpunit ./unit/api/2

如果没有运行测试,请回答以下问题:

  • 也许您在测试用例中的方法不是以“test”开头的?
  • 是否所有测试用例文件都以 Test.php 结尾?
  • 是否所有测试用例类都扩展了 PHPUnit_Framework_TestCase?
  • 是否所有测试用例类名都以“Test”结尾?

【讨论】:

  • ./unit 不会更改 xml 或控制台中的任何内容。所有四个问题的答案是,当我使用直接指向文件而不是目录时,它已正确设置并且测试全部运行。
【解决方案2】:

PHPUnit 的 suffix 属性默认为“Test.php”,这可能不是很明显。如果您的测试不使用此后缀(例如,它使用 TestUser.php 或 /test/User.php,而不是 UserTest.php),则将跳过测试。

如果您确定目标目录存在,请检查您的文件是否与 PHPUnit 使用的选定后缀匹配。

【讨论】:

    【解决方案3】:

    这可能有点取决于 Phpunit 的版本。

    我可以让它与另外两个较旧的版本(3.7.22 和 3.7.38)一起工作,但之前遇到了类似的问题。这是我的解决方案:

    我首先是目录配置错误:

        <testsuites>
                <testsuite name="Default">
                        <directory>/tests</directory>
                </testsuite>
        </testsuites>
    

    正如您在这个错误示例中看到的,它的前缀是斜杠(“/”)。删除该斜线会产生以下 XML 摘录,然后可以正常工作:

        <testsuites>
                <testsuite name="Default">
                        <directory>tests</directory>
                </testsuite>
        </testsuites>
    

    确保目录没有以斜线为前缀并且它存在。存在部分至关重要,因为如果 Phpunit 测试运行程序不存在,它将不会显示错误消息。您只会看到没有执行任何测试。

    没有执行任何测试!


    以你的问题为例:

    1. &lt;directory&gt;unit&lt;/directory&gt;:失败是因为目录不存在(你认为它存在,我知道,但如果目录不存在,它就会失败,Phpunit 没有在骗你)。
    2. &lt;directory&gt;unit/api/2&lt;/directory&gt;:如果失败,是因为目录不存在而失败(你认为是,我知道,但如果目录不存在,它就会失败,Phpunit 不是在骗你)。
    3. &lt;directory&gt;unit/api/2/*&lt;/directory&gt;:这总是会失败,因为目录不存在。大多数文件系统不允许在目录名和文件名中使用“*”字符。
    4. &lt;directory&gt;unit/api/2/*Test.php&lt;/directory&gt;:这里也是,这不是一个有效的目录名,因为目录不存在而失败。
    5. &lt;directory suffix="Test.php"&gt;unit/api/2&lt;/directory&gt;:如果失败,是因为目录不存在而失败(你认为是,我知道,但如果目录不存在,它就失败了,Phpunit 不是在骗你)。此外,值为“Test.php”的 suffix 参数是多余的,因为这是默认后缀。因为它是多余的,所以它是多余的,您应该从 XML 文件中删除它。

    没有软件是没有错误的,这自然也适用于 Phpunit,但您首先应该考虑到 Phpunit 并没有对您撒谎。

    在我更正目录配置后,我自己对记录的两个版本没有任何问题。你的旅费可能会改变。这特别适用于第 1、2 和 5 点:从您的问题看来,这些目录确实存在,但从您给出的描述以及我可以看到的 Phpunit 行为是什么,这些目录不存在。

    第 3 点和第 4 点应该很清楚,它们根本不起作用,因为您将通配符放入目录名称中,该目录名称旨在描述具体路径,而不是暗示打算/允许使用通配符。您也可以在之前的问答问题中找到这一点:Attempting to run Phpunit with a configuration XML file results in exception


    此答案中的信息基于

    • Sebastian Bergmann 的 PHPUnit 3.7.22 和 3.7.38。
    • php.net 提供的 PHP 5.4.36

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-13
      • 1970-01-01
      • 2021-04-25
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多