2014-02-19 59 views
6

我想在我的Laravel应用程序中运行一些验收测试。虽然功能测试触发测试环境,但验收测试不会。它是验收测试的缺陷还是特征?这个困扰我的主要问题是,它没有使用(+填充+清理)测试数据库,它只连接到dev数据库(当没有指定其他ENV时,例如测试,生产时使用)当我多次运行这些测试时经常会失败。在Codeception中的验收测试是否应该在测试环境中运行? (Laravel4 + Codeception)

这是我的配置:

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

我有这个相同的问题。我的代码验收测试不会在'测试'环境下运行。我试图将Laravel4包含在acceptance.suite.yml中 - 这并没有改变任何东西。 – Laurence

+0

从我可以告诉 - Codeception运行每个测试的'两''周期。其中一个作为'测试'环境运行,但另一个不在'测试'环境中运行。我可以证实这一点 - 因为如果你强制两个测试在'测试'环境中运行,那么你的路由不能正常工作(因为它们通常是禁用测试的)。 – Laurence

+0

@Fabrizio - 你需要什么额外的信息?我已经提供了答案? – Laurence

回答

7

“验收”测试不在测试环境中运行。 The reason is when Laravel is in the testing environment, it disables filters by default。因此,测试环境仅适用于单元和功能测试。

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

由于Codeception 2.x现在使用Guzzle获取页面响应,因此可以检测到您在主机上的时间,并且Codeception正在执行特定请求。通过这种方式,您可以拥有“测试”环境以及专门用于验收测试的“验证”环境。

如果使用的是家园,我这样做,我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测试更快)。

+0

我有同样的问题,但我使用Behat和MAMP。 你知道我该如何正确设置环境? 我已经有一个* _接受数据库和指向正确的数据库的配置/接受文件夹。 在我的featureContext.php文件中,我将环境设置为“接受”。 当测试运行Behat使用我的本地数据库。 :( 在此先感谢。 –

+0

这似乎没有工作,是否有围绕此进一步的解释? – DavidT

5

首先,您必须了解在Laravel测试环境中运行的代码验收测试不需要。相反,它使用Guzzle来发出外部HTTP请求。假设您的验收测试针对本地主机运行,则您正在标准开发环境中运行。这就像使用你的浏览器。

这就是说,这里是我如何使用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为测试所打的网址。

    应用程序/测试/ 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运行验收,看看你的测试输出。

相关问题