Codeception中的验收测试是否应该在测试环境中运行? (Laravel4 + Codeception)

时间:2014-02-19 01:43:27

标签: laravel-4 acceptance-testing codeception

我正在尝试在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]

感谢您的帮助!

2 个答案:

答案 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。

  1. 修改您的/etc/hosts文件。将test.localhost添加到127.0.0.1行。不要删除那里的其他主机。如果您使用WAMP / MAMP /或其他,则可能是类似的设置。

    <强>的/ etc /主机

    127.0.0.1 localhost test.localhost

  2. 使用Laravel设置环境处理。下面是larval根目录中bootstrap/start.php文件中的代码。 注意&#39;测试&#39;线。

    <强>自举/ start.php

    $env = $app->detectEnvironment(array(
        'local' => array('your-machine-name'),
        'testing' => array('test.localhost')
    ));
    
  3. 确保您的代码验收测试配置为访问正确的域/网址。下面的代码来自我自己的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/
    
  4. 全部放在一起

    1. 我们编辑了/etc/hosts文件,以便Codeception可以找到test.localhost。编辑Web服务器配置以处理test.localhost超出了本答案的范围。
    2. 我们编辑了Laravel的bootstrap/start.php,以便知道任何进入test.localhost的请求都应该在测试环境中运行。
    3. 我们编辑了Codeception的acceptance.suite.yml文件,告诉它针对http://test.localhost运行所有测试
    4. 现在,假设上述操作正确完成,您应该能够运行代码运行验收并查看测试的输出。