在 Codeception (Laravel) 中为验收测试设置测试数据库

Are*_*ref 2 php testing acceptance-testing codeception laravel-5

我正在使用 Codeception 框架在 Laravel 5 应用程序中执行验收测试。我想使用单独的数据库进行测试,以防止真实数据库在测试过程中发生变化。我根据 Codeception 文档配置了 .yml 文件。但无论如何,真正的数据库都会受到影响。这是我的配置文件:

/codeception.yml

actor: Tester
 paths:
   tests: tests
    log: tests/_output
    data: tests/_data
   support: tests/_support
   envs: tests/_envs
 settings:
   bootstrap: _bootstrap.php
   colors: true
    memory_limit: 1024M
  extensions:
  enabled:
    - Codeception\Extension\RunFailed
  modules:
  config:
     Db:
        dsn: 'mysql:host=localhost;dbname=realDB'
        user: 'root'
        password: 'secret'
        dump: 'tests/_data/dump.sql'
Run Code Online (Sandbox Code Playgroud)

/tests/acceptance.suite.yml

class_name: AcceptanceTester
modules:
  enabled:
    - WebDriver:
        url: 'http://localhost:8000/'
        browser: firefox
    - Laravel5:
        part: ORM
        cleanup: false # can't wrap into transaction
     Db:
      populate: true
      cleanup: true
    - \Helper\Acceptance
Run Code Online (Sandbox Code Playgroud)

realDB 是真正的数据库,在执行验收测试后会发生变化。我在acceptance.suite.yml 中尝试了不同的清理案例:1) cleanup: false in Laravel module and cleanup: true in Db module 2) cleanup: true in Laravel module and cleanup: true in Db module。Codeception 文档说,对于验收测试,我们需要“禁用清理并使用 Db 模块清理测试之间的数据库”。但无论如何,realDB 都会发生变化。

我尝试了不同的 PHP 测试框架,例如 Laravel 中的 PHPUnit、PHP Selenium 驱动程序、Facebook Web 驱动程序,并且在所有情况下,实际数据库在执行验收测试时都会受到影响。如何正确配置 Codeception 以防止数据库更改?

任何帮助,将不胜感激。

[更新1]

由于@TheFallen 建议我使用不同的数据库进行测试,因此我更改了这样的配置文件:

/codeception.yml

actor: Tester
 paths:
   tests: tests
    log: tests/_output
    data: tests/_data
   support: tests/_support
   envs: tests/_envs
 settings:
   bootstrap: _bootstrap.php
   colors: true
    memory_limit: 1024M
  extensions:
  enabled:
    - Codeception\Extension\RunFailed
  modules:
  config:
     Db:
        dsn: 'mysql:host=localhost;dbname=testDB'
        user: 'root'
        password: 'secret'
        dump: 'tests/_data/dump.sql'
Run Code Online (Sandbox Code Playgroud)

/tests/acceptance.suite.yml

class_name: AcceptanceTester
modules:
  enabled:
    - WebDriver:
        url: 'http://localhost:8000/'
        browser: firefox
    - Laravel5:
        part: ORM
        environment_file: .env.testing
        cleanup: true
     Db:
      populate: true
      cleanup: true
    - \Helper\Acceptance 
Run Code Online (Sandbox Code Playgroud)

/.env.testing

APPLICATION_URL=http://localhost:8000
APP_DEBUG=true
APP_ENV = testing
MYSQL_MAIN_HOST=localhost
MYSQL_MAIN_DATABASE=realDB
MYSQL_MAIN_USER=root
MYSQL_MAIN_PASSWORD=secret 
CACHE_DRIVER=array 
DB_CONNECTION=test_mysql
TEST_MYSQL_MAIN_DATABASE=testDB
Run Code Online (Sandbox Code Playgroud)

/config/database.php

return [

    'fetch' => PDO::FETCH_CLASS,

    'default' => env('DB_CONNECTION', 'mysql'),

    'connections' => [

        'test_mysql' => [
            'driver'    => 'mysql',
            'host'      => env('MYSQL_MAIN_HOST', 'localhost'),
            'database'  => env('TEST_MYSQL_MAIN_DATABASE', 'testDB'),
            'username' => env('MYSQL_MAIN_USER', 'root'),
            'password' => env('MYSQL_MAIN_PASSWORD', ''),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ],
...
Run Code Online (Sandbox Code Playgroud)

.env.testing 位于 Laravel 应用程序的根目录中。但是真实数据库(realDB)仍然受到影响,只有转储文件被导入测试数据库(testDB)。看起来应用程序不使用 .env.testing。我怎样才能解决这个问题?

请注意,在我的验收测试中,发送 AJAX 请求以调用更改数据库中数据的函数。我想回滚由 AJAX 请求完成的数据库事务。

[更新2]

根据Codeception 文档,验收测试将在使用真实 Web 服务器的开发环境中执行,因此无法将 .env.testing 中的设置传递给它们。:(

在我为解决这个问题所做的一切之后,我得出的结论是,除非我将默认数据库更改为在 .env 文件中测试数据库,否则在执行验收测试触发 AJAX 请求以执行数据库事务后,不可能阻止真实数据库发生变化!

如果有人有更好的解决方案,请分享!

wmi*_*ski 5

由于您的 Laravel 应用程序可以在多个域下运行,因此请创建一个专用于验收测试并配置服务器APP_ENV=acceptance为该特定域设置环境变量(或您称之为的任何名称)。当APP_ENV设置Laravel会自动加载正确的环境文件给你,在这种情况下.env.acceptance

我还看到人们使用 cookie(在验收测试的早期设置)来配置 Laravel 以根据这些 cookie 切换数据库。它看起来有点脏而且可能不安全,而且你最终会向你的应用程序核心添加代码,所以......