如何让 phpunit 从文件夹中的所有文件运行测试?

Posted

技术标签:

【中文标题】如何让 phpunit 从文件夹中的所有文件运行测试?【英文标题】:How can i get phpunit to run tests from all files in a folder? 【发布时间】:2011-05-02 02:58:43 【问题描述】:

根据我的阅读,似乎我应该能够设置一个文件夹,例如tests/ ,将一些带有单元测试类的文件放入其中,然后在该文件上运行 phpunit 并让它找到并运行测试。

无论出于何种原因,在我的安装中(在 OS X 上),它认为文件夹 tests/ 是一个文件,或者看起来是这样的:

$ ls tests
test1.php test2.php
$ phpunit tests/test1.php
PHPUnit 3.5.3 by Sebastian Bergmann.

F

Time: 0 seconds, Memory: 5.00Mb

There was 1 failure:

1) FailingTest::testFail
Your test successfully failed!

/Users/****/tmp/tests/test1.php:4

FAILURES!
Tests: 1, Assertions: 0, Failures: 1.
$ phpunit tests/test2.php
PHPUnit 3.5.3 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 5.00Mb

OK (1 test, 1 assertion)
$ phpunit tests
PHP Fatal error:  Uncaught exception 'PHPUnit_Framework_Exception' with message 'Neither "tests.php" nor "tests.php" could be opened.' in /usr/local/PEAR/PHPUnit/Util/Skeleton/Test.php:102
Stack trace:
#0 /usr/local/PEAR/PHPUnit/TextUI/Command.php(157): PHPUnit_Util_Skeleton_Test->__construct('tests', '')
#1 /usr/local/PEAR/PHPUnit/TextUI/Command.php(129): PHPUnit_TextUI_Command->run(Array, true)
#2 /usr/local/bin/phpunit(53): PHPUnit_TextUI_Command::main()
#3 main
  thrown in /usr/local/PEAR/PHPUnit/Util/Skeleton/Test.php on line 102

Fatal error: Uncaught exception 'PHPUnit_Framework_Exception' with message 'Neither "tests.php" nor "tests.php" could be opened.' in /usr/local/PEAR/PHPUnit/Util/Skeleton/Test.php:102
Stack trace:
#0 /usr/local/PEAR/PHPUnit/TextUI/Command.php(157): PHPUnit_Util_Skeleton_Test->__construct('tests', '')
#1 /usr/local/PEAR/PHPUnit/TextUI/Command.php(129): PHPUnit_TextUI_Command->run(Array, true)
#2 /usr/local/bin/phpunit(53): PHPUnit_TextUI_Command::main()
#3 main
  thrown in /usr/local/PEAR/PHPUnit/Util/Skeleton/Test.php on line 102

我希望在 OS X Snow Leopard 上按照这些说明 http://www.newmediacampaigns.com/page/install-pear-phpunit-xdebug-on-macosx-snow-leopard,通过 PEAR 进行相当标准的 phpunit 安装。

$ pear version
PEAR Version: 1.9.1
PHP Version: 5.3.2
Zend Engine Version: 2.3.0
Running on: **** 10.4.0 Darwin Kernel Version 10.4.0: Fri Apr 23 18:28:53 PDT 2010; root:xnu-1504.7.4~1/RELEASE_I386 i386
$ phpunit --version
PHPUnit 3.5.3 by Sebastian Bergmann.

我希望其他人遇到这个问题,这只是一个简单的修复,或者我只是做错了什么?

【问题讨论】:

谢谢,但我想通了(见我的回答)。既然你将我链接到问题跟踪器,我将提交一张票,看看他们是否会更新他们的文档。 【参考方案1】:

这不是错误,这是一个特性。

您有一个充满 .php 文件的目录,在您的情况下,它们都包含测试用例。

但是随着您的测试套件的增长,您可能希望在测试目录中包含其他 php 文件,这些文件不包含测试,仅用于支持测试。这些文件不应该由 PHPUnit 本身执行。

这是一种非常常见的情况。

那么 PHPUnit 怎么知道它需要运行哪些文件,哪些不需要呢? 检查文件名后缀是一种选择 - 默认情况下,PHPUnit 将名称以 Test.php 结尾的所有内容视为测试并忽略其他所有内容

如果你真的愿意,你可以改变这种行为——通过在你的测试目录中创建一个名为 phpunit.xml 的文件,其中包含以下内容

<?xml version="1.0" encoding="utf-8" ?>
<phpunit>
<testsuite name='Name your suite'>
    <directory suffix='.php'>./</directory>
</testsuite>
</phpunit>

完成后,PHPUnit 将运行所有文件名末尾带有“.php”的文件 (在这种情况下,文件扩展名被认为是文件名的一部分)

但最好习惯于约定并相应地命名您的测试。

【讨论】:

同意。我不认为 phpunit 的行为是不正确的,只是这个要求在任何地方的文档中都没有明确说明,因此我陷入了一个兔子洞,试图解决这个问题大约一个小时。我提交了一张票,维护者已经提交了一个补丁来澄清它。 太好了,文档改进总是有用的:) 我无法让它工作。我仍然收到0 tests run 我有点不同意。我经常创建 tests/commontests/unit/... 文件夹,因此常用/设置功能永远不会与其余测试一起出现在文件夹中【参考方案2】:

在文件夹上运行测试的更简单方法是在所有测试的末尾添加“Test.php”并像这样运行 phpunit 指定你的文件夹

phpunit .

phpunit your_test_folder/.

【讨论】:

如果您不希望文件夹中的文件名以Test.php 结尾,您可以运行--test-suffix=anything.php 来覆盖它。 重要提示:您的测试需要命名为Test不是Tests!为我杀了几天;)【参考方案3】:

烦人的小怪癖,但我想通了。

至少在默认配置下,测试文件必须以“Test.php”结尾,例如。 fooTest.php,或者测试运行器找不到它们。

【讨论】:

它可能不是粗体,而是文档中第一个示例测试的第一点。 “1. 类 Class 的测试进入类 ClassTest。” phpunit.de/manual/current/en/…

以上是关于如何让 phpunit 从文件夹中的所有文件运行测试?的主要内容,如果未能解决你的问题,请参考以下文章

如何运行我所有的 PHPUnit 测试?

Cygwin和PHPUnit:无法打开输入文件:/ cygdrive / c / xampp / php / phpunit

如何从 phpunit.xml 而不是应用程序配置文件访问环境变量

Laravel phpunit 跳过自定义测试文件

如何使用 phpunit 在 Laravel 4 中测试命名空间对象

laravel 4 无法让 phpunit 测试工作