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

Где в отчете Allure должен появиться скриншот?

screenshot
Теги: #<Tag:0x00007f7b60c7c198>

(Alex) #1

Метод с добавлением скрина выглядит так:

public class ElementScreenshot extends TestListenerAdapter{
	
	@Override
	public void onTestFailure(ITestResult tr){		
		Object currentClass = tr.getInstance();
		WebDriver driver = ((ConfigBase) currentClass).getDriver();
		File srcFile =  ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
		saveScreenshot(srcFile);
	}	
	@Attach(type=AttachmentType.PNG)
	private File saveScreenshot(File screenshot){
		return screenshot;
	}
}

В результате выполнения в папке allure-results появляются 2 файла:

ac764d4d-c155-4515-b4ec-adbbb5329420-testsuite.xml
8e417ab1d4c7b80ade443277d61e26cba6fe14ba7b20911153b889840b0249ed-attachment.png

Далее с помощью allure-cli генерирую отчет, создается папка allure-reports..png лежит в папке data. Поэтому я прихожу к выводу, что в отчете все должно отображаться. Но я не пойму куда в отчете смотреть чтобы увидеть скриншот? Спасибо.


(Alexey Lakovych) #2

Как вы подключаете Listener ?
Нужно добавить его в тестовый класс.
@Listeners({ElementScreenshot.class})” над именем класса


(Alex) #3

по документации TestNG поместил строчку listeners в testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >  
<suite name="Suite1" verbose="1" >
<listeners>
    <listener class-name="com.sl.utils.ElementScreenshot" />
  </listeners>
  <test name="KaraokeSmokeTest" >
    <classes>
       <class name="com.sl.test.TestKaraoke" />      
    </classes>  
  </test>
</suite>

(Alexey Lakovych) #4

Alllure не кушает подключение listenera так.
Нужно в класе проставить его, как написал выше


(Alex) #5

То есть на каждый тестовый класс придется его вот таким образом вручную подключать?


(Alexey Lakovych) #6

да, не исключаю конечно что есть другой способ, но так работает.


(Alex) #7

Действительно работает, только не пойму, функционал же одинаковый. Только в testng.xml слушатель распространяется на все классы, а через аннотацию @Listeners только на определенный класс, верно?


(Alexey Lakovych) #8

да, можно под конкретный класс ставить свой listener, иногда бывает полезно)


(Alex) #9

тогда получается если listener в testng.xml не работает так с allure, то это должно быть где-то в документации? Или это баг?


(Sergey Korol) #10

Слушателя можно подключить через pom, ибо он юзает maven-surefire-plugin.


(Alex) #11

Тогда такой вопрос: Имеем следующий код:

@Listeners({ElementScreenshot.class})
public class TestKaraoke extends ConfigBase{		
	@Test
	public void createKaraokeWithFillForm() throws Exception{		
		User user = new User().setLogin("admin").setPassword("admin");	
}
}

***

public class User {	
	private String login;	
	public User setLogin(String login) {
		this.login = login;
		assertTrue(0==1); 
		return this;
	}

Слушатель все равно срабатывает, хотя мы указали его в тестовом классе. Поэтому появляются 2 вопроса. Как работает слушатель через аннотацию?

  1. Через аннотацию слушатель подключается как только мы обращаемся к классу где он указан и следит до конца выполнения программы?
  2. Или слушатель следит за 1 классом где мы его указали и при выполнении условий именно в этом классе, он срабатывает? Но почему тогда он сработал если assert у нас находится в другом классе.

Я со слушателями только недавно начал знакомиться, поэтому буду благодарен за ответ.


(Alexey Lakovych) #12

Слушатель слушает тест в данном случае и срабатывает “onTestFailure”.
Так как у вас вызов класса User в методе над которым стоит аннотация “Test” то он естественно будет срабатывать.


(Alex) #13

Значит верно я предположил, что слушатель начинает следить за классом как только мы к нему обращаемся. Я благодарен за ответы.

@ArtOfLife Только еще один момент, указывая в pom.xml, следующие строки:

 <groupId>org.apache.maven.plugins</groupId>
  		<artifactId>maven-surefire-plugin</artifactId>
  		<version>2.18</version>  		 		
  		<configuration>
  		<suiteXmlFiles>
						<suiteXmlFile>src/main/resources/testng.xml</suiteXmlFile>
		</suiteXmlFiles> 
  		<testFailureIgnore>false</testFailureIgnore>
        <argLine>
        	-Dfile.encoding=UTF-8
			-javaagent:${settings.localRepository}\org\aspectj\aspectjweaver\${aspectj.version}\aspectjweaver-${aspectj.version}.jar
		</argLine> 
		<properties>
			<property>			
				<name>listener</name>
				<value>ru.yandex.qatools.allure.testng.AllureTestListener</value> <!--слушатель-->
			</property>
		</properties>
        </configuration>
          <dependencies>  		
        <dependency>
  	  		<groupId>org.aspectj</groupId>
  	  		<artifactId>aspectjweaver</artifactId>
  	  		<version>${aspectj.version}</version>
  	  	</dependency>
    </dependencies>

allure-result создает 2 одинаковых xml файла. Ответ есть в другой теме, но там говорится, что слушатели подключаются с 1.4. только через сервисы и надо убрать их из pom. Или я не правильно подключаю слушатель?


(Sergey Korol) #14

Тонкостей подключения слушателей через Allure я не знаю. Я лишь высказал общую идею, что maven-surefire-plugin позволит вам это сделать, наряду с testng.xml / аннотацией в классе.


(Alex) #15

Хорошо, еще раз спасибо.


(Sergey Korol) #16

Не забывайте ставить лайки, если какие-то сообщения вам оказались полезными. :wink:


(sidelnikovmike) #17

А я что-то не заметил, как из самого вопроса обсуждение перетекло в листенеры :smile:
Если брать вопрос из темы - отчет будет прилинкован как аттач к тесту или шагу, внутри которого вы вызвали метод.
В вашем случае, метод onTestFailure является всё еще продолжением теста, так что Вы должны увидеть аттач к тест кейсу.
И лучше перейдите на новый аллюр, там аннотация поменялась на @Attachment.
Будет примерно так:

@Attachment(value = "Снимок ''{0}''", type = "image/png")

И лучше, чтоб метод возвращал массив байтов(это советуют сами разработчики аллюра)