代码之家  ›  专栏  ›  技术社区  ›  randombits

在大型Rails应用程序中加速RSpec测试

  •  90
  • randombits  · 技术社区  · 14 年前

    你看到的最长的例子是什么样的时代?我可以做些什么来解决我现有的规格,以找出瓶颈,并帮助加快事情。在这一点上,分秒必争。

    12 回复  |  直到 14 年前
        1
  •  119
  •   sameers    5 年前

    10秒对于任何单个测试来说都是非常长的时间。我的直觉是,您的spec目标同时运行单元测试和集成测试。这是一个典型的事情,项目陷入和在某个阶段,你 需要克服技术债务 如果你想生产更多,更快。有很多策略可以帮助你做到这一点。。。我会推荐一些我以前用过的。

    1从集成测试中分离单元

    我要做的第一件事是将单元测试和集成测试分开。您可以通过以下两种方式来实现:

    1. 移动它们(在spec目录下的单独文件夹中)-并修改rake目标
    2. 标记它们(rspec允许您标记测试)

    哲学是这样的,你希望你的常规构建是快速的,否则人们不会太乐意经常运行它们。所以回到那个地方去。让您的常规测试快速运行,并使用持续集成服务器来运行更完整的构建。

    2将集成测试转换为单元测试

    如果单元测试的规模小于集成测试套件,那么就有问题了。这意味着矛盾将更容易出现。因此,从这里开始创建更多的单元测试来取代集成测试。在此过程中,您可以采取以下措施:

    1. 使用模拟框架而不是真正的资源。Rspec有一个内置的mocking框架。

    一旦有了合适的单元测试来替换集成测试,就删除集成测试。重复测试只会让维护变得更糟。

    三。不要使用固定装置

    4添加检查以阻止单元测试成为集成测试

    现在您已经有了更快的测试,是时候检查一下以防止这种情况再次发生了。

    有些库在尝试访问数据库(UnitRecord)时会抛出错误。

    您还可以尝试配对和TDD,这可以帮助您的团队编写更快的测试,因为:

    1. 有人在检查-所以没人偷懒

    5使用其他库来解决这个问题

    有人提到spork(加速rails3下测试套件的加载时间)、hydra/parallel\u测试—并行运行单元测试(跨多个核心)。

    这应该是最后一个。你真正的问题就在第一、二、三步。解决了这个问题,您就可以更好地发挥额外基础设施的作用。

        2
  •  16
  •   marshally    14 年前

    要获得一本关于提高测试套件性能的好食谱,请查看 Grease Your Suite

    他利用以下技术记录了测试套件运行时的45倍加速:

        3
  •  5
  •   Pigueiras    12 年前

    你可以用Spork。它支持2.3.x,

    https://github.com/sporkrb/spork

    或./script/spec\u服务器,可能适用于2.x

    您还可以编辑数据库配置(这实际上加快了数据库查询等),这也将提高测试的性能。

        4
  •  3
  •   Community CDub    8 年前

    每个例子10秒似乎是一个很长的时间。我从来没有见过一个规格,需要超过一秒钟,大多数采取少得多。你在测试网络连接吗?数据库写入?文件系统写入?

    尽量使用mock和stub-它们是 比编写命中数据库的代码要快。不幸的是,嘲笑和存根也需要更多的时间来编写(而且更难正确地完成)。你必须平衡花费在编写测试和运行测试上的时间。

    我是第二个 Andrew Grimm

        5
  •  2
  •   Erdem Gezer    12 年前

    如果您使用的是ActiveRecord模型,那么还应该考虑BCrypt加密的成本。

    您可以在以下博客文章中了解更多信息: http://blog.syncopelabs.co.uk/2012/12/speed-up-rspec-test.html

        6
  •  0
  •   rogerdpack    14 年前

    除此之外,你唯一的方法就是(像你做的那样)分析和优化,或者使用spork或者其他可以为你并行运行你的规范的东西。 http://ruby-toolbox.com/categories/distributed_testing.html

        7
  •  -5
  •   thedanotto    9 年前