测试报告-ExtentReports报告

2022-07-25 13:58:53 浏览数 (1)

ExtentReports报告

ExtentReports报告官方网址:http://extentreports.com/

1、创建项目

创建My_Report_ExtentReports_Demo项目。

(1)base包用于存放基础准备(BaseParpareApp类、BaseParpareWeb类),即启动与退出。

(2)extentReports包用于存放报告配置(生成ExtentReports测试报告、用例报错自动截图、用例失败重跑等)。

ExtentTestNGIReporterListener类:监听类,用于生成ExtentReports测试报告,并可以设置报告生成路径与文件名。

ReportUtil类:报告工具类,设置报告名。

RetryListener类:用于用例失败重跑。

StringUtil类:字符串工具类。

TestngListener类:用于报错截图。

TestngRetry类:设置报错重试执行次数。

(3)testcases包用于存放测试用例(AppCaseDemo类、WebCaseDemo类)。

(4)app文件夹存放测试应用(testApp.apk)。

(5)driver文件夹存放浏览器驱动(Chrome浏览器驱动)。

(6)lib文件夹存放项目依赖的jar包。

ExtentReports jar包:extentreports-3.1.5.jar

TestNG jar包:testng-6.14.2.jar

Selenium jar包:selenium-server-standalone-3.12.0.jar

Appium jar包:java-client-6.1.0.jar

解决TestNG 执行后无法生成报告问题:bson-3.8.0.jar、freemarker-2.3.28.jar

(7)result文件夹存放ExtentReports报告(ExtentReports.html)与错误截图(snapshot文件夹里)。

(8)testng.xml文件里添加监听:

代码语言:javascript复制
<listeners>
    <listener class-name="com.demo.extentReports.TestngListener" />
    <listener class-name="com.demo.extentReports.RetryListener" />
    <listener class-name="com.demo.extentReports.ExtentTestNGIReporterListener" />    
</listeners>

2、BaseParpareApp类

BaseParpareApp类(存放用例执行前与执行后的操作,针对App)

脚本代码:

代码语言:javascript复制
package com.demo.base;

import java.io.File;
import java.net.URL;

import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;

import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;

public class BaseParpareApp {

       public AndroidDriverdriver;

    public AndroidDrivergetDriver() {
        return driver;
    }
   
       @BeforeClass
       public void setUp() throws Exception {

              File classpathRoot = new File(System.getProperty("user.dir"));
              File appDir = new File(classpathRoot, "app");
              File app = new File(appDir, "testApp.apk");

              DesiredCapabilities capabilities = new DesiredCapabilities();

              // 使用哪个自动化测试引擎
              // 默认为Appium,或Selendroid或UiAutomator2或Espresso用于Android;或XCUITest用于IOS
              capabilities.setCapability("automationName", "Appium");

              // 使用哪个移动操作系统平台
              // iOS, Android, FirefoxOS
              capabilities.setCapability("platformName", "Android");

              // 移动操作系统版本
              capabilities.setCapability("platformVersion", "6.0");

              // 使用的移动设备或模拟器的类型
              // iPhone Simulator, iPad Simulator, iPhone Retina 4-inch, Android
              // Emulator, Galaxy S4 等等
              // 在IOS上,这个关键字的值必须是使用`instruments -s devices`得到的可使用的设备名称之一
              // 在Android上,这个关键字目前不起作用
              capabilities.setCapability("deviceName", "honor");

              // 连接的物理设备的唯一设备标识
              capabilities.setCapability("udid", "MYV0215825000026");

              // `.ipa`或`.apk`文件所在的本地绝对路径或者远程路径,也可以是一个包括两者之一的`.zip`
              // Appium会先尝试安装路径对应的应用在适当的真机或模拟器上
              // 针对Android,如果你指定`app-package`和`app-activity`的话,那么就可以不指定`app`
              // 例如/abs/path/to/my.apk or http://myapp.com/app.ipa
              capabilities.setCapability("app", app.getAbsolutePath());

              // 要运行Android应用的包名
              capabilities.setCapability("appPackage", "com.example.testapp");

              // 要从包中启动的Android activity的活动名称
              capabilities.setCapability("appActivity", "com.example.testapp.MainActivity");

              // 启用Unicode输入法,设置为true可以输入中文字符,默认为false
              capabilities.setCapability("unicodeKeyboard", true);

              // 在设定了`unicodeKeyboard`关键字运行Unicode测试结束后,将键盘重置为其原始状态
              // 如果单独使用,将会被忽略,默认值`false`
              capabilities.setCapability("resetKeyboard", true);

              // 设置为true,每次启动时覆盖session,否则第二次运行会报错不能新建session
              capabilities.setCapability("sessionOverride", true);

              // 在此会话之前不要重置应用程序状态
              // Android 不要停止应用程序,不要清除应用程序数据,也不要卸载apk
              // IOS 测试后不要销毁或关闭SIM卡。开始测试运行在任何模拟运行,或设备插入
              capabilities.setCapability("noReset", true);

              // 执行完整的重置
              // Android 停止应用程序,清除应用程序数据并在测试后卸载apk
              // IOS 在真机设备测试后卸载应用程序,在模拟器测试后摧毁模拟器
              capabilities.setCapability("fullReset", false);

              // 设置命令超时时间,单位:秒
              // 达到超时时间仍未接收到新的命令时Appium会假设客户端退出然后自动结束会话
              capabilities.setCapability("newCommandTimeout", 60);
             
              driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
              Thread.sleep(2000);
       }

       @AfterClass
       public void tearDown() {
              driver.quit();
       }
      
}

3、BaseParpareWeb类

BaseParpareWeb类(存放用例执行前与执行后的操作,针对Web)

脚本代码:

代码语言:javascript复制
package com.demo.base;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;

public class BaseParpareWeb {

       public WebDriver driver;

       public WebDriver getDriver() {
              return driver;
       }

       @BeforeClass
       public void setUp() {
              System.setProperty("webdriver.chrome.driver", "D:\workspace2\My_Report_ExtentReports_Demo\driver\chromedriver.exe");
              ChromeOptions option = new ChromeOptions();
              option.addArguments("disable-infobars");
              driver = new ChromeDriver(option);
              driver.manage().window().maximize();
              driver.navigate().to("http://www.baidu.com");
       }

       @AfterClass
       public void tearDown() {
              driver.close();
              driver.quit();
       }

}

4、AppCaseDemo类

AppCaseDemo类(继承BaseParpareApp类,存放用例)

ExtentReports报告中打印log方法:Reporter.log("");

脚本代码:

代码语言:javascript复制
package com.demo.testcases;

import org.openqa.selenium.By;
import org.testng.Reporter;
import org.testng.annotations.Test;

import com.demo.base.BaseParpareApp;

public class AppCaseDemo extends BaseParpareApp {

       @Test
       public void appTestCase1() {
              // ExtentReports报告中输出log
        Reporter.log("执行appTestCase1");
              driver.findElement(By.id("com.example.testapp:id/urlField1")).sendKeys("https://www.baidu.com/");
       }

       @Test
       public void appTestCase2() {
              // ExtentReports报告中输出log
        Reporter.log("执行appTestCase2");
              driver.findElement(By.id("com.example.testapp:id/goButton")).click();
       }

}

5、WebCaseDemo类

WebCaseDemo类(继承BaseParpareWeb类,存放用例)

ExtentReports报告中打印log方法:Reporter.log("");

脚本代码:

代码语言:javascript复制
package com.demo.testcases;

import org.openqa.selenium.By;
import org.testng.Reporter;
import org.testng.annotations.Test;

import com.demo.base.BaseParpareWeb;

public class WebCaseDemo extends BaseParpareWeb {

       @Test
       public void webTestCase1() {
              // ExtentReports报告中输出log
        Reporter.log("执行webTestCase1");
              driver.findElement(By.id("kw")).sendKeys("selenium");
       }

       @Test
       public void webTestCase2() {
              // ExtentReports报告中输出log
        Reporter.log("执行webTestCase2");
              driver.findElement(By.id("su1")).click();
       }

       @Test
       public void webTestCase3() {
              // ExtentReports报告中输出log
        Reporter.log("执行webTestCase3");
              System.out.println(driver.getTitle());
       }

}

6、testng.xml

testng.xml,文件内容:

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="tests" thread-count="1">
 
       <test name="Test" enabled="true">
              <classes>
                     <class name="com.demo.testcases.WebCaseDemo" />
                     <class name="com.demo.testcases.AppCaseDemo" />
              </classes>
       </test>
 
       <listeners>
              <listener class-name="com.demo.extentReports.TestngListener" />
              <listener class-name="com.demo.extentReports.RetryListener" />
              <listener class-name="com.demo.extentReports.ExtentTestNGIReporterListener" />    
       </listeners>
      
</suite>

7、执行查看报告

(1)开启Appium服务,执行脚本(testng.xml鼠标右键Run As--->TestNG Suite)。

(2)执行结果:

控制台打印结果信息:用例报错进行截图。

打开ExtentReports报告(ExtentReports.html)。

如图所示:报错已经截图。

打开snapshot文件夹可以看到错误截图(命名规则:日期-包-类-方法)。

(3)设置用例失败重跑:

修改extentReports包里的TestngRetry类,将maxRetryCount修改重试次数(例如:修改为1,即1次)。

之后再次执行脚本

控制台打印结果信息:报错1次(记为跳过)则再次执行1次。

打开ExtentReports报告(ExtentReports.html)。

0 人点赞