【Jenkins】testng+Allure显示测试报告截图和测试步骤
简介:总结在Jenkins打开的Allure测试报告里怎么添加失败用例截图和测试步骤。Jenkins配置Allure参考我的另一篇博客:https://blog.****.net/galen2016/article/details/88015322
技术栈:
Java
maven
testng
selenium
Jenkins
Allure
pom.xml配置
<properties>
<aspectj.version>1.8.5</aspectj.version>
</properties>
<dependencies>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.7.1</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8.8</version>
</dependency>
<!--allure-testng-->
<dependency>
<groupId>io.qameta.allure</groupId>
<artifactId>allure-testng</artifactId>
<version>2.0-BETA21</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
</dependencies>
<build>
<defaultGoal>compile</defaultGoal>
<sourceDirectory>src</sourceDirectory>
<resources>
<resource>
<directory>src</directory>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<suiteXmlFiles>
<!--此处testng.xml即为要运行的testng.xml文件-->
<suiteXmlFile>${xmlFileName}</suiteXmlFile>
</suiteXmlFiles>
<!--<systemPropertyVariables>
<org.uncommons.reportng.escape-output>false</org.uncommons.reportng.escape-output>
</systemPropertyVariables>-->
<argLine>
-javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
</argLine>
</configuration>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
代码
截图监听器:TestngListener.java
package test.java.cases;
import io.qameta.allure.Attachment;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
public class TestngListener extends TestListenerAdapter {
public void onTestFailure(ITestResult tr) {
super.onTestFailure(tr);
BaseTest bt = (BaseTest) tr.getInstance();
WebDriver driver = bt.getDriver();
takePhoto(driver);
logCaseStep(tr);
exceptedResult(tr);
}
@Attachment(value = "失败截图如下:",type = "image/png")
public byte[] takePhoto(WebDriver driver){
byte[] screenshotAs = ((TakesScreenshot)driver).getScreenshotAs(OutputType.BYTES);
return screenshotAs;
}
/**
* 打印测试步骤
* @param tr
*/
@Attachment(value = "操作步骤如下:")
public String logCaseStep(ITestResult tr){
String step = "1、打开浏览器 2、输入百度地址";
return step;
}
/**
* 打印测试步骤
* @param tr
*/
@Attachment(value = "期望结果如下:")
public String exceptedResult(ITestResult tr){
String result = "显示查询结果";
return result;
}
}
代码解释:
- 使用Allure的@Attachment注解就可以在测试报告里添加附件了,这里添加了截图、测试步骤和期望结果
- 截图代码((TakesScreenshot)driver).getScreenshotAs(OutputType.BYTES)里的driver通过BaseTest类穿过来
BaseTest.java
package test.java.cases;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.*;
import static com.codeborne.selenide.WebDriverRunner.setWebDriver;
/**
* Author: 灵枢
* Date: 2019/3/28
* Time: 17:11
* Description:
*/
@Listeners({TestngListener.class})
public class BaseTest {
public WebDriver driver;
public WebDriver getDriver(){
return driver;
}
@BeforeClass
public void setUp(){
System.setProperty("webdriver.chrome.driver","resource/chromedriver.exe");
driver = new ChromeDriver();
}
@AfterClass
public void tearDown(){
driver.quit();
}
}
代码解释:
- 这是测试用例的基类,具体的测试用例类通过继承BaseTest获取driver
- BaseTest加上@Listeners({TestngListener.class})注解,就可以对所有的测试类进行监听了
SeledieDemoTest.java
package test.java.cases;
import org.openqa.selenium.By;
import org.testng.annotations.Test;
/**
* Author: 灵枢
* Date: 2019/3/26
* Time: 19:25
* Description:
*/
public class SeledieDemoTest extends BaseTest{
@Test(description = "百度搜索")
public void baiduSearchTest(){
String url = "http://www.baidu.com";
System.out.println("url:"+url);
driver.get(url);
driver.findElement(By.id("kw")).sendKeys("galen2016");
driver.findElement(By.id("s11")).click();
}
@Test(description = "搜狗搜索")
public void sougouSearchTest(){
driver.get("https://www.sogou.com");
driver.findElement(By.id("query1")).sendKeys("galen2016");
}
}
代码解释:
- 测试用例类,继承BaseTest.java,直接使用BaseTest的driver
Testng.xml
<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite1-pre">
<test name="Seledie测试1">
<classes>
<class name="test.java.cases.SeledieDemoTest" />
<methods>
<include name="baiduSearchTest" />
<include name="sougouSearchTest" />
</methods>
</classes>
</test>
</suite>
Jenkins构建后的测试报告如下:
失败截图:
测试步骤和期望结果:
注意:这里的测试步骤是为了演示代码写死的,我自动化测试时测试步骤是从excel里读取的
完…