Отчет cucumber.json перезаписывается при повторном запуске сценария - PullRequest
0 голосов
/ 01 мая 2018

У меня есть проект UI Test и проект API-тестирования с одним и тем же технологическим стеком (JAVA1.8, Cucumber-JVM, JUnit, Maven), и оба проекта показывают мне эту проблему. Возможно потому, что в обоих случаях присутствует один и тот же набор зависимостей.

Я использовал механизм повторного запуска теста Flaky, используя встроенную функциональность maven-surefire-plugin <rerunFailingTestsCount>1</rerunFailingTestsCount>. Кроме того, у меня есть огуречные зависимости, основанные на <groupId>io.cucumber</groupId>, а не <groupId>info.cukes</groupId>. Оба они имеют свои собственные версии зависимостей cucumber-java и cucumber-jvm.

Мой POM.XML выглядит следующим образом.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.21.0</version>
    <configuration>
         <rerunFailingTestsCount>1</rerunFailingTestsCount>
    </configuration>
    <executions>
         <execution>
             <id>acceptance-test</id>
             <phase>integration-test</phase>
             <goals>
                 <goal>test</goal>
             </goals>
             <configuration>
                 <forkCount>1</forkCount>
                 <reuseForks>true</reuseForks>
                  <includes>
                      <include>**/*Runner.class</include>
                  </includes>
              </configuration>
         </execution>
    </executions>
</plugin>
<dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-java</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-junit</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-spring</artifactId>
        <version>2.4.0</version>
    </dependency>
    <dependency>
        <groupId>io.cucumber</groupId>
        <artifactId>cucumber-jvm</artifactId>
        <version>2.4.0</version>
        <type>pom</type>
    </dependency>

ТОЛЬКО КОД ФАЙЛА РАБОТЫ

@RunWith(Cucumber.class)
@ContextConfiguration(locations = {"file:/src/test/resources/spring-config.xml"})
@CucumberOptions(
        glue = "com.test.uitest",
        features = "classpath:cucumber",
        tags = {"~@ignore","@ui_home"},
        monochrome = true,
        plugin = {"pretty", "html:target/cucumber-reports",
                "json:target/cucumber-reports/cucumber.json",
                "rerun:target/rerun.txt"} //Creates a text file with failed scenarios
)
public class AllTestsRunner {
}

Теперь, очевидно, мне нужен еще один бегун со следующим кодом (как в других форумах и темах здесь, в StackOverflow)

@RunWith(Cucumber.class)
@CucumberOptions(
        monochrome = true,
        glue = "com.test.uitest",
        features = "@target/rerun.txt", //Cucumber picks the failed scenarios from this file
        format = {"pretty", "html:target/rerun-reports",
                "json:target/cucumber-reports/rerun-report.json"}
)
public class FailedTestsRunner {
}

Но мне не нужен этот второй бегун, так как механизм перезапуска работает совершенно блестяще, когда на верху только один бегун. Даже нет необходимости в файле rerun.txt, сгенерированном в 1-ом бегунке. Механизм встраивания в плагине maven-surefire (v_2.21.0) вместе с io.cucumber v_2.4.0 работает отлично, и если какой-либо сценарий не выполняется во время 1-го выполнения, он запускается автоматически без записи в файл rerun.txt.

## ПРОБЛЕМА ЕСТЬ ##

В моем файле возможностей есть 5 сценариев. Если все они пройдут в 1-й серии. Он успешно генерирует отчет с отчетом cucumber.json, показывающий все 5 сценариев. Но если (скажем) 2 из 5 сценариев завершаются неудачно и эти сценарии выполняются автоматически с помощью механизма повторного запуска, файл отчета cucumber.json записывает только результаты этих двух сценариев, а не все 5 сценариев. Общая сборка ПРОЙДЕТ, если эти 2 сценария пройдут повторно, или НЕУДАЧИ, если эти 2 сценария потерпят неудачу. Это правильно, но моя проблема в том, что cucumber.json перезаписывается механизмом перезапуска. Я пытался использовать плагин maven-cucumber-reporting v_3.16.0, но он фактически читает сам файл cucumber.json и, следовательно, не решает мою проблему. Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Хорошая новость в том, что вы не делаете ничего плохого!

Плохая новость в том, что наблюдаемые вами результаты полностью соответствуют ожидаемым. Это естественное следствие объединения различных инструментов (Surefire --> JUnit --> Cucumber), которые иначе не знают друг друга. С точки зрения Cucumber может показаться, что повторный запуск - совершенно новое выполнение, поэтому он с радостью перезапишет старые отчеты. Только в начале цепочки можно создавать точные отчеты.

Таким образом, ваши варианты от наименьшего к большинству усилий и худшего к лучшему качеству:

  1. Используйте отчеты, сгенерированные Surefire.

  2. Напишите свой собственный плагин, который добавляет результаты, а не перезаписывает их.

  3. Примите участие в проекте Cucumber и помогите решить эту проблему принципиально.

Редактировать: удалено предложение использовать cucumber-jvm-parallel-plugin для создания отдельного модульного теста для каждого сценария. На самом деле это не сработает.

0 голосов
/ 01 мая 2018

В этом случае AllTestsRunner запускается многократно, пока не будет достигнуто значение, указанное в параметре rerunFailingTestsCount, или произойдет сбой при последнем запуске. Так что последний забег всегда побеждает.

Плагин surefire создает собственные отчеты в папке target . Два отчета: AllTestsRunner.txt, что является сводкой, а TEST-AllTestsRunner.xml содержит подробности. Оба этих отчета содержат подробности обо всех прогонах. Вы можете создать специальную программу для преобразования файла TEST-AllTestsRunner.xml в нужный файл json.

Существует плагин верный отчет , который читает вышеуказанный xml-файл и генерирует html-отчет. Он будет создавать отчеты в папке сайта и работать с mvn site. Может быть, это работает.

...