PHPUnit/Cypress 在 Laravel 中测试 2 个数据库
PHPUnit/Cypress Testing 2 Databases in Laravel
(来自 https://laracasts.com/discuss/channels/testing/phpunitcypress-testing-2-databases 的交叉帖子)
大家好,我正在尝试为我的项目设置测试中途(因为我很傻,没有从一开始就写测试)
我将对项目进行快速总结,以便了解一些背景...
- 一个社区 运行 是一个游戏服务器,它使用数据库存储游戏内的持久性、日志和其他数据。
- 我正在编写一个实用程序站点,以便用户可以查看他们的游戏内
角色信息,管理员可以查看日志,编辑玩家,写
私人笔记等,都在网络界面上
- 这意味着我有两个网站数据库:游戏数据库,由游戏服务器控制,网站只需访问以阅读和编辑内容...和网站数据库,由网站控制及其迁移,只有网站访问。
所以网站数据库有一个关系从用户加入到游戏数据库...
- 用户使用 steam 身份验证登录网站,他们的 steamid 和登录令牌等保存在网站数据库中
- 玩家加入游戏,游戏将他们的 Steam ID 存储在游戏数据库中
- 网站数据库中的用户条目根据他们的 Steam ID 与游戏数据库玩家条目一对一链接
我有一个用于开发的游戏数据库的本地副本。对数据的更改不会影响任何实时内容。
无论如何,我希望这有点道理...关于问题...
我的问题是当我想用这些数据库测试我的应用程序时...
网站数据库非常简单,无论我使用 SQLite :memory: 数据库还是物理数据库,我都可以使用 RefreshDatabase 特性,PHPUnit/etc 将通过我的迁移处理刷新数据库它...一切都很好...据我所知没问题...
当我想通过测试处理第二个(游戏)数据库更改回滚时出现问题...我没有此数据库的迁移,因为它不受网站控制或管理。
我的问题是:
- 如何PHPUnit/cypress/etc重置由自动化测试引起的对第二个数据库(游戏数据库)的更改?
- 如果我必须为 #1 编写迁移或其他东西才能实现,我如何才能在应用程序环境测试时告诉迁移仅 运行? (即当 运行 在生产或本地环境中迁移美术时,游戏数据库的任何迁移都必须 NOT 运行)
基本上,我希望最终能够让 PHPUnit 将测试用例所需的数据插入到两个本地测试数据库中,然后让 PHPUnit 回滚更改。
我只是不确定如何处理通过 eloquent 访问但不受 laravel 迁移等管理的第二个数据库。它仅由 [=69= 访问].
希望所有这些杂乱无章的内容都是有道理的,如果有任何需要澄清的地方,我会尽量详细说明。
很可能我在这里遗漏了一些明显的东西。
所以我已经使用以下方法让它工作了。
通过指定 .env.testing
文件,我有两个单独的数据库用于测试。
第一个(网站)数据库正在用 Laravels RefreshDatabase
trait
重置
正在使用以下代码重置第二个(游戏)数据库:
public function setUp() : void {
parent::setUp();
\DB::connection('mysql2')->beginTransaction();
}
public function tearDown() : void {
parent::tearDown();
\DB::connection('mysql2')->rollBack();
}
到目前为止它似乎工作正常,虽然我只写了几个测试...
如果有人有“更好”或“更合适”的答案,请告诉我! :D
(来自 https://laracasts.com/discuss/channels/testing/phpunitcypress-testing-2-databases 的交叉帖子)
大家好,我正在尝试为我的项目设置测试中途(因为我很傻,没有从一开始就写测试)
我将对项目进行快速总结,以便了解一些背景...
- 一个社区 运行 是一个游戏服务器,它使用数据库存储游戏内的持久性、日志和其他数据。
- 我正在编写一个实用程序站点,以便用户可以查看他们的游戏内 角色信息,管理员可以查看日志,编辑玩家,写 私人笔记等,都在网络界面上
- 这意味着我有两个网站数据库:游戏数据库,由游戏服务器控制,网站只需访问以阅读和编辑内容...和网站数据库,由网站控制及其迁移,只有网站访问。
所以网站数据库有一个关系从用户加入到游戏数据库...
- 用户使用 steam 身份验证登录网站,他们的 steamid 和登录令牌等保存在网站数据库中
- 玩家加入游戏,游戏将他们的 Steam ID 存储在游戏数据库中
- 网站数据库中的用户条目根据他们的 Steam ID 与游戏数据库玩家条目一对一链接
我有一个用于开发的游戏数据库的本地副本。对数据的更改不会影响任何实时内容。
无论如何,我希望这有点道理...关于问题...
我的问题是当我想用这些数据库测试我的应用程序时...
网站数据库非常简单,无论我使用 SQLite :memory: 数据库还是物理数据库,我都可以使用 RefreshDatabase 特性,PHPUnit/etc 将通过我的迁移处理刷新数据库它...一切都很好...据我所知没问题...
当我想通过测试处理第二个(游戏)数据库更改回滚时出现问题...我没有此数据库的迁移,因为它不受网站控制或管理。
我的问题是:
- 如何PHPUnit/cypress/etc重置由自动化测试引起的对第二个数据库(游戏数据库)的更改?
- 如果我必须为 #1 编写迁移或其他东西才能实现,我如何才能在应用程序环境测试时告诉迁移仅 运行? (即当 运行 在生产或本地环境中迁移美术时,游戏数据库的任何迁移都必须 NOT 运行)
基本上,我希望最终能够让 PHPUnit 将测试用例所需的数据插入到两个本地测试数据库中,然后让 PHPUnit 回滚更改。
我只是不确定如何处理通过 eloquent 访问但不受 laravel 迁移等管理的第二个数据库。它仅由 [=69= 访问].
希望所有这些杂乱无章的内容都是有道理的,如果有任何需要澄清的地方,我会尽量详细说明。
很可能我在这里遗漏了一些明显的东西。
所以我已经使用以下方法让它工作了。
通过指定 .env.testing
文件,我有两个单独的数据库用于测试。
第一个(网站)数据库正在用 Laravels RefreshDatabase
trait
正在使用以下代码重置第二个(游戏)数据库:
public function setUp() : void {
parent::setUp();
\DB::connection('mysql2')->beginTransaction();
}
public function tearDown() : void {
parent::tearDown();
\DB::connection('mysql2')->rollBack();
}
到目前为止它似乎工作正常,虽然我只写了几个测试...
如果有人有“更好”或“更合适”的答案,请告诉我! :D