当前位置: 首页 > 知识库问答 >
问题:

在代码欺骗(Laravel)中设置验收测试数据库

阮星火
2023-03-14

我正在使用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请求以执行数据库事务之后,不可能阻止真实数据库的更改,除非我将默认数据库更改为测试中的一个数据库。环境文件!

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

共有2个答案

谷梁云瀚
2023-03-14

如果您在Laravel5模块设置中设置清除:true,所有数据库查询都将在事务中运行,事务将在测试结束时回滚。因此,这是防止更改真实数据库的一种方法。

还要确保您在测试/_data/dump.sql.中拥有最新的数据库转储。Db模块的设置应该是清理:每次测试后清理数据库,保持真实数据完整,不确定为什么需要重新连接到数据库在每次测试后重新连接:真的,但你可能不需要它。

唐利
2023-03-14

由于您的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配置组合没有任何运气。如何解决这个问题?