我正在使用Codeception框架在Laravel5应用程序中执行验收测试。我想使用一个单独的数据库进行测试,以防止真实数据库在测试中发生变化。我配置了服务器。基于Codeception文档的yml文件。但真正的数据库无论如何都会受到影响。这是我的配置文件:
/协同感知。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'
/测试/验收。一套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
realDB是真实的数据库,在执行验收测试后会发生更改。我尝试了不同的清理案例。一套yml:1)清除:在Laravel模块中为false,在Db模块中为true;2)清除:在Laravel模块中为true,在Db模块中为true。Codeception文档说,对于验收测试,我们需要“禁用清理,并在测试之间使用Db模块清理数据库”。但是realDB无论如何都会改变。
我尝试了不同的PHP测试框架,如Laravel中的PHPUnit、PHP Selenium驱动程序、Facebook网络驱动程序,在所有情况下,在执行验收测试时,真实数据库都会受到影响。如何正确配置代码欺骗以防止数据库更改?
任何帮助都将不胜感激。
[UPDATE1]
正如@TheFallen建议我使用不同的数据库进行测试,我更改了如下配置文件:
/协同感知。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'
/测试/验收。一套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
/环境署署长。测试
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
/配置/数据库。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,
],
...
这个环境。测试位于Laravel应用程序的根目录中。但真实数据库(realDB)仍然受到影响,只有转储文件被导入测试数据库(testDB)。看起来应用程序没有使用。环境。测试。我怎样才能解决这个问题?
请注意,在我的验收测试中,发送了一个AJAX请求来调用一个函数来更改数据库中的数据。我想回滚由AJAX请求完成的数据库事务。
[UPDATE2]
根据Codeception文档,验收测试将在使用RealWeb服务器的开发环境中执行,所以来自的设置。环境。测试无法传递给他们:(
在我为解决这个问题所做的一切之后,我得出结论,在执行验收测试触发AJAX请求以执行数据库事务之后,不可能阻止真实数据库的更改,除非我将默认数据库更改为测试中的一个数据库。环境文件!
如果有人有更好的解决方案,请分享!
如果您在Laravel5模块设置中设置清除:true,所有数据库查询都将在事务中运行,事务将在测试结束时回滚。因此,这是防止更改真实数据库的一种方法。
还要确保您在测试/_data/dump.sql.中拥有最新的数据库转储。Db模块的设置应该是清理:每次测试后清理数据库,保持真实数据完整,不确定为什么需要重新连接到数据库在每次测试后重新连接:真的,但你可能不需要它。
由于您的Laravel应用程序可以在多个域下运行,请创建一个专用于验收测试的域,并配置服务器为该特定域设置环境变量app_ENV=acceptance
(或任何您称之为的变量)。设置了APP_ENV
后,Lavel将自动为您加载正确的环境文件,在本例中为。环境。验收
。
我还看到人们使用cookie(在验收测试早期设置)来配置Laravel以基于这些cookie切换数据库。它看起来有点脏,而且可能不安全,而且你最终会向你的应用程序核心添加代码,所以...
我的一个测试使用了代码欺骗,当我尝试点击一个链接时,窗口滚动到浏览器认为它应该去的地方,但是,我的站点有一个导航栏附在窗口的底部,所以当浏览器停止滚动时,底部导航覆盖了链接。 正因为如此,测试失败了。有人知道如何配置它来滚动更远一点吗?使用Codeception 1.8.5。 谢谢
我正在尝试使用Yii2基本框架设置Codeception。单元测试工作正常。验收也在工作,但如果我想使用模块,我会得到错误。这是文件 Phantomjs安装并运行在上。 我得到的错误是: 这是作曲家文件,给你关于版本的想法。 配置文件是否有任何错误,或者是否有人面临相同的问题?
我正在编写一组简单的PHP函数,我只使用纯PHP7,没有框架,什么都没有。这些函数稍后将在CMS中的插件中使用,但这不是重点。我想使用Codeception为我的函数编写单元测试(为了熟悉它,我知道Codeception基本上只在这里运行PHPUnit),但我真的不知道如何以合理的方式将Codeception指向我的代码。 我的结构如下:我有,其中包含我想要测试的函数,大致如下: 我使用Compo
我在laravel中有一个资源控制器来管理我的用户。这将创建一个更新用户信息的路由,该路由使用HTTP PUT方法接收请求。 这里显示命令输出: 它在我的web浏览器上正常工作,但当我尝试使用codeception运行测试并提交表单时,我得到一个method not allowed异常,测试失败。 我试图了解为什么会发生这种情况,这似乎是codeception提出的请求。该请求是通过POST而不是
我在使用Yii2进行Codeception时遇到了一些问题。我刚刚升级到Yii 2.0.10,一直在使用本指南 我收到错误:
我在api中有下面的YML代码。一套yml 当我使用运行时,它给出以下错误/供应商/bin/codecept运行 我尝试了许多YML配置组合没有任何运气。如何解决这个问题?