【问题标题】:Testing in laravel against MySQL在 laravel 中针对 MySQL 进行测试
【发布时间】:2018-01-29 10:54:17
【问题描述】:

你好,我正在 laravel 5.5 中测试一个使用 Mysql 作为数据库和 DatabaseTransactions 的 api。

假设我有一个模型Team,它可能是activeinactive,我想测试获得一个不活跃的团队。

$team = Team::inactive()->inRandomOrder()->first();
$response = $this->json('GET',route('teams.show',$team->id); 
$reponse ->assertStatus(404);

如果我的团队中没有不活跃的团队,那么这段代码就有问题 假种子数据库。 那么这里最好的方法是什么?

1)我是否应该确保我为一个不活跃的团队播种数据库?
2)我是否应该在第一行之后做出断言,如果$team==null 我为了测试目的而组建团队inactive
3)在测试期间使用工厂并创建假数据?

我暂时避免使用 3 的唯一原因是,在与外键更复杂的关系中,我必须播种 3-4 个表。

【问题讨论】:

标签: php mysql laravel testing


【解决方案1】:

您应该独立测试每个案例,如果它们真的可以发生的话。如果可能发生不存在不活动团队的情况,请对此进行测试。如果根本不存在眼泪,也可以为此编写一个测试。

在测试之前运行迁移和播种是很常见的。 Laravel 提供了一些有用的实用程序来做到这一点以及在拆卸期间回滚。尽可能让您的测试保持原子性并相互隔离。

【讨论】:

  • 当然我的测试是孤立的。我知道有 RefreshDatabase 但它并不总是如我所愿。另外使用 Transactions 只允许您为所有测试进行一次数据库刷新。问题的全部意义在于,在我运行的常见database seed 中可能找不到总共 20 多个案例。例如banned usersusers with scopes 等...所以要么我必须做额外的特定测试的种子或 .利用 Transactions。使我的模型满足此测试的要求,然后继续
  • laravel.com/docs/5.5/…。您并不局限于单一的数据库状态。你也不应该反对播种 3-4 张桌子。 Sqlite(或内存数据库中的另一个)相对来说相当快。是的,我知道您特别提到了 mysql,但是您真正测试的是什么?你的代码还是你的数据库?测试代码时,只要返回的数据相同,您的存储方式就无关紧要。
  • 首先,使用 mysql 进行测试并不是一个不好的做法。它有点慢,但你可以 100% 确定,因为你使用的是生产软件 其次我的表最初是种子。就像我之前说的,当你测试复杂的情况时,即使你在每次测试之前种子,你也可能有很多情况可能不会在随机种子中表示出来。这些情况不是数据库状态!它们是当有人使用您的 api 时可能发生的!示例获取被禁止的用户。如果我尝试测试此功能,但我在数据库中没有被禁止的用户,我应该创建一个。所以需要额外的种子
  • 我从不依赖随机播种来生成所有测试用例。看看我关于工厂状态的其他评论。这是在每个测试的基础上重现特定数据库状态的好方法。我已经在许多行业中测试了很多代码。有时编写测试的时间比应用程序本身要长。
  • 好的,我明白你的意思了。这就是我认为最好的方法。只是想确保没有其他方法。因为有时采用简单的方法可能对您的测试维护更健康
猜你喜欢
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 2011-03-26
  • 1970-01-01
  • 2015-01-12
  • 1970-01-01
相关资源
最近更新 更多