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 请求以执行数据库事务后,不可能阻止真实数据库发生变化!
如果有人有更好的解决方案,请分享!
由于您的 Laravel 应用程序可以在多个域下运行,因此请创建一个专用于验收测试并配置服务器APP_ENV=acceptance
为该特定域设置环境变量(或您称之为的任何名称)。当APP_ENV
设置Laravel会自动加载正确的环境文件给你,在这种情况下.env.acceptance
。
我还看到人们使用 cookie(在验收测试的早期设置)来配置 Laravel 以根据这些 cookie 切换数据库。它看起来有点脏而且可能不安全,而且你最终会向你的应用程序核心添加代码,所以......
归档时间: |
|
查看次数: |
4548 次 |
最近记录: |