<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.sbtqa.pprb</groupId>
<artifactId>xxxxxxx</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<allure.version>1.4.0</allure.version>
<!--<aspectj.version>1.8.10</aspectj.version>-->
<aspectj.version>1.9.3</aspectj.version>
<hostname>${env.COMPUTERNAME}</hostname>
<pf2.version>11.1.1</pf2.version>
<maven.build.timestamp.format>yyyy/MM/dd/'${hostname}'-HH-mm</maven.build.timestamp.format>
<allure.results.directory>${project.build.directory}/allure-results</allure.results.directory>
</properties>
<dependencies>
<dependency>
<groupId>ru.sbtqa.tag.pagefactory</groupId>
<artifactId>html-plugin</artifactId>
<version>${pf2.version}</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>ru.sbt.qa</groupId>
<artifactId>datagens</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.sikulix</groupId>
<artifactId>sikulixapi</artifactId>
<version>1.1.2</version>
<exclusions>
<exclusion>
<groupId>com.sikulix</groupId>
<artifactId>sikulix2tigervnc</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>ru.sbrf.vivat.qa</groupId>
<artifactId>vivat-files</artifactId>
<version>1.0.2</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<!--ALM PLUGIN-->
<plugin>
<groupId>ru.sbt.qa</groupId>
<artifactId>sbtalm-maven-plugin</artifactId>
<version>3.2.6</version>
<configuration>
<almProperties>src/test/resources/config/alm.properties</almProperties>
<commentTemplate>src/test/resources/config/alm-comment.html</commentTemplate>
<!--<baseUrl>http://10.68.195.104/reports/${maven.build.timestamp}/</baseUrl>-->
<dataFolder>${allure.results.directory}</dataFolder>
</configuration>
</plugin>
<!--end ALM-->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sonar-maven-plugin</artifactId>
<version>2.5</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.21.0</version>
<configuration>
<junitArtifactName>junit:junit</junitArtifactName>
<testFailureIgnore>false</testFailureIgnore>
<skipTests>false</skipTests>
<argLine>
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
-Dcucumber.options="--plugin io.qameta.allure.cucumber2jvm.AllureCucumber2Jvm --plugin pretty"
-Dfile.encoding=UTF-8
</argLine>
</configuration>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
<!--ALLURE2-->
<plugin>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-maven</artifactId>
<version>2.9</version>
</plugin>
<!--end ALLURE2-->
<!--ALLURE2 CATEGORIES-->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${allure.results.directory}</outputDirectory>
<resources>
<resource>
<directory>src/test/resources</directory>
<includes>
<include>allure.properties</include>
<include>categories.json</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<!--END ALLURE2 CATEGORIES-->
</plugins>
</build>
</project>
Не могу сформировать Allure отчет в своем автотесте.
Запускаю выполнение автотеста с помощью junit: при выполнении не создается папка allure-results и получаю следующие ошибки:
10:18:53.917 [main] ERROR io.qameta.allure.AllureLifecycle - Could not start step: no test case running
10:18:54.316 [main] ERROR io.qameta.allure.AllureLifecycle - Could not update step: no step running
10:18:54.316 [main] ERROR io.qameta.allure.AllureLifecycle - Could not stop step: no step running
10:18:54.317 [main] ERROR io.qameta.allure.AllureLifecycle - Could not start step: no test case running
10:18:54.387 [main] ERROR io.qameta.allure.AllureLifecycle - Could not update step: no step running
10:18:54.387 [main] ERROR io.qameta.allure.AllureLifecycle - Could not stop step: no step running
При запуске с помощью maven, получаю следующий ворнинг:
[ERROR] Directory C:gitetc_testtargetallure-results not found.
[WARNING] Allure report was skipped because there is no results directories found.
Если я создаю папку allure-results вручную, то при исполнении mvn удалит ее и вернет тот же самый ворнинг.
Мой pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>ru.mos</groupId>
<artifactId>etc_test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<aspectj.version>1.8.10</aspectj.version>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.7.0-RC1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-engine -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.7.0-RC1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager -->
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>3.8.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-junit5</artifactId>
<version>2.13.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.maven.plugins/maven-surefire-plugin -->
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M5</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<useSystemClassLoader>false</useSystemClassLoader>
<argLine>
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/1.8.10/aspectjweaver-1.8.10.jar"
</argLine>
<properties>
<property>
<name>listener</name>
<value>io.qameta.allure.junit5.AllureJunit5</value>
</property>
</properties>
<systemProperties>
<property>
<name>allure.results.directory</name>
<value>${project.build.directory}/allure-results</value>
</property>
</systemProperties>
</configuration>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-maven</artifactId>
<version>2.10.0</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Структура теста:
TestCase5986:
package ru.mos;
import io.qameta.allure.*;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;
public class TestCase5986 {
public static LoginPage loginPage;
public static MainPage mainPage;
public static WblPage wblPage;
public static WebDriver driver;
@BeforeClass
public static void setup() {
System.setProperty("webdriver.chrome.driver", ConfProperties.getProperty("chromedriver"));
driver = new ChromeDriver();
loginPage = new LoginPage(driver);
mainPage = new MainPage(driver);
wblPage = new WblPage(driver);
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get(ConfProperties.getProperty("loginpage"));
}
@Epic("Тестирование стенда ETC)
@Feature(value = "CASE-5986")
@Severity(SeverityLevel.CRITICAL)
@Description("Позитивный тест формы логирования в системе")
@Story (value = "Авторизация с корректным логином")
@Test
public void LoginTest() {
loginPage.inputLogin(ConfProperties.getProperty("login"), ConfProperties.getProperty("password"));
loginPage.clickSubmitBtn();
/*mainPage.waybillListClick();
wblPage.createBtnClick();
wblPage.carSelect();
wblPage.createMission();
wblPage.techOpIdSelect();
wblPage.facilityIdSelect();
wblPage.routeIdSelect();
wblPage.missionSubmitClick();
wblPage.refillAddRow1();
wblPage.oneFuelTankContSelect();
wblPage.depDateFieldInput();
wblPage.arrivalDateFieldInput();
wblPage.newDepDate();
assert wblPage.checkErrorMsg();*/
}
@AfterClass
public static void driverClose () {
driver.close();
}
}
loginPage:
package ru.mos;
import io.qameta.allure.Step;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class LoginPage {
public WebDriver driver;
public LoginPage(WebDriver driver) {
PageFactory.initElements(driver, this);
this.driver = driver;
}
@FindBy(id = "login")
public WebElement loginFld;
@FindBy(id = "password")
public WebElement passwordFld;
@FindBy(id = "submit")
public WebElement submitBtn;
@Step("Ввод логина {login} и пароля {password}")
public void inputLogin(String login, String password) {
loginFld.sendKeys(login);
passwordFld.sendKeys(password);
}
@Step ("Подтверждение авторизации")
public void clickSubmitBtn() {
submitBtn.click();
}
}
У меня два предположения:
- чего-то не хватает в pom.xml;
- некорректное использование аннотаций.
UPD:
При выполнении команды allure:serve формируется пустой отчет:
UPD2: Лог Maven при выполнении кейса:
C:jdk1.8.0_161binjava.exe -Dmaven.multiModuleProjectDirectory=C:gitTestNGAllure_test "-Dmaven.home=C:UsersTinkovAYAppDataLocalJetBrainsIntelliJ IDEA Community Edition 2020.2pluginsmavenlibmaven3" "-Dclassworlds.conf=C:UsersTinkovAYAppDataLocalJetBrainsIntelliJ IDEA Community Edition 2020.2pluginsmavenlibmaven3binm2.conf" "-Dmaven.ext.class.path=C:UsersTinkovAYAppDataLocalJetBrainsIntelliJ IDEA Community Edition 2020.2pluginsmavenlibmaven-event-listener.jar" "-javaagent:C:UsersTinkovAYAppDataLocalJetBrainsIntelliJ IDEA Community Edition 2020.2libidea_rt.jar=52132:C:UsersTinkovAYAppDataLocalJetBrainsIntelliJ IDEA Community Edition 2020.2bin" -Dfile.encoding=UTF-8 -classpath "C:UsersTinkovAYAppDataLocalJetBrainsIntelliJ IDEA Community Edition 2020.2pluginsmavenlibmaven3bootplexus-classworlds-2.6.0.jar;C:UsersTinkovAYAppDataLocalJetBrainsIntelliJ IDEA Community Edition 2020.2pluginsmavenlibmaven3bootplexus-classworlds.license" org.codehaus.classworlds.Launcher -Didea.version=2020.2.1 clean test -Dsuite=src/test/resources/testng.xml.xml -Dversion=83.0 allure:serve
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< ru.dit:TestNGAllure_test >----------------------
[INFO] Building TestNGAllure_test 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ TestNGAllure_test ---
[INFO] Deleting C:gitTestNGAllure_testtarget
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ TestNGAllure_test ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ TestNGAllure_test ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ TestNGAllure_test ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 1 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ TestNGAllure_test ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 5 source files to C:gitTestNGAllure_testtargettest-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.20:test (default-test) @ TestNGAllure_test ---
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running TestSuite
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 7.034 s - in TestSuite
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO]
[INFO] --- allure-maven:2.10.0:serve (default-cli) @ TestNGAllure_test ---
[INFO] Allure installation directory C:gitTestNGAllure_test/.allure
[INFO] Try to finding out allure 2.8.1
[INFO] Generate Allure report (serve) with version 2.8.1
[INFO] Generate Allure report to C:gitTestNGAllure_testtargetsite/allure-maven-plugin
[INFO] Found results directory C:gitTestNGAllure_testtargetallure-results
[INFO] Can't find information about categories.
[INFO] Generate report to C:gitTestNGAllure_testtargetsiteallure-maven-plugin
Generating report to temp directory...
Report successfully generated to C:UsersTinkovAYAppDataLocalTemp6365362014998145974allure-report
Starting web server...
2020-08-26 15:35:45.363:INFO::main: Logging initialized @2065ms to org.eclipse.jetty.util.log.StdErrLog
Server started at <http://10.159.209.98:52175/>. Press <Ctrl+C> to exit
Структура проекта
и еще куча таких моментов
Stanislav Mischenko
@krigan
вот теперь как раз буду искать утечку, т.к. ни ретраев, ни датапровайдеров нет
Vladimir-edu
@Vladimir-edu
Всем привет! Столкнулся с проблемой [main] ERROR io.qameta.allure.AllureLifecycle — Could not start step: no test case running. Идея какая есть отдельный тестовый класс №1 для проверки работы терминала. В нем все размечено для аллюра — все работает. Все ОК. Тепрь у меня есть другой тестовый класс №2 который проверяет некие плюшки для активного терминала. Когда я пытаюсь вызвать методы проверки активности терминала (из класса №1) внутри методов класса№2 — то все норм. НО как только я пытаюсь перенести эти вызовы внутри класса2 в метод с аннотацией Before (junit4) , что бы не прописывать вызов внутри каждого метода, то получаю [main] ERROR io.qameta.allure.AllureLifecycle — Could not start step: no test case running.
потому что аллюр не умеет фикстуры для junit4
то есть все степы из before — не знают, куда себя девать, о чем и пишут в лог
Vladimir-edu
@Vladimir-edu
@baev А как-нть это можно обойти? Или придется все то что лежало в бефо распихивать в каждый метод — это же куча лишних строк кода выходит
красиво не будет, к сожалению
Vladimir-edu
@Vladimir-edu
И в будущем изменений в данном направлении не предвидится?
у Junit4 нет способа узнать о фикстурах без добавления кастомного раннера
Vladimir-edu
@Vladimir-edu
Жаль, спасибо.
формально можно сделать, например, на аспектах. Но мне совсем не хочется тратить на это время. Но может когда-нибудь появится
я бы лучше для junit5 запилил поддержку фикстур
Vladimir-edu
@Vladimir-edu
@baev Ладно я закостылилил клон метода без Аллюровского обвеса со step и прочее. Причем если тест падает по причине Ассерта сработавшего на уровне бефо — то в отчет эта инфа никак не попадает. А вот это уже действительно неприятно :((( т.е. либо мне затаскивать ассерт в каждый метод (что не смертельно, но неприятно) И вот с этим уже наверно надо что-то делать так как не всегда фикстуры являются примитивными данными.
Vladimir-edu
@Vladimir-edu
Т.е. тест падает в консоли [ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 2.8 s <<< FAILURE!. Но в аллюр отчет эта инфа не попадает. (нет никакого упоминания об упавшем тесте(тестах)) Так как тест класс со всеми его методами свалился на уровне бефо. ИМХО это надо править
Добрый вечер GUYS. Подскажите для MSTest есть ли плагин для аллура? или самому писатть обработчики?
@pulversss trx вроде аллюр умеет без адаптера
:warning: для тех, кто был на митапе нашем, и заинтересовался — пишите мне в личку :warning:
Stanislav Mischenko
@krigan
а для тех кто не был по географическим соображениям, но очень хочет заинтересоваться — где бы узнать чекак…
Обещали видео «через 2-3 недели», ЕМНИП
@baev , а что писать тебе в личку?)
@Asdwarf хочу на тнт аллюр сервер ))
Писать приветы, я собираю фидбек
Добрый день! Такой вопрос — есть ли возможность скрыть все пункты меню за исключением Overview и Behaviors, по возможности, без ковыряния в исходниках? Для некоторых больших манагеров это дофига сложно.
AlexP
@AlexanderPoleschuk
ниасилили?
сложно не щелкать в ненужные менюшки?)))
если очень хочется, то можно форкнуть и отключить ненужные штуки, это не очень сложно
ocherniavskyi
@ocherniavskyi-lohika-tix
@baev а видос с митапа будет? а то очень интересно
Через .allure/allure-2.7.0/config удалось скрыть разве что Packages
Всем привет! Тут такой вопрос — можно ли, к примеру, поскрывать все пункты меню в репорте, оставив только Overview и Behaviors? Для каких-то больших манагеров это сложнааа и они этого не хотят..
ocherniavskyi
@ocherniavskyi-lohika-tix
@baev а видосы с митапа будут, а то очень интересно
это один из епиков для следующего большого релиза — сделать возможность конфигурировать вообще все
будет, через пару-тройку недель
без ковыряния кода сложно будет
Блин, что с чатиком. То сообщения упорно не отсылаются, то приходит вся пачка..)
@baev , спасибо! Ждём с нетерпением
AlexP
@AlexanderPoleschuk
gitter штормит. у меня теперь текст сообщения, которое я набираю какой-то здоровый. а текст сообщений в чате мельче стал
Stanislav Mischenko
@krigan
всем ку! можно ли поменять на лету имя теста для репорта?
Привет всем!
Подскажите, пожалуйста, как можно добавить логи с тестов к аллюр отчету? Ипользую groovy, spock, wslite (for https requests). Добавил в проект allure-attachments. Но в отчетах только прошел/непрошел ли тест и данные по параметризированым тестам.
Спасибо!
@krigan для JVM: Allure.getLifecycle().updateTestResult(tr -> tr.setName(«new name»))
вызывать в рамках метода надо
@Luceafarul надо добавить interceptor для клинта, который делает запросы
и в нем можно на каждый запрос что-то создать)
Stanislav Mischenko
@krigan
@baev , спасибо, как раз нашел это сейчас, должно подойти
@krigan смотри в целом, как в Allure классе апи сделано
Best Java code snippets using io.qameta.allure.AllureLifecycle (Showing top 20 results out of 315)
public static void step(final String name, final Status status) { final String uuid = UUID.randomUUID().toString(); getLifecycle().startStep(uuid, new StepResult().setName(name).setStatus(status)); getLifecycle().stopStep(uuid); }
@Override public void testStarted(final Description description) { final String uuid = testCases.get(); final TestResult result = createTestResult(uuid, description); getLifecycle().scheduleTestCase(result); getLifecycle().startTestCase(uuid); }
@AfterReturning(pointcut = "anyMethod() && withStepAnnotation()") public void stepStop() { getLifecycle().updateStep(s -> s.setStatus(Status.PASSED)); getLifecycle().stopStep(); }
public void addAttachment(final String name, final String type, final String fileExtension, final InputStream stream) { writeAttachment(prepareAttachment(name, type, fileExtension), stream); }
@Override public void endOfScenarioLifeCycle(final Scenario scenario) { final StepUtils stepUtils = new StepUtils(currentFeature, currentScenario); synchronized (gherkinSteps) { while (gherkinSteps.peek() != null) { stepUtils.fireCanceledStep(gherkinSteps.remove()); } } final String scenarioUuid = scenarioUuids.remove(scenario); lifecycle.stopTestCase(scenarioUuid); lifecycle.writeTestCase(scenarioUuid); }
final Status status = ResultsUtils.getStatus(result.getError()) .orElse(Status.FAILED); lifecycle.updateStep(stepResult -> stepResult.setStatus(Status.FAILED)); lifecycle.updateTestCase(scenarioUuid, scenarioResult -> scenarioResult.setStatus(status) .setStatusDetails(statusDetails)); lifecycle.stopStep(); break; case PENDING: lifecycle.updateStep(stepResult -> stepResult.setStatus(Status.SKIPPED)); lifecycle.updateTestCase(scenarioUuid, scenarioResult -> scenarioResult.setStatus(Status.SKIPPED) .setStatusDetails(statusDetails)); lifecycle.stopStep(); break; case SKIPPED: lifecycle.updateStep(stepResult -> stepResult.setStatus(Status.SKIPPED)); lifecycle.stopStep(); break; case PASSED: lifecycle.updateStep(stepResult -> stepResult.setStatus(Status.PASSED)); lifecycle.stopStep(); lifecycle.updateTestCase(scenarioUuid, scenarioResult -> scenarioResult.setStatus(Status.PASSED) .setStatusDetails(statusDetails));
@Override public void onEvent(final LogEvent event) { lifecycle.getCurrentTestCase().ifPresent(uuid -> { final String stepUUID = UUID.randomUUID().toString(); lifecycle.startStep(stepUUID, new StepResult() .setName(event.toString()) .setStatus(Status.PASSED)); lifecycle.updateStep(stepResult -> stepResult.setStart(stepResult.getStart() - event.getDuration())); if (LogEvent.EventStatus.FAIL.equals(event.getStatus())) { if (saveScreenshots) { lifecycle.addAttachment("Screenshot", "image/png", "png", getScreenshotBytes()); } if (savePageHtml) { lifecycle.addAttachment("Page source", "text/html", "html", getPageSourceBytes()); } lifecycle.updateStep(stepResult -> { final StatusDetails details = ResultsUtils.getStatusDetails(event.getError()) .orElse(new StatusDetails()); stepResult.setStatus(ResultsUtils.getStatus(event.getError()).orElse(Status.BROKEN)); stepResult.setStatusDetails(details); }); } lifecycle.stopStep(stepUUID); }); }
protected void fireFixtureStep(final Match match, final Result result, final boolean isBefore) { final String uuid = md5(match.getLocation()); final StepResult stepResult = new StepResult() .setName(match.getLocation()) .setStatus(Status.fromValue(result.getStatus())) .setStart(System.currentTimeMillis() - result.getDuration()) .setStop(System.currentTimeMillis()); if (FAILED.equals(result.getStatus())) { final StatusDetails statusDetails = ResultsUtils.getStatusDetails(result.getError()).get(); stepResult.setStatusDetails(statusDetails); if (isBefore) { final TagParser tagParser = new TagParser(feature, scenario); statusDetails .setMessage("Before is failed: " + result.getError().getLocalizedMessage()) .setFlaky(tagParser.isFlaky()) .setMuted(tagParser.isMuted()) .setKnown(tagParser.isKnown()); lifecycle.updateTestCase(scenario.getId(), scenarioResult -> scenarioResult.setStatus(Status.SKIPPED) .setStatusDetails(statusDetails)); } } lifecycle.startStep(scenario.getId(), uuid, stepResult); lifecycle.stopStep(uuid); } }
@Override public void testFinished(final Description description) { final String uuid = testCases.get(); testCases.remove(); getLifecycle().updateTestCase(uuid, testResult -> { if (Objects.isNull(testResult.getStatus())) { testResult.setStatus(Status.PASSED); } }); getLifecycle().stopTestCase(uuid); getLifecycle().writeTestCase(uuid); }
public static <T> T step(final ThrowableContextRunnable<T, StepContext> runnable) { final String uuid = UUID.randomUUID().toString(); getLifecycle().startStep(uuid, new StepResult().setName("step")); try { final T result = runnable.run(new DefaultStepContext(uuid)); getLifecycle().updateStep(uuid, step -> step.setStatus(Status.PASSED)); return result; } catch (Throwable throwable) { getLifecycle().updateStep(s -> s .setStatus(getStatus(throwable).orElse(Status.BROKEN)) .setStatusDetails(getStatusDetails(throwable).orElse(null))); ExceptionUtils.sneakyThrow(throwable); return null; } finally { getLifecycle().stopStep(uuid); } }
public void startStep(final String uuid, final StepResult result) { final Optional<String> current = threadContext.getCurrent(); if (!current.isPresent()) { LOGGER.error("Could not start step: no test case running"); return; } final String parentUuid = current.get(); startStep(parentUuid, uuid, result); }
@Override public void testIgnored(final Description description) { final String uuid = testCases.get(); testCases.remove(); final TestResult result = createTestResult(uuid, description); result.setStatus(Status.SKIPPED); result.setStatusDetails(getIgnoredMessage(description)); result.setStart(System.currentTimeMillis()); getLifecycle().scheduleTestCase(result); getLifecycle().stopTestCase(uuid); getLifecycle().writeTestCase(uuid); }
public void updateTestCase(final Consumer<TestResult> update) { final Optional<String> root = threadContext.getRoot(); if (!root.isPresent()) { LOGGER.error("Could not update test case: no test case running"); return; } final String uuid = root.get(); updateTestCase(uuid, update); }
public static void stepFinish() { getLifecycle().stopStep(STEP_UUID_STACK.get().removeFirst()); } }
public void updateStep(final Consumer<StepResult> update) { final Optional<String> current = threadContext.getCurrent(); if (!current.isPresent()) { LOGGER.error("Could not update step: no step running"); return; } final String uuid = current.get(); updateStep(uuid, update); }
public void scheduleTestCase(final String containerUuid, final TestResult result) { storage.getContainer(containerUuid).ifPresent(container -> { synchronized (storage) { container.getChildren().add(result.getUuid()); } }); scheduleTestCase(result); }
private void handlePickleStep(final TestStepFinished event) { final StatusDetails statusDetails; if (event.result.getStatus() == Result.Type.UNDEFINED) { statusDetails = getStatusDetails(new PendingException("TODO: implement me")) .orElse(new StatusDetails()); lifecycle.updateTestCase(getTestCaseUuid(currentTestCase), scenarioResult -> scenarioResult .setStatus(translateTestCaseStatus(event.result)) .setStatusDetails(statusDetails)); } else { statusDetails = getStatusDetails(event.result.getError()) .orElse(new StatusDetails()); } final TagParser tagParser = new TagParser(currentFeature, currentTestCase); statusDetails .setFlaky(tagParser.isFlaky()) .setMuted(tagParser.isMuted()) .setKnown(tagParser.isKnown()); lifecycle.updateStep(getStepUuid(event.testStep), stepResult -> stepResult.setStatus(translateTestCaseStatus(event.result))); lifecycle.stopStep(getStepUuid(event.testStep)); } }
protected void fireCanceledStep(final Step unimplementedStep) { final StepResult stepResult = new StepResult(); stepResult.setName(unimplementedStep.getName()) .setStart(System.currentTimeMillis()) .setStop(System.currentTimeMillis()) .setStatus(Status.SKIPPED) .setStatusDetails(new StatusDetails().setMessage("Unimplemented step")); lifecycle.startStep(scenario.getId(), getStepUuid(unimplementedStep), stepResult); lifecycle.stopStep(getStepUuid(unimplementedStep)); final StatusDetails statusDetails = new StatusDetails(); final TagParser tagParser = new TagParser(feature, scenario); statusDetails .setFlaky(tagParser.isFlaky()) .setMuted(tagParser.isMuted()) .setKnown(tagParser.isKnown()); lifecycle.updateTestCase(scenario.getId(), scenarioResult -> scenarioResult.setStatus(Status.SKIPPED) .setStatusDetails(statusDetails .setMessage("Unimplemented steps were found"))); }
private void handleTestCaseFinished(final TestCaseFinished event) { final String uuid = getTestCaseUuid(event.testCase); lifecycle.updateTestCase( uuid, testResult -> testResult.setStatus(translateTestCaseStatus(event.result)) ); final Optional<StatusDetails> details = getStatusDetails(event.result.getError()); details.ifPresent(statusDetails -> lifecycle.updateTestCase( uuid, testResult -> testResult.setStatusDetails(statusDetails) )); lifecycle.stopTestCase(uuid); lifecycle.writeTestCase(uuid); }
public static CompletableFuture<InputStream> addStreamAttachmentAsync( final String name, final String type, final String fileExtension, final Supplier<InputStream> body) { final String source = lifecycle.prepareAttachment(name, type, fileExtension); return supplyAsync(body).whenComplete((result, ex) -> lifecycle.writeAttachment(source, result)); }
#java #automated-tests #appium #android-uiautomator #allure
Вопрос:
Я впервые пишу сценарии тестирования мобильной автоматизации с использованием Appium. Я пытаюсь запустить приложение, установленное на телефоне Android, подключенном к компьютеру. Я написал код на Java в Eclipse. Мой код не запущен, и я вижу следующее сообщение на консоли:
[RemoteTestNG] detected TestNG version 6.9.10
[TestNG] Running:
N:eclipse-workspaceTestProtestng.xml
[main] ERROR io.qameta.allure.AllureLifecycle - Could not stop test container: container with uuid 67e81eee-0a3a-489a-9b83-5f5e3305f573 not found
[main] ERROR io.qameta.allure.AllureLifecycle - Could not write test container: container with uuid 67e81eee-0a3a-489a-9b83-5f5e3305f573 not found
===============================================
Suite
Total tests run: 0, Failures: 0, Skips: 0
===============================================
Вот как я настраиваю желаемые возможности —
@BeforeClass
public void setup()
{
try
{
DesiredCapabilities caps = new DesiredCapabilities();
caps.setCapability("deviceName", "R8KN800EJ0J");
caps.setCapability("platformName", "Android");
caps.setCapability("platformVersion", "10");
caps.setCapability("appPackage", "com.jayway.contacts");
caps.setCapability("appActivity", "com.jayway.contacts.MainActivity");
caps.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, 60);
caps.setCapability("fullReset", false);
caps.setCapability("noReset", true);
URL url = new URL("http://127/0/0/1:4723/wd/hub");
driver = new AppiumDriver<MobileElement>(url, caps);
}
catch(Exception exp)
{
System.out.println("Cause: " exp.getCause());
System.out.println("Message: " exp.getMessage());
exp.printStackTrace();
}
}
Я попытался добавить зависимость allure от моего pom.xml файл и импорт заголовков allure в файл моего класса, но я все равно получил ту же ошибку. Я понятия не имею, что такое очарование и как оно работает, и я не использовал его в своем коде, но все еще получаю ошибку.
Пожалуйста, помогите.
Ответ №1:
Я нашел причины этой ошибки.
- Я использовал зависимость allure в своем списке зависимостей в pom.xml файл
- Я забыл добавить класс, который я намеревался запустить в testng.xml файл
Как только я исправил проблемы, упомянутые выше, код успешно запустился.
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
Size:
a
a
a
2020 December 06
Всем привет! Поискал в чате и не нашел решения для след. проблемы: В аллюр отчете не отображаются шаги из методов @BeforeClass и @AfterClass (реализованы в сьюте). При выполнении этих методов в логах так же пишутся erorors из AllureLifecycle (пример: 6560 [main] ERROR io.qameta.allure.AllureLifecycle — Could not start step: no test case running), похоже что для сьюта не создается uuid (не могу знать верно это или нет). Есть ли какие то решения для данной проблемы (Maven+Junit4)?
Можна aspect-и свои написать на ети анотации и пофиксить
Можна aspect-и свои написать на ети анотации и пофиксить
Тарас привет. Получается Allure EE не поддерживает методы @BeforeClass и @AfterClass, реализованные в сьютах?
та не, я имею вввиду если не тригает ети fixture то может просто нету реализациии на них, нуужно написать свою
та не, я имею вввиду если не тригает ети fixture то может просто нету реализациии на них, нуужно написать свою
да вот перед тем как писать свое хочется убедиться, что не изобретаю велосипед.
Всем привет! Поискал в чате и не нашел решения для след. проблемы: В аллюр отчете не отображаются шаги из методов @BeforeClass и @AfterClass (реализованы в сьюте). При выполнении этих методов в логах так же пишутся erorors из AllureLifecycle (пример: 6560 [main] ERROR io.qameta.allure.AllureLifecycle — Could not start step: no test case running), похоже что для сьюта не создается uuid (не могу знать верно это или нет). Есть ли какие то решения для данной проблемы (Maven+Junit4)?
Ну так ясно же написано, что степ пытается выполниться вне контекста теста. В тестнг это фиксили емнип. В жюнит4 тоже должно работать. Мб у вас версия старая адаптера аллюра
Ну так ясно же написано, что степ пытается выполниться вне контекста теста. В тестнг это фиксили емнип. В жюнит4 тоже должно работать. Мб у вас версия старая адаптера аллюра
версия адаптера 2.13.7
2020 December 07
Можно ли как то в аллюр ее, при формировании отчетов не прикладывать логин и пароль в сценарии теста?
я тупо отключал листнер перед вводом пароля и включал после
Может кто подсказать ссылку на пример листнера для снятия и прикрепления скринов в отчет, после каждого шага
Может кто подсказать ссылку на пример листнера для снятия и прикрепления скринов в отчет, после каждого шага
вы selenide используете?
2020 December 08
Всем привет, как можно добавить лог на каждый тест к отчёту?
#allure_ee
Всем привет подскажите принцип изменения значка в проекте с manual на automated ? И могу ли я изменить этот значок с автоматизированого обратно в ручной?
#allure_ee
Всем привет подскажите принцип изменения значка в проекте с manual на automated ? И могу ли я изменить этот значок с автоматизированого обратно в ручной?
После того как результаты теста приходят из Idea/Jenkins тест меняет статус на automated, при этом manual тест-кейс сохраняется
После того как результаты теста приходят из Idea/Jenkins тест меняет статус на automated, при этом manual тест-кейс сохраняется
Потом есть возможность выбора оставить manual или заменить полностью на automated
alexey
Всем привет, как можно добавить лог на каждый тест к отчёту?
А что вы имеете в виду?
Вот у меня бежит логер на тест, хотел бы добавить этот лог в отчёт аллур, так же как и добавляю фото в конце теста.
alexey
Вот у меня бежит логер на тест, хотел бы добавить этот лог в отчёт аллур, так же как и добавляю фото в конце теста.
текстовый Attachment можно сделать
I’m submitting a …
— [X] bug report
- feature request
- support request => Please do not submit support request here, see note at the top of this template.
What is the current behavior?
Issue description:
- I’m implementing the
IInvokedMethodListener
for TestNG - Inside it I have Overridden the
afterInvocation
method - I use this to create a log for the current test method
Reporter.getOutput(testResult)
- Then I try to attach this log file using this code
Allure.addAttachment(attachmentDescription, "text/plain", attachmentContent, ".txt");
- This works as expected for all
@Test
methods, but it doesn’t work for configuration methods like@BeforeMethod
and@AfterMethod
- This error is shown in the console
[main] ERROR io.qameta.allure.AllureLifecycle - Could not add attachment: no test is running
Debugging Information
Upon debugging this issue I traced it to this method
String io.qameta.allure.AllureLifecycle.prepareAttachment(String name, String type, String fileExtension)
Apparently threadContext.getCurrent();
is returning empty instead of returning the UUID of the current configuration method.
This behavior is shown if I’m running any test, but if I’m debugging it becomes intermittent, and sometimes works as expected!!!
What is the expected behavior?
The attachment should be added successfully, and this error should not happen.
What is the motivation / use case for changing the behavior?
This impacts reporting attachments for any configuration method.
Please tell us about your environment:
| Test framework | testng@7.0.0 |
| Allure integration | allure-testng@2.13.1 |
| AspectJ Weaver | aspectjweaver | 1.9.5 |
| Java run-time environment | JDK | 13 |
| IDE | Eclipse | Build id: 20191212-1212 |
Other information
- I couldn’t downgrade to acpectj 1.8.0 because it’s not working with JDK 13
- Tried using a different listener ‘IConfigurationListener’ but the same issue persisted