我正在尝试在Laravel应用程序中运行一些验收测试。虽然功能测试会触发测试环境,但验收测试却没有。它是验收测试的错误还是功能?困扰我的主要问题是,它不是使用(+ populating + cleanup)测试数据库,它只连接到dev数据库(当没有指定其他ENV时使用,例如测试,生产),这个当我多次运行它们时经常会失败。
这是我的配置:
codeception.yml
paths:
tests: app/tests
log: app/tests/_log
data: app/tests/_data
helpers: app/tests/_helpers
settings:
bootstrap: _bootstrap.php
suite_class: \PHPUnit_Framework_TestSuite
colors: true
memory_limit: 1024M
log: true
modules:
config:
Db:
dsn: 'mysql:host=localhost;dbname=testdb'
user: 'root'
password: 'root'
dump: 'app/tests/_data/dump.sql'
populate: true
cleanup: true
acceptance.suite.yml
class_name: WebGuy
modules:
enabled:
- PhpBrowser
- WebHelper
- Db
config:
PhpBrowser:
url: 'http://localhost/'
functional.suite.yml
class_name: TestGuy
modules:
enabled: [Filesystem, TestHelper, Laravel4, Db]
感谢您的帮助!
答案 0 :(得分:7)
"接受"测试不在测试环境中运行。 The reason is when Laravel is in the testing environment, it disables filters by default。因此,测试环境仅适用于单元和功能测试。
验收测试应该在另一个环境中运行(比如开发或特定的Codeception)。
由于Codeception 2.x现在使用Guzzle来获取页面响应,因此可以检测到您在主机上的时间以及Codeception正在执行特定请求。这样你就可以进行测试"环境以及"代码"环境专门为您的验收测试。
如果您使用的是Homestead,我会在我的start.php
文件中执行此操作,以检测Codeception是否正在运行,并特别将其置于“#code”中。环境,否则我让它通常运行我的环境检测
if ((gethostname() === 'homestead') && (isset($_SERVER['REMOTE_ADDR'])) && ($_SERVER['REMOTE_ADDR'] === '127.0.0.1'))
{
$env = $app->detectEnvironment(['codeception' => ['homestead']]);
}
else
{
$env = $app->detectEnvironment(['dev' => ['homestead']]);
}
然后在我的代码中'环境,我设置了一个SQLite文件数据库,并针对它运行验收测试(这比mySQL测试更快)。
答案 1 :(得分:5)
首先,您必须了解在Laravel测试环境中运行的Codeception验收测试不。相反,它使用 Guzzle来发出外部HTTP请求。假设您的验收测试针对localhost运行,那么您正在标准开发环境中运行。就像使用浏览器一样。
也就是说,这是我如何使用Codeception Acceptance测试来运行Laravel测试环境。我在Ubuntu上使用LAMP堆栈运行Vagrant。
修改您的/etc/hosts
文件。将test.localhost
添加到127.0.0.1行。不要删除那里的其他主机。如果您使用WAMP / MAMP /或其他,则可能是类似的设置。
<强>的/ etc /主机强>
127.0.0.1 localhost test.localhost
使用Laravel设置环境处理。下面是larval根目录中bootstrap/start.php
文件中的代码。 注意&#39;测试&#39;线。
<强>自举/ start.php 强>
$env = $app->detectEnvironment(array(
'local' => array('your-machine-name'),
'testing' => array('test.localhost')
));
确保您的代码验收测试配置为访问正确的域/网址。下面的代码来自我自己的API验收测试。注意url:sections有test.localhost。这是Codeception将为测试命中的URL。
应用/测试/ acceptance.suite.yml 强>
class_name: ApiGuy
modules:
enabled: [PhpBrowser, REST, ApiHelper, Db, FileSystem]
config:
PhpBrowser:
url: http://test.localhost/
REST:
url: http://test.localhost/api/v1/
全部放在一起
/etc/hosts
文件,以便Codeception可以找到test.localhost
。编辑Web服务器配置以处理test.localhost超出了本答案的范围。bootstrap/start.php
,以便知道任何进入test.localhost的请求都应该在测试环境中运行。acceptance.suite.yml
文件,告诉它针对http://test.localhost运行所有测试现在,假设上述操作正确完成,您应该能够运行代码运行验收并查看测试的输出。