Может ли TestNG увидеть результаты моего спока (JUnit)?
Нужно, чтобы TestNG запускал мои тесты Спока, поскольку TestNG используется во всей остальной системе.
Поскольку TestNG поддерживает запуск тестов JUnit, я попробовал это:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="suiteTestName" verbose="1" junit="true">
<test name="myTestName">
<classes>
<class name="mypackage.artifact.SomeArtifactSpecification" />
</classes>
</test>
</suite>
Так что это на самом деле отлично выполнило модульный тест Спока Groovy 'SomeArtifactSpecification'. Я мог видеть некоторые операции ввода / вывода из тестов, но, поскольку я работал из Eclipse, я использовал отладчик, чтобы убедиться, что все тесты выполнялись правильно. У моего classpath есть TestNG-6.8.7 и JUnit-4.10. Проблема в том, что TestNG, похоже, не знает, что сделал! Вот конечный результат:
===============================================
myTestName
Total tests run: 0, Failures: 0, Skips: 0
===============================================
Кто-нибудь знает, возможно ли заставить TestNG распознавать эти тесты?
Дополнительные детали - добавлено для Баунти
В одном из комментариев ниже Питер утверждает, что это зависит от того, что делает TestNG. Я исследовал это столько, сколько мог. Похоже, что и Junit, и TestNG вызывают метод run из строки класса Sputnik 63 Спока. Однако при вызове непосредственно из JUnit Sputnik вызывается из JUnit4TestClassReference. При вызове из TestNG Sputnik вызывается из JUnitCore.
Таким образом, остается вопрос: как заставить TestNG распознавать результаты тестов Спока? Если я хочу жить долго и процветать, мне действительно нужно знать !!! Похоже, что ответом может быть заставить TestNG работать с JUnit4TestClassReference или использовать какой-то тип умной оболочки, чтобы TestNG делал это ...
Для подробностей, я разместил две трассировки стека ниже. Первый из запуска TestNG, который не работает, второй из запуска Спока напрямую без TestNG.
Первая трассировка стека от TestNG:
org.testng.remote.RemoteTestNG at localhost:54288
Thread [main] (Suspended (breakpoint at line 65 in ArtifactManagerSpecification))
ArtifactManagerSpecification.$spock_feature_0_0() line: 65
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 601
ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138
ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330
ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311
ParameterizedSpecRunner(BaseSpecRunner).invokeFeatureMethod() line: 285
ParameterizedSpecRunner(BaseSpecRunner).doRunIteration() line: 256
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 601
ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138
ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330
ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311
ParameterizedSpecRunner(BaseSpecRunner).runIteration(Object[], int) line: 223
ParameterizedSpecRunner(BaseSpecRunner).initializeAndRunIteration(Object[], int) line: 214
ParameterizedSpecRunner(BaseSpecRunner).runSimpleFeature() line: 205
ParameterizedSpecRunner(BaseSpecRunner).doRunFeature() line: 199
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 601
ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138
ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330
ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311
ParameterizedSpecRunner(BaseSpecRunner).runFeature() line: 175
ParameterizedSpecRunner(BaseSpecRunner).runFeatures() line: 152
ParameterizedSpecRunner(BaseSpecRunner).doRunSpec() line: 112
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 601
ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138
ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330
ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311
ParameterizedSpecRunner(BaseSpecRunner).runSpec() line: 91
ParameterizedSpecRunner(BaseSpecRunner).run() line: 82
Sputnik.run(RunNotifier) line: 63
JUnitCore.run(Runner) line: 157
JUnitCore.run(Request) line: 136
JUnit4TestRunner.start(Class, String...) line: 81
JUnit4TestRunner.run(Class, String...) line: 69
TestRunner$1.run() line: 682
TestRunner.runWorkers(List<IWorker<ITestNGMethod>>, String, ListMultiMap<Integer,TestMethodWorker>) line: 1005
TestRunner.privateRunJUnit(XmlTest) line: 713
TestRunner.run() line: 614
SuiteRunner.runTest(TestRunner) line: 334
SuiteRunner.runSequentially() line: 329
SuiteRunner.privateRun() line: 291
SuiteRunner.run() line: 240
SuiteRunnerWorker.runSuite(SuiteRunnerMap, XmlSuite) line: 52
SuiteRunnerWorker.run() line: 86
RemoteTestNG(TestNG).runSuitesSequentially(XmlSuite, SuiteRunnerMap, int, String) line: 1224
RemoteTestNG(TestNG).runSuitesLocally() line: 1149
RemoteTestNG(TestNG).run() line: 1057
RemoteTestNG.run() line: 111
RemoteTestNG.initAndRun(String[], CommandLineArgs, RemoteArgs) line: 204
RemoteTestNG.main(String[]) line: 175
Second Stack Trace (который работает) работает напрямую с Споком
Thread [main] (Suspended (breakpoint at line 65 in ArtifactManagerSpecification))
ArtifactManagerSpecification.$spock_feature_0_0() line: 65
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 601
ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138
ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330
ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311
ParameterizedSpecRunner(BaseSpecRunner).invokeFeatureMethod() line: 285
ParameterizedSpecRunner(BaseSpecRunner).doRunIteration() line: 256
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 601
ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138
ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330
ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311
ParameterizedSpecRunner(BaseSpecRunner).runIteration(Object[], int) line: 223
ParameterizedSpecRunner(BaseSpecRunner).initializeAndRunIteration(Object[], int) line: 214
ParameterizedSpecRunner(BaseSpecRunner).runSimpleFeature() line: 205
ParameterizedSpecRunner(BaseSpecRunner).doRunFeature() line: 199
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 601
ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138
ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330
ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311
ParameterizedSpecRunner(BaseSpecRunner).runFeature() line: 175
ParameterizedSpecRunner(BaseSpecRunner).runFeatures() line: 152
ParameterizedSpecRunner(BaseSpecRunner).doRunSpec() line: 112
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 57
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 601
ReflectionUtil.invokeMethod(Object, Method, Object...) line: 138
ParameterizedSpecRunner(BaseSpecRunner).invokeRaw(Object, MethodInfo, Object...) line: 330
ParameterizedSpecRunner(BaseSpecRunner).invoke(Object, MethodInfo, Object...) line: 311
ParameterizedSpecRunner(BaseSpecRunner).runSpec() line: 91
ParameterizedSpecRunner(BaseSpecRunner).run() line: 82
Sputnik.run(RunNotifier) line: 63
JUnit4TestClassReference(JUnit4TestReference).run(TestExecution) line: 50
TestExecution.run(ITestReference[]) line: 38
RemoteTestRunner.runTests(String[], String, TestExecution) line: 467
RemoteTestRunner.runTests(TestExecution) line: 683
RemoteTestRunner.run() line: 390
RemoteTestRunner.main(String[]) line: 197