【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构建后的测试报告如下:

失败截图:
【Jenkins】testng+Allure显示测试报告截图和测试步骤
测试步骤和期望结果:
【Jenkins】testng+Allure显示测试报告截图和测试步骤
注意:这里的测试步骤是为了演示代码写死的,我自动化测试时测试步骤是从excel里读取的

完…