Testing 如何为测试自动清除和迁移数据库?

Testing 如何为测试自动清除和迁移数据库?,testing,yii,yii2,codeception,Testing,Yii,Yii2,Codeception,我正在用Yii2构建一个API,并使用测试数据库进行了一些codeception API测试。但是,我希望在每一轮测试中清除并迁移数据库 我该怎么办?我在任何地方都找不到答案。Yii迁移的设计目的正是为了满足您的需求。有关于创建它们的完整文档。缺点是您需要访问命令行。如果没有,您仍然可以使用迁移,但需要创建控制台应用程序的新实例。有关此问题的详细讨论,请参阅 至于让控制器操作刷新数据库的风险,我同意这是有风险的,但您可以将该操作限制为仅使用规则的管理员用户,甚至可以使用表单启动该操作,以便使用c

我正在用Yii2构建一个API,并使用测试数据库进行了一些codeception API测试。但是,我希望在每一轮测试中清除并迁移数据库


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

Yii迁移的设计目的正是为了满足您的需求。有关于创建它们的完整文档。缺点是您需要访问命令行。如果没有,您仍然可以使用迁移,但需要创建控制台应用程序的新实例。有关此问题的详细讨论,请参阅


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

无论测试API如何,都可以使用迁移将数据库内容恢复到特定状态,但我认为这不是您可以拥有的最佳解决方案,解决方案应该是使用fixture

请参见官方文档中有关固定装置的更多信息:

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

此任务可以在提交创建任何测试之前由开发人员手动完成,也可以在有CI服务器的情况下自动完成


同样,不需要每次运行测试时都运行迁移,只需在开始时运行。fixture是在任何类型的测试过程中使数据库处于特定状态所需的工具。

不知道它应该如何工作,但这难道不像在控制器中创建一些操作那样简单,该控制器将运行一个大sql文件,删除所有表并再次创建它们吗?然后在你测试之前,你只需调用该页面。我相信一定有更好的、更少黑客攻击的方法来完成它。另外,添加一个控制器操作来刷新数据库听起来非常危险。其他想法:为了安全起见,你可以在url中传递一个令牌,或者限制到本地ip。我看到Yii也有一些装置,不确定它们是否对你有用,最后,因为你在这里提到了codeception,它描述了你想要做的事情:谢谢你的回复。是的,我正在使用(并且喜欢)迁移,希望它们在运行测试时自动运行。我在一个Laravel项目上工作了几个月,每个测试文件都从一个新的数据库开始(用特定的装置填充)。我想在Yii2中复制这一点,但不确定如何复制。我想现在我将创建一个控制器操作来删除和迁移每个测试文件的数据库。我将编写一个可以调用的自定义方法来实现这一点。我确实打算使用fixture,但有些测试需要创建模型来测试创建、身份验证、授权和关系的工作流。如果我在一个测试中添加用户,我不希望它影响到其他测试,例如,可能需要一定数量的用户(或其他模型),我的意思是,我想让数据库自动升级到最新的迁移版本,而不是手动升级。@Dubby我认为这有点混乱:这实际上取决于您组织工作和代码库的方式。如果您希望测试单独运行并且不影响任何其他人的工作,那么您正在开发的特性应该是自包含的。正如我所解释的,您确实需要迁移,但这些只在运行测试之前的一开始就需要:在正常的连续集成系统中,迁移将自动运行。运行测试的Codeception不知道Yii及其迁移基础设施,因此这种情况是意料之中的。希望这有帮助。谢谢你的桃子。是的,我理解这一点,可能会向tests/_bootstrap.php添加一些代码来检查迁移,希望在执行测试时它只运行一次。我喜欢术语
独立的
。我如何做到这一点?在一次测试中添加的记录不会在测试结束时删除。这是我的API测试,没有清除值:@Dubby fixtures是您正在寻找的,有关如何设置它们的更多信息,请参阅上面的答案。fixture是控制测试db内容的唯一方法。