如何对 Grails 应用程序进行并发修改测试

Posted

技术标签:

【中文标题】如何对 Grails 应用程序进行并发修改测试【英文标题】:How to do concurrent modification testing for grails application 【发布时间】:2011-05-08 22:54:09 【问题描述】:

我想运行测试,模拟用户同时为 Grails 应用程序修改某些数据。

我可以使用任何插件/工具/机制来有效地做到这一点吗?它们不必是特定于 grails 的。应该可以并行触发多个动作。

我更喜欢在功能级别上运行测试(到目前为止,我正在使用 Selenium 进行其他测试)以从用户角度查看结果。当然,如果您建议在集成级别上运行并发修改测试,这可以在集成测试之外完成。

【问题讨论】:

运行 JMeter 似乎是您可以使用的一种工具,但可能并不理想。 【参考方案1】:

我最近为此使用了 Geb (http://grails.org/plugin/geb/)。它是 WebDriver 和 Selenium 等之上的一个层。编写一个 Grails 脚本来充当应用程序中的用户,然后在不同的控制台上运行几个实例非常容易。 Geb 使用 jQuery 风格的语法来定位 DOM 中的内容,这非常酷:

import geb.Browser
import geb.Configuration

includeTargets << grailsScript("_GrailsInit")

target(main: "Do stuff as fast as possible") 

    Configuration cfg = new Configuration(baseUrl: "http://localhost:8080/your_app/")

    Browser.drive(cfg) 
        go "user/login"
        $("#login form").with 
            email = "someone@somewhere.com"
            password = "secret"
            _action_Login().click()
        
        ...
    


setDefaultTarget(main)

只需将您的脚本放在 scripts/YourScript.groovy 中,然后您就可以执行“Grails YourScript”来运行它。我通过全速运行其中几个来追踪一些并发问题。你确实需要建立一个战争并正确部署它,因为开发模式下的 Grails 非常慢并且很快就会耗尽 permgen 空间。

【讨论】:

【参考方案2】:

只是一个想法:让客户端同时启动似乎很难,但是他们可以在修改数据之前互相等待吗?

例如,客户端不断记录其进程:“客户端 x 访问 DATA”、“客户端 x 编辑 DATA”在文件中。他们还不断查看此日志文件,以查看其他客户端的进度。然后在另一个客户进来编辑该数据之前,不允许客户完成对数据的编辑。

【讨论】:

【参考方案3】:

我发现Grinder 是一款出色的重负载测试工具。一次运行多个执行相同测试的实例通常可以发现应用中的并发问题,而这些问题在普通测试中是找不到的。

如果您想在单元测试或代码内集成测试中执行此操作,您始终可以在代码中启动多个线程并让它们执行您尝试测试的任务。

【讨论】:

如何为 Grinder 编写测试用例?我可以使用我的硒测试吗? Grinder 测试是用 Python 编写的(Grinder 使用 Jython,Python 的 Java 实现)。但是,最好使用他们提供的代理工具来捕获所有用于测试的 HTTP 请求。因此,因为您可以使用代理从请求中生成脚本,所以您可以使用 selenium 测试来创建 Grinder 脚本。【参考方案4】:

您是否主要对负载测试多个活跃用户感兴趣,而不是那些只有 HttpSession 的用户?可靠的负载测试基于非常好的功能。然而测试。您今天的功能测试是如何组织和执行的? Grails 也为此提供了一个插件*,它似乎位于插件门户的 Top of the Pops 中。

您是否正在尝试测试乐观锁定机制在负载下的表现?

如果前一个用例意味着更多,听起来您可能正在寻找JUnitPerf。这是 --> download

*functional-test -- 功能测试

【讨论】:

我的目标是测试许多用户执行并发操作时的错误和性能(例如,两个用户试图修改相同的数据)。目前我的功能测试是用 Selenium 编写的,如果我可以重用它们会很棒。 明白了。我查看了 Selenium 常见问题解答,似乎很多人推荐 BrowserMob,这是一个商业网站。 wiki.openqa.org/display/SEL/…【参考方案5】:

WebTest 建立在 Ant 之上,Ant 提供了parallel task。您也许可以将它与 Webtest 插件结合使用,以并行运行一些操作。不过我没试过。

【讨论】:

【参考方案6】:

看看MultithreadedTC。看起来它可以用于执行某些交错的情况,即多个线程以您认为有潜在风险的方式执行您的代码。

我怀疑您会找到一种方便的方法来使用 Selenium 测试特定的多线程交错情况,因为 Selenium 控制向您的服务器发送请求的浏览器。当线程作为对正在运行的 Web 服务器的真实 Web 请求启动时,我还没有听说过一种方法来检测多线程交错测试的代码。

【讨论】:

以上是关于如何对 Grails 应用程序进行并发修改测试的主要内容,如果未能解决你的问题,请参考以下文章

Grails - 非空属性仅对并发用户引用空值或瞬态值错误

在 Grails 中对服务进行单元测试时如何模拟请求

如何对使用转换器的 Grails 服务进行单元测试?

作为 ./gradlew 检查的一部分,如何运行我的 grails-5 应用程序的黄瓜测试?

grails Grails 单元测试中的应用程序访问

Grails 3 中一对多域的深拷贝