【问题标题】:Complementing JUnit test batteries with dynamic JVM languages用动态 JVM 语言补充 JUnit 测试电池
【发布时间】:2012-02-02 20:48:12
【问题描述】:

我想开始将一系列冗长的单元测试(大型 json,不能嵌入标准 Java,大量 bean 字段检查)移植到更具表现力的语言(如 Clojure、Groovy、Jython)中。

根据我的经验,应该能够补充标准 Java 源代码的语言是 Clojure 和 Groovy。可能这里可以使用 Rhino 或 BeanShell,但我对这些没有经验......

欢迎提出其他建议:

我的要求是:

1) 该语言必须按原样在与我的 Java EE 代码相同的环境中运行。

2) 语言必须能够在字符串中嵌入大的多行文本。

3) 语言的单元测试必须像正常的 JUnit 测试一样由 ANT 和 Maven junit 任务/目标本地运行。

4) 语言的单元测试必须能够调用常规代码并使用我的源代码库中的依赖项(即它必须能够访问我的常规 junit 测试包所做的类路径上的类),没有问题.

我的问题:

1) 是否可以用一种语言编写源代码,同时用另一种 junit 语言编写 junit 测试,如果可以,有没有这方面的例子?

2) 如果是,哪种语言最能满足上述 1-3。

此外,任何有意义 对“用 java 编写,在 * 中的 junit 测试”提案的优点的评论都会有所帮助。

谢谢!

【问题讨论】:

    标签: java groovy clojure junit rhino


    【解决方案1】:

    我曾经在寻找一个满足相同要求的测试库,并且更像

    • 单元测试、集成测试和端到端测试的相同框架
    • 简单直观的数据驱动测试
    • BDD 类测试
    • 过渡应该是渐进式的(即我们是一家 Java 商店,如果有人不想利用 groovy,他们仍然可以使用 Java)

    spock 是一个强大的框架,可以满足所有要求。我们可以将 JUNIT 和 Spock 混合在一起。 Spock 以与 Junit 等相同的格式生成报告。

    示例

    1. 集成测试:Spock Grails、Spring 和 Unitils 插件
    2. 端到端 ui 测试:Geb + Spock
    3. 端到端应用程序到应用程序接口,如网络服务等:HttpBuilder + http://groovy.codehaus.org/GroovyWS + Spock

    【讨论】:

    • 非常非常酷。使用 spock、junit 等进行真正的异构测试的任何示例...?
    【解决方案2】:

    您使用的是 IDE 吗?如果是这样,那么很抱歉成为一个无聊的老屁,但我建议您将测试保留在 Java 中。

    原因是,根据我的经验,IDE 对使用异构代码库没有支持或支持很差。考虑重命名应用程序代码中的方法。对于任何体面的 IDE,您都可以将其视为重构,并且 Java 代码中的所有调用站点都会更改以反映新名称。但是,其他语言的呼叫站点不会(据我所知)。如果您的测试不是在 Java 中使用的,这意味着您现在有一堆损坏的测试需要查找和修复。只是因为你重命名了一个方法!许多类型的重构都会引发这个问题。您可能还无法在测试和应用程序代码上同时使用调试器、运行代码覆盖率分析或执行各种其他有用的事情。

    使用无类型语言,如 Javascript 或通常使用的 Groovy,本质上也意味着您的测试无法对类型进行断言,因此无法测试 Java 中可能出错的所有内容.例如,在 Java 测试中,我可以这样写:

    List<CharSequence> words = foo.getWords();
    

    要编译该测试,getWords 必须返回 List&lt;CharSequence&gt;。如果有人将其更改为 List&lt;String&gt;,则测试会中断。这让您可以使用测试来强制执行 API 的设计。

    那么,另一种方法可能是使用 Java,并找到处理大字符串和大 bean 比较的方法。

    处理大字符串的最简单方法可能是将它们推送到作为类路径资源的单独文本文件中。然后,您可以编写一个简单的实用程序方法来加载命名资源,并将其读入字符串。

    我不确切知道您的“大量 bean 字段检查”涉及什么,但如果它检查 bean 字段中的值,也许是深度嵌套,那么一些简单的实用方法可能会有很大帮助。也许您可以从属性文件中读取字段规范及其预期值,然后反思性地提取和检查它们?

    【讨论】:

    • @Pangea:是否有 IDE 可以将 Java 重构带到 Groovy 代码中?这就是这里的相关内容。
    • IntelliJ 可以跨 Groovy 和 Java 重构
    【解决方案3】:

    我用easyb 编写了很多测试,这是一种基于 Groovy 的 BDD 语言。 JRuby 和 RSpec 是另一个不错的选择。为什么要求测试“作为 JUnit 测试”运行,这到底是什么意思?

    如果这是一个实际要求,那么您会限制测试的表达能力(我不是 JBehave 的忠实粉丝)。在进行 Java + 真实语言项目时,Groovy 是我的首选语言,尽管我使用 JRuby 作为应用程序的命令行界面。

    Groovy 的注解支持一流且无缝,在 IMO 中,它是编写 JUnit 测试的不二之选,它或多或少就像您使用 Java 编写的,但使用 Groovy。

    【讨论】:

    • 我的项目是 100% java。我只添加了动态语言支持,因为我想要一些单元测试的动态语言,因为我认为它们会更容易编写,因为我想要完整的多行字符串声明。此外,它是一种将一些动态代码缓慢引入代码库的好方法,这是一个长期目标。这说明清楚了吗?
    • @jayunit100 不;它并没有真正解决这个问题——我在问你为什么只需要 JUnit 测试。
    • 好吧-只要测试失败时构建失败,我真的不在乎它们是否是junit。似乎 junit 将与我的元构建内容紧密集成(例如,打印出故障,将结果写入 xml,......这一切都以与 junit 相同的方式自动化)。我喜欢利用现有的框架,但只是用更好的语法编写测试,而不是拥有两个测试框架。我怕这里有太多活动部件。
    • @jayunit100 大多数都有Maven integration。此外,输出是人类可读的,并且利益相关者可以编写easyb 框架。我们必须调整以使输出在我们的 CI 服务器中可见。只坚持一个测试框架极大地限制了您的灵活性,尤其是当您超越单元测试时。
    • 好点...感谢非常有帮助...你是什么意思“超越”? Junit 可以进行集成测试以......您在说什么类型的限制?
    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 2023-01-24
    • 2011-03-26
    • 1970-01-01
    • 2020-06-15
    • 2015-02-04
    • 2012-07-21
    • 1970-01-01
    相关资源
    最近更新 更多