Groovy, модульное тестирование Junit4 и связанный тестовый бегун
Я пытаюсь написать контрольные примеры Junit4 для моего кода на Groovy. Тестовый пример Junit 4 прекрасно работает в моей Eclipse IDE, которая является SpringSource Tool Suite. Однако я не могу запустить тест для запуска всех тестовых случаев.
Вот моя текущая попытка бегуна. Это в значительной степени взято непосредственно с самого сайта 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)
}
}
2 ответа
Я также боролся с этим целую вечность и не мог заставить документированные образцы 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 содержит количество выполненных, игнорируемых, неудачных попыток, а также подробный список ошибок, который легко опрашивается.
Теперь я понял - у Groovy нет бегуна для тестов JUnit4. Вот степень поддержки JUnit4: http://groovy.codehaus.org/Using+JUnit+4+with+Groovy
Адаптер тестов скриптов (ScriptTestAdapter) позволяет вам запускать скрипты groovy, которые НЕ являются тестами JUnit. Вот пример:
-----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--------