猿问

代码接收夹具性能的最佳实践

目前,我的代码接收测试执行了半个小时,显然,当我添加新测试时,这个时间会增加。

我尝试通过测试获得更好的性能,因为在推送之后,我经常忘记由于测试缓慢而我推送了某些东西。

现在我发现我最大的问题是赛程。这是非常具有描述性的黑火简介:

仅加载和卸载夹具就占用了 93% 的时间,但测试本身却占用了 5% 的时间。

我认为我可以对所有测试使用一组固定装置,并在每次测试后回滚事务,但我发现,随着大量测试用例的出现,维护此类数据变得越来越困难 - 添加新的测试用例总是打破一些旧的测试。

那么,有什么解决方案可以减少灯具消耗的时间吗?也许有某种方法可以对每组测试使用原始 SQL 转储?或者我应该编写一个巨大的 shell 脚本来将转储恢复到数据库并单独运行每组测试?


温温酱
浏览 79回答 1
1回答

RISEBY

对此没有简单的答案。以下是过去对我有用的一些事情。有些可能不适用于您的应用程序,或者可能没有意义。我希望这对您有用。减少每次测试必须加载的夹具数量定义一组可供所有测试使用的通用数据(用户、产品、应用程序中的任何数据)。它不一定是“一应俱全”的套装。更多地将其视为共同点。不应在测试中修改这些数据,或者至少不应以破坏测试的方式修改这些数据。在运行测试套件之前加载此装置。在每个测试中,仅加载该特定测试所需的附加夹具。替换 Yii 装置我对 Yii 不熟悉,但框架固定加载器通常效率不高。也许使用一些自己的工具会更好。切换到内存数据库通常会快一点甚至很多。复制数据库您可以通过加载夹具一次、创建数据库的副本然后重新加载来减少加载时间。SQL 转储是实现此目的的一种方法。使用 SQLite,您可以简单地创建数据库文件的备份并在每次测试之前将其复制回来。如果我没猜错的话,那么你就有一组共享相同数据的测试。您可以为每组创建一个套件。添加一个测试监听器,该监听器加载固定装置并在套件运行之前创建副本,并在每次测试之前恢复备份。对用例进行单元测试不完全符合您的要求,但这将大大减少运行测试所需的时间。当您对所有用例进行单元测试时,您需要的端到端测试就会少得多。根据您的架构,目前这可能不可行,但开始努力永远不会太晚。
随时随地看视频慕课网APP
我要回答