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

64

根据我所读的,似乎我应该能够设置一个文件夹,例如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

我希望这是一个相当标准的phpunit安装,通过PEAR完成,遵循这些指令http://www.newmediacampaigns.com/page/install-pear-phpunit-xdebug-on-macosx-snow-leopard,在OS X Snow Leopard上。

$ 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
谢谢,但我已经解决了(请看我的回答)。既然你给我提供了问题跟踪器的链接,我会提交一个工单,看看他们是否会更新他们的文档。 - jsdalton
3个回答

77

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

你有一个目录,其中包含许多 .php 文件,它们都包含了测试用例。

但随着测试套件的扩大,你可能希望在 tests 目录中放置其他纯粹用于支持测试的 .php 文件,这些文件不应由 PHPUnit 自身执行。

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

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

如果你真的想改变这种行为,你可以创建一个名为 phpunit.xml 的文件并将其放置在 tests 目录中,并写入以下内容:

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

一旦你做到了这一点,PHPUnit将运行所有以“ .php”结尾的文件(在这个上下文中,文件扩展名被认为是文件名的一部分)。

但最好还是习惯这个约定并相应地命名你的测试。


7
同意。我不认为phpunit的行为是错误的,只是这个要求在文档中没有明确说明,因此我花了大约一个小时来尝试解决这个问题。我已经提交了一张工单,维护者已经承诺更新文档并进行了补丁。 - jsdalton
太好了,文档改进总是有用的 :) - Anti Veeranna
我无法让它正常工作。我仍然得到“0个测试运行”的结果。 - Jonathan
我稍微有些不同意。我经常会创建一个 tests/commontests/unit/... 文件夹,这样公共的/设置函数就不会和其他测试文件放在一起了。 - JoSSte
那么 PHPUnit 如何知道它需要运行哪些文件,哪些不需要呢?我认为这很容易,只有那些 extends TestCase 的类。 - AaA

51

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

phpunit .
或者
phpunit your_test_folder/.

3
如果您不希望您的文件名以Test.php结尾,您可以使用--test-suffix=anything.php来覆盖它。 - checksum
1
重要提示:你的测试需要命名为 Test,而不是 Tests!这个问题让我浪费了几天时间 ;) - Sliq

29

有一个很烦人的小毛病,但我已经想通了。

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


6
虽然它可能不是加粗的,但这是文档中第一个示例测试的第一点。 “1. 为一个类Class编写的测试应该放在一个名为ClassTest的类中。” http://phpunit.de/manual/current/en/phpunit-book.html#writing-tests-for-phpunit - Digital Fu
说实话,这并没有明确说明文件必须命名为"ClassTest.php"。这也稍微让我困惑了一下。 - Evan Lesmez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接