如何加快 Grails 测试执行

Posted

技术标签:

【中文标题】如何加快 Grails 测试执行【英文标题】:How to speed up grails test execution 【发布时间】:2010-10-30 20:02:24 【问题描述】:

在开发 Grails 1.0.5 应用程序时,我对 grails test-app 命令的速度有多慢感到震惊。尽管实际测试只需要大约 10 秒,但整个执行过程加起来是

真正的 1m26.953s 用户 0m53.955s 系统 0m1.860s

这包括 grails 引导、加载插件、编译所有代码等。

任何有关如何加快grails test-app 执行速度的提示将不胜感激。

【问题讨论】:

【参考方案1】:

您可以使用交互模式来加快测试运行速度。

快跑

grails interactive

然后输入

test-app

第一次将与往常一样,但之后的每次都会大大加快。目前交互模式存在一些问题(比如运行几次后内存不足),但我仍然觉得值得。

【讨论】:

我只是建议您更慷慨地设置您的 permgen 空间,否则您将在十几个周期后用完。这就是我使用的:-XX:PermSize=64m -XX:MaxPermSize=512m 我们通过 Maven 运行我们的 grails 项目,在这种情况下,第一个命令是:mvn grails:exec -Dcommand="interactive"。 另外,在第一次运行后,您只需按 Enter 即可重新运行 test-app 命令。 谢谢你,真的帮了我大忙。有什么方法可以将它与监视您的代码并进行自动构建的插件结合起来?这就是我在前端开发的方式,它确实加快了我的开发时间。【参考方案2】:

没有任何硬性规定可以加快速度,而且您遇到的性能问题可能与您的应用有关。

如果您的引导需要大约 75 秒,那听起来很长。我会仔细查看 Bootstrap.groovy 文件中的所有内容,看看是否可以精简。

您是否有任何您可能不需要的额外插件(或可能会严重影响性能)?

这对您来说现在可能不太可能,但是 grails 1.1.1/groovy 1.6.3 相对于 grails 1.0.5/groovy 1.5.7 的速度改进是相当显着的。

在测试时真正帮助我的另一件事是仅指定集成测试或仅指定单元测试(如果我正在处理其中一个或另一个):

grails test-app -unit

grails test-app -integration

您还可以指定一个特定的测试类(不带“Tests”前缀)来运行一个真正有助于 TDD 的测试(例如“MyServiceTests”集成):

grails test-app -integration MyService

在 grails 1.1.1 中,使用 5 个插件和约 40 个域类进行引导只需不到 20 秒。

【讨论】:

感谢您的建议 - 我想补充一点,这也是我的慢速开发硬件。迁移到 grails 1.6.3 仅减少 5%。 @Robert 你一定是指 groovy 1.6.3。【参考方案3】:

如果您仍在使用 Groovy 1.5.x,您可能会通过升级到 Groovy 1.6 节省几秒钟

【讨论】:

感谢您的回答。我不打算这样做,因为我不确定 Grails 1.0.x 将如何与 1.6.x 一起使用,而 1.5.x 是捆绑的。【参考方案4】:

请在此处查看我的答案。依赖于定义不明确的 maven 工件的插件可能会导致 grails 每次都去寻找更新的版本。

Grails very slow to resolve certain dependencies

【讨论】:

【参考方案5】:

您也可以选择并行运行单元测试和集成测试 - 请参阅article

【讨论】:

【参考方案6】:

增加 java 内存/JVM 选项绝对可以加快速度。您可以提供的内存量取决于您的设备。

如果您从命令行运行 grails,请设置 GRAILS_OPTS 环境变量。将这样的内容添加到~/.bash_profile

export GRAILS_OPTS="-Xms3000M -Xmx3000M -XX:PermSize=256m -XX:MaxPermSize=512m"

如果您使用 GGTS(Eclipse),则需要将其添加到运行配置的 VM 参数中。

还有一些 JVM 设置可以修改以提高速度:

-XX:+UseCodeCacheFlushing 
-XX:MaxInlineLevel=15  
-noverify  (turns off class validation) 

【讨论】:

【参考方案7】:

grails 现在安装了http://grails.org/plugin/testing。这模拟了域的东西,所以你可以对域类进行一些测试作为 unit 测试。他们跑得很快。

【讨论】:

以上是关于如何加快 Grails 测试执行的主要内容,如果未能解决你的问题,请参考以下文章

Grails如何对异常执行单元测试

单元测试 Grails 控制器链接

在Grails 3中运行Grails功能测试

Grails 2.3 使用 IVY 解析器进行单元测试

如何在 grails 3 中运行单个集成测试?

Grails - 在哪里放置测试文件以及如何加载它们