【问题标题】:How do I clear and migrate the database automatically for testing?如何自动清除和迁移数据库进行测试?
【发布时间】:2015-03-27 01:40:28
【问题描述】:

我正在使用 Yii2 构建一个 API,并且有一些代码接收 API 测试与测试数据库一起工作。但是我想在每一轮测试中清除和迁移数据库。

我该怎么做?我在任何地方都找不到答案。

【问题讨论】:

  • 不确切知道它应该如何工作,但它不会像在控制器中创建一些操作那样简单,该控制器将运行一个删除所有表并创建的大 sql 文件他们又来了?然后在您的测试之前,您只需调用该页面。
  • 我确信一定有更好的、不那么老套的方法来做到这一点。此外,添加控制器操作来刷新数据库听起来非常冒险。
  • 其他想法:为了保护它,你可以在 url 中传递一个令牌,或者限制为本地 ip。我看到 Yii 也有 Fixtures 不确定它们是否对你有用,最后,因为你在这里提到 codeception 它描述了你想要做的事情:codeception.com/docs/09-Data

标签: testing yii yii2 codeception


【解决方案1】:

Yii 迁移旨在完全满足您的需求。有关于创建它们的完整文档here。缺点是您需要访问命令行。如果你没有这个,你仍然可以使用迁移,但你需要创建一个控制台应用程序的新实例。请参阅 here 了解有关此问题的讨论。

至于让控制器操作刷新数据库的风险,我同意这可能是有风险的,但是您可以使用规则将操作限制为仅限管理员用户,甚至可以使用表单来启动您可以使用的操作csrf 令牌来验证提交,并且只允许通过 post 方法执行操作。如果您需要一些指导,我可以更新我的答案。

【讨论】:

  • 感谢您的回复。是的,我正在使用(并且喜欢)迁移,并希望它们在我运行测试时自动运行。我在一个 Laravel 项目上工作了几个月,每个测试文件都从一个新的数据库开始(填充了特定的固定装置)。我想在 Yii2 中复制它,但不确定如何。我想现在我将创建一个控制器操作来删除和迁移每个测试文件的数据库。
  • 实际上,我不需要控制器操作。我将编写一个可以调用的自定义方法来实现这一点。
【解决方案2】:

不管测试 API,将数据库的内容恢复到某个状态肯定可以使用迁移来完成,但我认为这不是您可以拥有的最佳解决方案,解决方案应该使用 固定装置

更多关于fixtures的信息见官方文档:http://www.yiiframework.com/doc-2.0/guide-test-fixtures.html

一旦您实现了固定装置(应该非常简单,否则只需打开另一篇文章),您可能会意识到实际上可能需要迁移以保持数据库结构同步。

此任务可以由开发人员在提交创建任何测试之前手动完成,或者如果您有 CI 服务器则自动完成。

再次重申,每次运行测试时都不需要运行迁移,只需在开始时运行即可。 Fixtures 是您在任何类型的测试期间将数据库带入特定状态所需要的。

【讨论】:

  • 我确实打算使用fixture,但有些测试需要创建模型来测试创建、身份验证、授权和关系的工作流程。如果我在一个测试中添加用户,我不希望它影响其他可能需要一定数量用户(或其他模型)的测试。
  • 当我说迁移时,我的意思是我想让数据库自动升级到最新的迁移,而不是手动进行。
  • @Dubby 我认为有些混乱:这实际上取决于您组织工作和代码库的方式。如果您希望测试单独运行并且不影响任何其他人的工作,那么您正在开发的功能应该是自包含的。正如我所解释的,您确实需要迁移,但这些只是在运行测试之前的开始时才需要:在正常的持续集成系统中,迁移将自动运行。运行测试的 Codeception 不知道 Yii 及其迁移基础设施,所以这种情况是意料之中的。希望这会有所帮助。
  • 谢谢@The_Peach。是的,我理解这一点,并且可能会在 tests/_bootstrap.php 中添加一些代码来检查迁移,希望它在执行测试时只运行一次。我喜欢self contained 这个词。我该如何做到这一点?在一项测试中添加的记录最终不会被删除。这是我没有清除值的 API 测试:gist.github.com/anonymous/fe05253bf0364cde349b
  • @Dubby 固定装置是您正在寻找的,有关如何设置它们的更多信息,请参阅上面的答案。 Fixtures 是控制测试用 db 内容的唯一方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多