我在捆绑包中添加了一个简单的测试。
正如手册中所建议的,我试图让PHPUnit加载配置:
phpunit -c /app
phpunit.xml看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<!-- http://www.phpunit.de/manual/current/en/appendixes.configuration.html -->
<phpunit
backupGlobals = "false"
backupStaticAttributes = "false"
colors = "true"
convertErrorsToExceptions = "true"
convertNoticesToExceptions = "true"
convertWarningsToExceptions = "true"
processIsolation = "false"
stopOnFailure = "false"
syntaxCheck = "false"
bootstrap = "bootstrap.php.cache" >
<testsuites>
<testsuite name="Project Test Suite">
<directory>../src/*Bundle/Tests</directory>
</testsuite>
</testsuites>
</phpunit>
我得到的错误信息是:
root@h0x03:/var/www/fi/FrontendIntegrator# phpunit -c app/
PHP Fatal error: Uncaught exception 'PHPUnit_Framework_Exception' with message 'Neither "Project Test Suite.php" nor "Project Test Suite.php" could be opened.' in /usr/share/php/PHPUnit/Util/Skeleton/Test.php:102
Stack trace:
#0 /usr/share/php/PHPUnit/TextUI/Command.php(157): PHPUnit_Util_Skeleton_Test->__construct('Project Test Su...', '')
#1 /usr/share/php/PHPUnit/TextUI/Command.php(129): PHPUnit_TextUI_Command->run(Array, true)
#2 /usr/bin/phpunit(49): PHPUnit_TextUI_Command::main()
#3 {main}
thrown in /usr/share/php/PHPUnit/Util/Skeleton/Test.php on line 102
PHPUnit显然加载文件并尝试查找以测试套件名称命名的PHP文件。我找不到任何关于它为什么这样做的信息或者这样的文件应该是什么样的。
答案 0 :(得分:4)
似乎PHPUnit试图找到一个以testsuite-tag的名称属性命名的文件
如果无法找到任何测试(错误的命名或错误的目录)或
如果测试脚本中出现致命错误;这很早就发生了,因此PHPUnit无法将该文件的内容识别为测试 - 因为在此之前不能加载任何类。
答案 1 :(得分:3)
今天我在测试我的控制器时遇到了同样的问题。原来只是按照Book的命令,因为它不起作用,因为PHPUnit找不到测试类。我设法找到了一种解决方法,只需指定您要测试的测试文件,它就可以工作。
phpunit -c app src/Acme/DemoBundle/Tests/Utility/CalculatorTest.php
答案 2 :(得分:1)
我碰巧在我的捆绑包中有一个额外的目录级别。而不是MyVendorName\MyBundleNameBundle
我有MyVendorName\MyProject\MyBundleNameBundle
phpunit.xml.dist
部分testsuites
中的默认目录是:
<testsuites>
<testsuite name="Project Test Suite">
<directory>../src/*/*Bundle/Tests</directory>
<directory>../src/*/Bundle/*Bundle/Tests</directory>
</testsuite>
</testsuites>
但没有一个匹配我的包名称空间:Xmontero\Emperors\AdminBundle
其测试反过来位于src/Xmontero/Emperors/AdminBundle/Tests
目录中。
另外我的所有包都有这种语法,我用其他语法删除了任何包(比如Acme\DemoBundle
)。结果,phpunit
没有找到任何测试。
我这样解决了:就在phpunit.xml.dist
<directory>../src/*/*Bundle/Tests</directory>
我添加了这一行
<directory>../src/*/*/*Bundle/Tests</directory>
所以它写着:
<testsuites>
<testsuite name="Project Test Suite">
<directory>../src/*/*Bundle/Tests</directory>
<directory>../src/*/*/*Bundle/Tests</directory>
<directory>../src/*/Bundle/*Bundle/Tests</directory>
</testsuite>
</testsuites>
......一切正常;)
- 1天后编辑 -
现在,我在运行phpunit -c app --coverage-html myNiceDir
时报告了测试本身的覆盖范围 - 当我希望它只给我测试系统的覆盖范围时。
这是因为whitelist
遵循相同的模式,并且exclude
列表中有一些要添加的内容:
它读到的地方:
<exclude>
<directory>../src/*/*Bundle/Resources</directory>
<directory>../src/*/*Bundle/Tests</directory>
<directory>../src/*/Bundle/*Bundle/Resources</directory>
<directory>../src/*/Bundle/*Bundle/Tests</directory>
</exclude>
我改变了这个:
<exclude>
<directory>../src/*/*Bundle/Resources</directory>
<directory>../src/*/*/*Bundle/Resources</directory>
<directory>../src/*/*Bundle/Tests</directory>
<directory>../src/*/*/*Bundle/Tests</directory>
<directory>../src/*/Bundle/*Bundle/Resources</directory>
<directory>../src/*/Bundle/*Bundle/Tests</directory>
</exclude>
我希望现在它是正确的;)
答案 3 :(得分:0)
我有同样的确切错误,我解决了只是升级我的phpunit版本,我有3.6.10,现在我有4.0.17,它完美和正常工作。 Synfony的书并不完全错误,只是说错误的phpunit版本是必需的。