所以我在laravel的单元测试中有一个非常奇怪的问题。我想要做的是一些基本的单元测试,所以我有一个单独的类设置我的测试。当我有一个运行测试的方法时,测试工作完美。这堂课看起来像这样:
class Pixel_BasicTest extends Illuminate\Foundation\Testing\TestCase {
public function createApplication()
{
$app = require __DIR__.'/../bootstrap/app.php';
$app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
return $app;
}
public function testRoutes(){
echo "Start of testRoutes\n";
//Test all the GET routes we have
$routeCollection = Route::getRoutes();
$num_404s = 0;
$path_404s = [];
...various other code that does some tests, these all work right
}
}
现在,当我尝试添加其他功能时会出现问题。我的班级现在看起来像这样:
class Pixel_BasicTest extends Illuminate\Foundation\Testing\TestCase {
public function createApplication()
{
$app = require __DIR__.'/../bootstrap/app.php';
$app->make('Illuminate\Contracts\Console\Kernel')->bootstrap();
return $app;
}
public function testRoutes(){
echo "Start of testRoutes\n";
//Test all the GET routes we have
$routeCollection = Route::getRoutes();
$num_404s = 0;
$path_404s = [];
...various other code that does some tests, these all work right
}
public function testSecondThing() {
echo "Start of testSecondThing";
...some code testing something else
}
}
现在,我知道第二个函数的代码有效,因为当我将该代码放在第一个函数中,并完全删除第二个函数时,测试运行完美。但是,当我将代码放在第二个函数中时,它会失败,我的终端窗口如下所示:
Mikes-MacBook-Air-96:hq pixelmember$ ./vendor/bin/phpunit -v --debug
PHPUnit 4.8.29 by Sebastian Bergmann and contributors.
Runtime: PHP 5.6.10
Configuration: /Users/pixelmember/Documents/hq/phpunit.xml
Starting test 'Pixel_BasicTest::testRoutes'.
.Start of testRoutes
End of testRoutes
Starting test 'Pixel_BasicTest::testAfterschool'.
Mikes-MacBook-Air-96:hq pixelmember$
正如您所看到的,它进入第二个功能,只是停止或失败或其他东西。没有错误消息,我也没有看到我在函数开头的代码中写的消息(echo" Starting testSecondThing()" part)
我老老实实地不知所措。我现在可以在没有单元测试的情况下完成,并且可以在我的应用程序的其他部分工作,但我真的希望能够使用单元测试而不必将我的每一个测试都放在一个函数中。
如果它有帮助,这是我的phpunit.xml文件。也许有人可以在这里看到一些东西:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="bootstrap/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false">
<testsuites>
<testsuite name="Application Test Suite">
<file>./tests/Pixel_BasicTest.php</file>
</testsuite>
</testsuites>
<filter>
<blacklist>
<directory>./vendor</directory>
</blacklist>
</filter>
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="DB_DATABASE" value="test"/>
<env name="DB_USERNAME" value="root"/>
<env name="DB_PASSWORD" value=""/>
</php>
除了添加一些与数据库相关的环境变量之外,我没有真正编辑或更改此文件的大部分内容。
编辑:我修复了我的问题,请参见下面的内容
答案 0 :(得分:2)
如果有人需要类似问题的帮助,我为解决我的问题所做的就是更改我的phpunit.xml文件。我将设置“processIsolation”更改为true,因此我的phpunit.xml文件现在看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="bootstrap/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="true"
stopOnFailure="false"
syntaxCheck="false">
<testsuites>
<testsuite name="Application Test Suite">
<file>./tests/Pixel_BasicTest.php</file>
</testsuite>
</testsuites>
<filter>
<blacklist>
<directory>./vendor</directory>
</blacklist>
</filter>
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="DB_DATABASE" value="test"/>
<env name="DB_USERNAME" value="root"/>
<env name="DB_PASSWORD" value=""/>
</php>
</phpunit>
我仍然很好奇为什么这个有效,这个设置到底是什么?我知道这会在单独的PHP过程中运行每个测试,但我不确定为什么这有助于/修复问题,如果这确实解决了我的问题,或者我将在以后遇到更多问题。
如果对PHPUnit有更多经验的人可以对此有所了解,那将非常感激。
编辑:我使用的文档的一些链接: phpunit.xml配置文件: https://phpunit.de/manual/current/en/appendixes.configuration.html 某些设置的定义: https://phpunit.de/manual/current/en/textui.html#textui.clioptions