【问题标题】:Best practice with codeception fixture performanceCodeception 夹具性能的最佳实践
【发布时间】:2020-07-25 04:39:01
【问题描述】:

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

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

此时我发现我最大的问题是固定装置。这里非常具有描述性的黑火简介:

只有加载和卸载夹具需要 93% 的时间,但测试本身需要 5% 的时间。

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

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

【问题讨论】:

    标签: php performance testing codeception fixtures


    【解决方案1】:

    对此没有简单的答案。以下是过去对我有用的一些事情。有些可能不适用于您的应用程序,或者可能没有意义。我希望这里对你有用。

    减少每次测试必须加载的夹具数量

    定义一组可供所有测试使用的通用数据(用户、产品、应用程序中的任何内容)。它不必是“一个为所有人”的集合。更多地将其视为共同点。不应在您的测试中修改此数据,或者至少不应以破坏测试的方式修改此数据。在运行测试套件之前加载这个夹具。在每个测试中,仅加载此特定测试所需的其他固定装置。

    更换 Yii 夹具

    我不熟悉 Yii,但框架夹具加载器通常效率不高。也许你会更好地使用一些自己的工具。

    切换到内存数据库

    通常会快一点。

    复制数据库

    您可以通过加载一次夹具、创建数据库副本然后重新加载它来减少加载时间。 SQL 转储是实现此目的的一种方法。使用 SQLite,您可以简单地创建数据库文件的备份并在每次测试之前将其复制回来。

    如果我没听错的话,你有一组测试共享相同的数据。您可以为每个集合创建一个套件。添加一个测试侦听器,在套件运行之前加载夹具并创建副本,并在每次测试之前恢复备份。

    对用例进行单元测试

    不完全符合您的要求,但这将大大减少运行测试所需的时间。当您对所有用例进行单元测试时,您将需要更少的端到端测试。根据您的架构,目前这可能不可行,但开始努力永远不会太晚。

    【讨论】:

    • 我想过类似的事情。我有很多单元测试,不仅仅是代码接收测试,而且它们通过的时间少于第二次。但有时我应该使用数据库。我根本不能使用 sqlite,因为逻辑严重依赖存储过程。所以是的,我认为我应该停止使用固定装置,而是首先想出一些办法。
    猜你喜欢
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多