codeception fixture 性能的最佳实践
Best practice with codeception fixture performance
此刻我的代码检测测试执行了半小时,显然这个时间随着我添加新测试而增长。
我试图通过我的测试获得更好的性能,因为在推送之后我经常因为测试缓慢而忘记我推送了一些东西。
此刻我发现我最大的问题是固定装置。这里非常具有描述性的 blackfire 配置文件:
仅加载和卸载夹具占用了 93% 的时间,但测试本身占用了 5% 的时间。
我原以为我可以对我的所有测试使用一组固定装置并在每次测试后回滚事务,但我发现随着大量测试用例的存在,维护此类数据变得越来越困难- 添加新的测试用例总是会破坏一些旧的测试。
那么,有什么解决方案可以减少固定装置消耗的时间吗?也许这里有某种方法可以为每组测试使用原始 SQL 转储?或者我应该编写一个巨大的 shell 脚本来将转储恢复到数据库并 运行 每组测试分别进行吗?
对此没有简单的答案。以下是过去对我有用的一些事情。有些可能不适用于您的应用程序,或者可能没有意义。希望对你有用。
减少每次测试必须加载的固定装置数量
定义一组可供所有测试使用的通用数据(用户、产品,以及您应用程序中的任何内容)。它不必是“一劳永逸”的套装。更多地把它当作共同点。不应在您的测试中修改此数据,或者至少不应以破坏测试的方式进行修改。在 运行 测试套件之前加载此夹具。在每个测试中,仅加载此特定测试所需的附加装置。
替换 Yii 装置
我对 Yii 不熟悉,但是框架 fixture 加载器通常效率不高。也许你会更好地使用一些自己的工具。
切换到内存数据库
通常会快很多。
复制数据库
您可以通过加载一次夹具、创建数据库副本然后重新加载来减少加载时间。 SQL 转储是实现此目的的一种方法。使用 SQLite,您可以简单地创建数据库文件的备份并在每次测试前将其复制回来。
如果我没听错,你有一组共享相同数据的测试。您可以为每个集合创建一个套件。添加一个测试侦听器,加载夹具并在套件 运行 之前创建副本,并在每次测试之前恢复备份。
单元测试用例
不完全符合您的要求,但这将大大减少 运行 测试所需的时间。当您对所有用例进行单元测试时,您将需要更少的端到端测试。根据您的架构,目前这可能不可行,但开始努力永远不会太晚。
此刻我的代码检测测试执行了半小时,显然这个时间随着我添加新测试而增长。
我试图通过我的测试获得更好的性能,因为在推送之后我经常因为测试缓慢而忘记我推送了一些东西。
此刻我发现我最大的问题是固定装置。这里非常具有描述性的 blackfire 配置文件:
仅加载和卸载夹具占用了 93% 的时间,但测试本身占用了 5% 的时间。
我原以为我可以对我的所有测试使用一组固定装置并在每次测试后回滚事务,但我发现随着大量测试用例的存在,维护此类数据变得越来越困难- 添加新的测试用例总是会破坏一些旧的测试。
那么,有什么解决方案可以减少固定装置消耗的时间吗?也许这里有某种方法可以为每组测试使用原始 SQL 转储?或者我应该编写一个巨大的 shell 脚本来将转储恢复到数据库并 运行 每组测试分别进行吗?
对此没有简单的答案。以下是过去对我有用的一些事情。有些可能不适用于您的应用程序,或者可能没有意义。希望对你有用。
减少每次测试必须加载的固定装置数量
定义一组可供所有测试使用的通用数据(用户、产品,以及您应用程序中的任何内容)。它不必是“一劳永逸”的套装。更多地把它当作共同点。不应在您的测试中修改此数据,或者至少不应以破坏测试的方式进行修改。在 运行 测试套件之前加载此夹具。在每个测试中,仅加载此特定测试所需的附加装置。
替换 Yii 装置
我对 Yii 不熟悉,但是框架 fixture 加载器通常效率不高。也许你会更好地使用一些自己的工具。
切换到内存数据库
通常会快很多。
复制数据库
您可以通过加载一次夹具、创建数据库副本然后重新加载来减少加载时间。 SQL 转储是实现此目的的一种方法。使用 SQLite,您可以简单地创建数据库文件的备份并在每次测试前将其复制回来。
如果我没听错,你有一组共享相同数据的测试。您可以为每个集合创建一个套件。添加一个测试侦听器,加载夹具并在套件 运行 之前创建副本,并在每次测试之前恢复备份。
单元测试用例
不完全符合您的要求,但这将大大减少 运行 测试所需的时间。当您对所有用例进行单元测试时,您将需要更少的端到端测试。根据您的架构,目前这可能不可行,但开始努力永远不会太晚。