Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Не считываются аннотации Yandex.Allure перед тестовыми методами

junit
java
selenium
maven
allure
Теги: #<Tag:0x00007f7b650bc448> #<Tag:0x00007f7b650bc240> #<Tag:0x00007f7b650bc0b0> #<Tag:0x00007f7b64c53f78> #<Tag:0x00007f7b64c53cf8>

(Сергей Слётов) #1

Добрый день,

Тестовый проект на Maven, JUnit, Selenium, Allure
Аннотации тестовых методов не влияют на отчет Allure.
Вот начало кода:

import junitparams.FileParameters;
import junitparams.JUnitParamsRunner;
import junitparams.naming.TestCaseName;
import org.junit.*;
import org.junit.runner.RunWith;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.SystemClock;
import org.openqa.selenium.support.ui.WebDriverWait;
import ru.yandex.qatools.allure.annotations.*;
import ru.yandex.qatools.allure.model.SeverityLevel;

import java.net.URL;
import java.util.List;

import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;

@Title("Test Class Title")
@RunWith(JUnitParamsRunner.class)
public class ConverterTest {

static WebDriver driver;

@BeforeClass
public static void connectDriver() throws Exception {
    ConverterTest.driver = new RemoteWebDriver(
            new URL("http://localhost:4444/wd/hub"),
            DesiredCapabilities.chrome());
}

@AfterClass
public static void close() {
    ConverterTest.driver.quit();
}

@Before
public void getPage() {
    driver.get("http://www.my-bank.ru/");
    waitResults(By.xpath("//div[@class='currency-converter-widget']/form"));
}

@Severity(SeverityLevel.CRITICAL)
@TestCaseId("A")
@Title("Title 1")
@Description("Check Description 1")
@Step("{0} for {1}")
@Test
@FileParameters("Test_case_1.csv")
public void testMethod1(Integer currencySelectionFieldNo, String value) {

Суть в том, что аннотации Allure, стоящие перед методами (Severity, TestCaseId, Title, Description ), никак не влияют на вид отчета. А аннотация перед всем классом - влияет.



Подскажете, в чем может быть проблема?


(Eugene Moskalenko) #2

Чтобы была Story и Feature их надо писать так, пример:

@Features("Authorisation")
@Stories("Test authorization: positive + negative cases")
public class Login extends BaseTest implements TestCase {

  @Title("Main logIn form")
  @Test(enabled = true, groups = "Login", priority = 10)
  public void signIn() {
      PopUp popUp = loginPage().open("/login.html").loginWith(name, pass);
      verifyTextEquals(popUp.getTitleMessages(), "55555!");
      verifyTextEquals(popUp.getBodyMessages(), "55555");
  }

На самом деле аннотация, к примеру Title - применяется, но как оказалось не в последней версии - 1.4.24.RC2 и получается как-то так:

Если же вы поставите себе версию 1.4.23, то будет как-то так:

Тут у них тоже title - не сработал - http://ci.qatools.ru/job/allure-core_master-deploy/lastSuccessfulBuild/Allure_report/

Но если тест развернуть, то покажется сверху title тестового метода…

Важно:

все вот эти ваши Severity, TestCaseId, Description - они должны быть, когда вы разварачиваете свой тест в отчете, поскольку вы их указываете над тестовым методом…

@Features("Authorisation")
@Stories("Test authorization: positive + negative cases")
public class Login extends BaseTest implements TestCase {
  
  @Severity(SeverityLevel.CRITICAL)
  @TestCaseId("A")
  @Description("Check Description 1")
  @Title("Main logIn form")
  @Test(enabled = true, groups = "Login", priority = 10)
  public void signIn() {
    PopUp popUp = loginPage().open("/login.html").loginWith(name, pass);
    verifyTextEquals(popUp.getTitleMessages(), "55555!");
    verifyTextEquals(popUp.getBodyMessages(), "55555");
}

P.S. Самая последняя версия - такая себе, думаю они готовят что-то новенькое и интересненькое, возможно отчеты кардинально изменяться… Возможно они их перепишут на java 8, шото где-то слышал такое…


(Sergey Korol) #3

Если вы нашли баг с тайтлом, почему не зарепортили? На форуме все гаразд жаловаться, но баг то сам по себе не пофиксится. :wink:

Касательно Java 8, репорт уже переписан. Сейчас Allure 2 beta на завершающей стадии. Главный разработчик в поте лица целыми днями трудится. Уже писал в одной из недавних тем.

П.С. Завел issue.


(Eugene Moskalenko) #4

Да может это и не бага, возможно ребята так и хотели сделать, показывать там название метода, а не сам тайтл (хотя больше похоже на багу)… Да и не жаловался вовсе, прост наблюдение :slight_smile:

Крутотенюшка, ждем с нетерпением, сам в тестах своих перешел на java 8, после одного из ваших постов про java 8. :slight_smile:

Спасиб :slight_smile:


(Sergey Korol) #5

Ну если они хотели отображать имя, то зачем обзывать колонку “Title”? :slight_smile: Да и в предыдущей версии ведь было иначе. К тому же, недавно был похожий баг заведен, где тайты не отображались в степах (вместо title брался name). Видимо, последствия массового рефакторинга.

В любом случае фикс был минимальным, уже висит PR. Посмотрим, что скажет главный разработчик - баг это, или фича. :slight_smile:


(Eugene Moskalenko) #6

Таки да, чуть позже я там пересмотрел свое мнение по данному поводу… Больше похоже все же на бажинку, вы все очень даже правильно сделали.


(Сергей Слётов) #7

Добрый день,

А может быть такое, что дело в функциях которые используются для проверки (в вашем примере verifyTextEquals, у меня assert-ы)?
Заменил на 1.4.23, вот что получилось:

Т.е. по сути ничего не изменилось.

А про это можно подробнее? Что значит “разворачиваете тест в отчете”?


(Eugene Moskalenko) #8

по первому вопросу - нет это не из-за этого, мои verifyText, выглядит так, по сути обертка:

@Step("Verify that \"{0}\" contains \"{1}\"")
default void verifyTextContains(final String actual, final String containsString) {
    assertTrue(actual.contains(containsString));
}

Странненько, интересная задачка :slight_smile: Ваш тестовый метод - это testMethod1. А у вас в отчетах:

[0] 1, USD (test method 1)
  1. Уберите:

     @Step("{0} for {1}")
    

    это же у вас идет тестовый метод с аннотацией @Test, зачем вам там @Step?

  2. Вы можете данный тест сделать таким, чтобы у него не было параметризации + запустить его и построить отчет и показать, что бует в отчете?

  3. И еще приложите пожалуйста свой pom.xml, поглядеть… Хотя вряд ли там что-то с pom.xml не так, только что развернул проект у себя с jUnit + Allure https://github.com/allure-examples/allure-junit-example, добавил туда ваши аннотации и все ок, правда там без параметризации, как у вас.

по второму вопросу - для того, чтобы развернуть тестовый метод в отчете надо нажать сюда - http://take.ms/AGR6S


(Eugene Moskalenko) #9

Супер, разобрался, смотрите, обратите внимание на @Title(“Title 1”)

@Severity(SeverityLevel.CRITICAL)
@TestCaseId("A")
@Title("Title 1")
@Description("Check Description 1")
@Step("{0} for {1}")
@Test
public void simpleTestWithSteps1() throws Exception {
    assertThat(2, is(2));
}

А здесь у нас @Title(“Title 2”) + такая же параметризация, как и у вас - @Parameters({“1, 2”, “2, 2” }) - https://github.com/Pragmatists/junitparams/wiki/Quickstart

@Severity(SeverityLevel.CRITICAL)
@TestCaseId("B")
@Title("Title 2")
@Description("Check Description 2")
@Step("{0} for {1}")
@Test
@Parameters({"1, 2", "2, 2" })
public void simpleTestWithSteps2(int first, int second) throws Exception {
    assertThat(first, is(second));
}

Заметили разницу? А теперь смотрите на отчет:

P.S. Кстати, в тестовом методе аннотация @Step("{0} for {1}") - не нужна.


(Сергей Слётов) #10

Да, без параметризации у меня тоже работает, но мне нужно именно с параметризацией через csv)

Теперь проблема в другом, если один из тестов фейлится, то Maven выдает следующее:


T E S T S

Running ConverterTest
Tests run: 2, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 15.513 sec <<< FAILURE!
testMethod1_spec1(ConverterTest) Time elapsed: 5.01 sec <<< FAILURE!
org.junit.ComparisonFailure: failed expected:<[USD]> but was:<[RUB]>
at org.junit.Assert.assertEquals(Assert.java:115)
at ConverterTest.testMethod1_spec1(ConverterTest.java:74)

Results :

Failed tests:
ConverterTest.testMethod1_spec1:74 failed expected:<[USD]> but was:<[RUB]>

Tests run: 2, Failures: 1, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 20.043 s
[INFO] Finished at: 2016-07-01T15:56:12+03:00
[INFO] Final Memory: 11M/155M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.14:test (default-test) on project converter-testing: There are test failures.
[ERROR]
[ERROR] Please refer to C:\Users\Серг\IdeaProjects\converter-testing\target\surefire-reports for the individual test results.
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

Process finished with exit code 1


(Eugene Moskalenko) #11

Ну все правильно, билд фейлиться, потому что автотест отловил ошибку и отписал об этом:

Results :

Failed tests: 
ConverterTest.testMethod1_spec1:74 failed expected:<[USD]> but was:<[RUB]>

Вам надо либо так запускать:

mvn clean test

после всего теста еще сгенерировать отчет:

mvn site

оно тогда сгенерит отчет и в отчете покажет ошибки найденные в процессе тестирования

Либо указать параметр в pom.xml:

<testFailureIgnore>true</testFailureIgnore>

добавить его надо сюда:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-surefire-plugin</artifactId>
   <version>${maven-surefire-plugin.version}</version>
   <configuration>
     <testFailureIgnore>true</testFailureIgnore>
   </configuration>
</plugin>

Советую еще тогда прочесть вот эту тему - Allure, Jenkins и необходимость фейлить джобу с упавшим тестом


(Сергей Слётов) #12

То есть, нет никакого способа задать заголовки и прочее описание, для параметризованных тестов?


(Сергей Слётов) #13

Для замены Title можно использовать JUnit аннотацию @TestCaseName(“Case_{index} for {0} with {1}”)


(Eugene Moskalenko) #14

Для параметризированных у меня в TestNG работает все идеально)


(Sergey Korol) #15

Уже смерджили фикс, так что можете пересобирать проект и использовать стандартную алюровскую аннотацию.


(Eugene Moskalenko) #16

@S_e_rgej, ваш вопрос решился? Поняли в чем проблема и почему у вас не работали аннотации?


(Сергей Слётов) #17

А какие версии следующих групп и артефактов нужно использовать?:

     <groupId>ru.yandex.qatools.allure</groupId>
     <artifactId>allure-junit-adaptor</artifactId>

     <groupId>ru.yandex.qatools.allure</groupId>
     <artifactId>allure-maven-plugin</artifactId>

(Sergey Korol) #18

Ну так если вы хотите последний билд с фиксом, вам надо самим пересобрать Allure. А там уж, какую версию укажите, так и будет.

Касательно плагина - 2.5 последняя. Но чтобы он подтянул ваш репорт, ему нужно явно в конфигурации указать новую версию алюра.


(Сергей Слётов) #19

Можно поподробнее:

Как я понял, последняя версия мавен-плагина пофиксена? Или адаптора для junit?
Пересобирать надо плагин или адаптор? Или и то, и то?
И в этом ключе, какие версии нужно использовать адаптора и плагина?

И на сколько я заметил, в фиксе говорится только о @Title, но остальные аннотации например @Severity ) Allure так же не срабатывают. И ничего не говорится про параметризацию.


(Eugene Moskalenko) #20

На примере выше, я показал, что на jUnit все срабатывает, если не использовать параметризацию.