2016-11-12 2 views
0

Я пытаюсь запустить функции огурца в JUnit 5 Jupiter. Я снял код из источника Cucumber-jvm и адаптировал его для JUnit 5 TestFactory. Он работает: Я вижу, что мои возможности работать, когда я бегу все тесты JUnit (это Котлин код, но то же самое относится и к Java):Как получить результат функции огурца

@CucumberOptions(
     plugin = arrayOf("pretty"), 
     features = arrayOf("classpath:features") 
) 
class Behaviours { 
    @TestFactory 
    fun loadCucumberTests() : Collection<DynamicTest> { 
     val options = RuntimeOptionsFactory(Behaviours::class.java).create() 
     val classLoader = Behaviours::class.java.classLoader 
     val resourceLoader = MultiLoader(classLoader) 
     val classFinder = ResourceLoaderClassFinder(resourceLoader, classLoader) 
     val runtime = Runtime(resourceLoader, classFinder, classLoader, options) 
     val cucumberFeatures = options.cucumberFeatures(resourceLoader) 
     return cucumberFeatures.map<CucumberFeature, DynamicTest> { feature -> 
      dynamicTest(feature.gherkinFeature.name) { 
       var reporter = options.reporter(classLoader) 
       feature.run(options.formatter(classLoader), reporter, runtime) 
      } 
     } 
    } 
} 

Однако JUnit сообщает, что каждая функция была успешной, то ли он или нет фактически был. Когда функции не работают, результаты корректно печатаются, но сгенерированные DynamicTest проходят. Ни gradle test, ни Intellij не замечают ошибку: мне нужно проверить вывод текста.

Я думаю, что мне нужно выяснить, в Executable, переданном как второй параметр dynamicTest, каков был результат этой функции, и при необходимости поднимите утверждение. Как определить результат feature или feature.gherkinFeature в этот момент?

И есть ли способ получить результаты для каждого сценария в этой функции? Или лучше, есть ли способ запустить конкретный сценарий, чтобы я мог создать DynamicTest для каждого сценария, что позволило мне улучшить детализацию отчетов в JUnit?

+0

Вы можете использовать После крюка и передать объект Сценария к нему. Класс сценария имеет getStatus(), который возвращает переданный, неудачный, неопределенный, пропущенный, ожидающий или isFailed(), который возвращает логическое значение. – Grasshopper

+0

Возможно [этот вопрос] (https://stackoverflow.com/questions/35550386/cucumber-jvm-hooks-when-scenario-is-passed-or-failed/35553304#35553304) может вам помочь. – troig

+1

Какой тип 'репортер' в вашем примере? Я мало разбирался в Junit5, но для интеграции junit4 это должен быть «JunitReporter», который пересылает информацию в junit' RunNotifier'. –

ответ

1

Чтобы записать результат сценария Cucumber как JUnit5, мне было проще реализовать JunitLambdaReporter, который по сути является более простой версией существующего JunitReporter. После того как вы репортер, который помнит, что нынешний сценарий, то вы можете создать @TestFactory, который использует эту логику:

return dynamicTest(currentScenario.getName(),() -> { 
    featureElement.run(formatter, reporter, runtime); 
    Result result = reporter.getResult(currentScenario); 

    // If the scenario is skipped, then the test is aborted (neither passes nor fails). 
    Assumptions.assumeFalse(Result.SKIPPED == result); 

    Throwable error = result.getError(); 
    if (error != null) { 
    throw error; 
    } 
});