【问题标题】:groovy, Junit4 unit test, and related test runnergroovy、Junit4 单元测试和相关的测试运行器
【发布时间】:2010-11-07 09:23:55
【问题描述】:

我正在尝试为我的 Groovy 代码编写 Junit4 测试用例。 Junit 4 测试用例在我的 Eclipse IDE(即 SpringSource 工具套件)中运行良好。但是,我无法运行测试来运行所有测试用例。

这是我目前对测试运行器的尝试。它几乎直接取自 Groovy 网站本身:

import groovy.util.GroovyTestSuite;
import org.codehaus.groovy.runtime.ScriptTestAdapter
import junit.framework.*;

class allTests {

static Test suite() {
  def gsuite = new GroovyTestSuite()
  gsuite.addTest(new ScriptTestAdapter(gsuite.compile("test/GSieveTest.groovy"), [] as String[]))
  return gsuite
}

}

junit.textui.TestRunner.run(allTests.suite())

结果:

org.codehaus.groovy.runtime.InvokerInvocationException:
    org.codehaus.groovy.runtime.metaclass.MissingMethodExceptionNoStack:
    No signature of method: GSieveTest.main() is applicable for argument types: () values: []

怎么了?哦,这里是 GSieveTest.groovy。我使用“Run As Junit test...”运行良好

import static org.junit.Assert.assertEquals;
import org.junit.Test;

class GSieveTest {
@Test
public void Primes1To10() {
    def sieve = (0..10).toList()
    GSieve.filter(sieve); // [1,2,3,5,7]
    assertEquals("Count of primes in 1..10 not correct", 5, (sieve.findAll {it -> it != 0}).size());        
}
@Test
public void FiftyNineIsPrime() {
    def sieve = (0..60).toList()
    GSieve.filter(sieve);
    assertEquals("59 must be a prime", 59, sieve[59]);
}
@Test
public void Primes1To100() {
    def sieve = (0..100).toList()
    GSieve.filter(sieve);
    def list = sieve.findAll {it -> it != 0}
    def primes = [1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
    println list
    println primes
    assertEquals(true, list == primes)
}

} 

【问题讨论】:

  • 测试代码在哪里,因为那是失败的原因?
  • 这里是 Junit4 测试代码。当“运行为 Junit 测试...”时工作正常
  • GSieveTest 不应该扩展 TestCase 和 allTests 扩展 GroovyTestSuite 吗?
  • 我正在尝试在 Junit4 中做所有事情并尽可能避免 Junit3。我有一个完整的 Junit3 解决方案,我正在寻求一个纯 Junit4 解决方案。

标签: groovy junit4 test-runner


【解决方案1】:

我也为此奋斗了很长时间,无法让 Groovy 记录的示例与 JUnit 4 一起使用。这是我的解决方案,最终非常简单:

创建一个名为 RunAllTestScripts.groovy 的脚本:

package com.mypackage

import org.junit.runner.JUnitCore

result = JUnitCore.runClasses MyGroovyTestClass, MyOtherGroovyTestClass, AnotherGroovyTestClass

String message = "Ran: " + result.getRunCount() + ", Ignored: " + result.getIgnoreCount() + ", Failed: " + result.getFailureCount()
if (result.wasSuccessful()) {
    println "SUCCESS! " + message
} else {
    println "FAILURE! " + message
    result.getFailures().each {
        println it.toString() 
    }
}

就是这样。 JUnitCore (JUnit4) 运行器将运行这些测试类。 TestSuites 可能有一个更优雅的解决方案,但这足以满足我的需求。 Result 对象包含运行的、忽略的、失败的计数以及易于查询的详细失败列表。

【讨论】:

    【解决方案2】:

    现在我明白了——Groovy 没有用于 JUnit4 测试的测试运行器。以下是 JUnit4 支持的范围: http://groovy.codehaus.org/Using+JUnit+4+with+Groovy

    脚本测试适配器 (ScriptTestAdapter) 允许您运行非 JUnit 测试的 groovy 脚本。这是一个例子:

    -----ScriptTest1.groovy--------
    import static org.junit.Assert.assertEquals;
    def sieve = (0..10).toList()
    GSieve.filter(sieve); // [1,2,3,5,7]
    assertEquals("Count of primes in 1..10 not correct", 5, (sieve.findAll {it -> it != 0}).size());
    -----end of ScriptTest1--------
    

    【讨论】:

      猜你喜欢
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      相关资源
      最近更新 更多