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

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

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. Поэтому я прихожу к выводу, что в отчете все должно отображаться. Но я не пойму куда в отчете смотреть чтобы увидеть скриншот? Спасибо.

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

по документации 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>

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

1 лайк

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

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

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

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

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

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

2 лайка

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

@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 у нас находится в другом классе.

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

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

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

@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. Или я не правильно подключаю слушатель?

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

1 лайк

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

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

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

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

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