6

我正在尝试在我的 Laravel 应用程序中运行一些验收测试。虽然功能测试会触发测试环境,但验收测试不会。它是一个错误还是验收测试的一个特性?这让我感到困扰的主要问题是,它没有使用(+填充+清理)测试数据库,它只连接到开发数据库(当没有指定其他 ENV 时使用它,例如测试、生产)和这个当我多次运行这些测试时,它们经常失败。

这是我的配置:

密码接收.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

验收套件.yml

class_name: WebGuy
modules:
    enabled:
        - PhpBrowser
        - WebHelper
        - Db
    config:
        PhpBrowser:
            url: 'http://localhost/'

功能套件.yml

class_name: TestGuy
modules:
    enabled: [Filesystem, TestHelper, Laravel4, Db]

谢谢你的帮助!

4

2 回答 2

7

“验收”测试不在测试环境中运行。原因是 Laravel 在测试环境中默认禁用过滤器。因此,测试环境仅用于单元和功能测试。

验收测试应该在另一个环境中运行(例如开发或 Codeception 的特定环境)。

由于 Codeception 2.x 现在使用 Guzzle 来获取页面响应,因此可以检测您何时在主机上并且 Codeception 正在执行特定请求。这样,您就可以拥有一个“测试”环境以及一个专门用于验收测试的“代码接收”环境。

如果您使用的是 Homestead,我会在我的start.php文件中执行此操作以检测 Codeception 是否正在运行,并专门将其放入“codeception”环境中,否则我让它正常运行我的环境检测

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']]);
}

然后在我的“codeception”环境中,我设置了一个 SQLite 文件数据库,并针对它运行验收测试(这比 mySQL 测试更快)。

于 2014-06-14T02:37:16.057 回答
5

首先,您必须了解 Codeception 验收测试不会在 Laravel 测试环境中运行。相反,它使用Guzzle 发出外部 HTTP 请求。假设您的验收测试针对 localhost 运行,那么您正在标准开发环境中运行。就像使用浏览器一样。

也就是说,这就是我如何使用 Codeception 验收测试在 Laravel 测试环境中运行。我在 Ubuntu 上使用 LAMP 堆栈运行 Vagrant。

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

    /etc/hosts

    127.0.0.1 localhost test.localhost

  2. 使用 Laravel 设置你的环境处理。以下是bootstrap/start.php您的幼虫根目录中的文件中的代码。注意“测试”行。

    引导程序/start.php

    $env = $app->detectEnvironment(array(
        'local' => array('your-machine-name'),
        'testing' => array('test.localhost')
    ));
    
  3. 确保您的 codeception 验收测试配置为命中正确的域/url。下面的代码来自我自己的 API 验收测试。注意 url: 部分有 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/
    

把它们放在一起

  1. 我们编辑了/etc/hosts文件,以便 Codeception 可以找到test.localhost. 编辑您的 Web 服务器配置以处理 test.localhost 超出了此答案的范围。
  2. 我们编辑了 Laravel bootstrap/start.php,让它知道进入 test.localhost 的任何请求都应该在测试环境中运行。
  3. 我们编辑了 Codeception 的acceptance.suite.yml文件,告诉它针对http://test.localhost运行所有测试

现在,假设上述操作正确,您应该能够运行 codeception 运行验收并查看测试的输出。

于 2014-08-06T00:01:11.657 回答