Java + Appium + reportng自动生成测试报告

1.代码结构

代码结构图

2.Maven 依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.test4</groupId>
    <artifactId>test4</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <!--解决冲突-->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>18.0</version>
        </dependency>
        <!--自动化工具-->
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>7.0.0-beta1</version>
        </dependency>
        <!--报告生成工具reportng-->
        <dependency>
            <groupId>org.uncommons</groupId>
            <artifactId>reportng</artifactId>
            <version>1.1.4</version>
            <scope>test</scope>
        </dependency>
        <!--小型依赖注入工具-->
       <dependency>
            <groupId>com.google.inject</groupId>
            <artifactId>guice</artifactId>
            <version>4.1.0</version>
        </dependency>

        <!--appium依赖-->
        <dependency>
            <groupId>io.appium</groupId>
            <artifactId>java-client</artifactId>
            <version>4.1.2</version>
        </dependency>

    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.17</version>
                <!-- 配置testNg.xml 控制测试范围和特性与产出报告 -->
                <configuration>
                    <!-- testNg 执行出错仍然继续执行 -->
                    <!--<testFailureIgnore>true</testFailureIgnore>-->
                    <!-- testNg 相关的 xml 配置文件 -->
                    <suiteXmlFiles>
                        <!-- 指定使用的 testNg.xml 位置 -->
                        <suiteXmlFile>src/main/resources/testng.xml</suiteXmlFile>
                    </suiteXmlFiles>
                    <!-- 添加 reportNg 监听器,来修改 testNg 的报告 -->
                    <properties>
                        <!-- 线程池多线程,在xml中配置 -->
                        <!--<property>
                            <name>suitethreadpoolsize</name>
                            <value>2</value>
                        </property>-->
                        <!-- 是否使用默认监听器,在testNg.xml中配置 -->
                        <property>
                            <name>usedefaultlisteners</name>
                            <value>false</value> <!-- 由于要使用reportNg生成的报告,置为false,此时要在 testNg.xml 配置监听器 -->
                        </property>
                        <!-- listener -->
                        <property>
                            <name>listener</name>
                            <value>org.uncommons.reportng.HTMLReporter, org.uncommons.reportng.JUnitXMLReporter</value>
                        </property>
                    </properties>
                    <!-- 编码设置,否则生成报告乱码 -->
                    <argLine>-Dfile.encoding=UTF-8</argLine>
                    <!--正确加载html,这里主要加载图片-->
                    <systemPropertyVariables>
                        <org.uncommons.reportng.escape-output>false</org.uncommons.reportng.escape-output>
                    </systemPropertyVariables>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

3.testng.xml文件:配置日志生成规则

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="My suite" parallel="tests" thread-count="4">
    <!--listener 不使用默认产生报告的监听器配置,自己写明一个产生报告的监听器-->
    <listeners>
        <listener class-name="org.uncommons.reportng.HTMLReporter" />
        <listener class-name="org.uncommons.reportng.JUnitXMLReporter" />
    </listeners>
    <test verbose="2" name="MyTest">
        <classes>
            <class name="com.test.Test1" />
        </classes>
    </test>
</suite>

4.Utils文件:用于操作截图文件

package com.common;

import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;

public class Utils {
    //复制文件
    public static void copyFile(String file, String dest) {
        try {
            File from = new File(file);
            File to = new File(dest);
            String toDir = to.getParent();
            mkdirs(toDir);
            FileUtils.copyFile(from, to);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static void copyFile(File file, File dest) {
        String dir = dest.getParent();
        mkdirs(dir);
        try {
            FileUtils.copyFile(file, dest);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void mkdirs(String path) {
        File dest = new File(path);
        if (!dest.exists() && !dest.isDirectory()) {
            dest.mkdirs();
        }
    }
}

5.测试类Test1

package com.test;

import com.common.Utils;
import com.google.gson.JsonObject;
import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
//新增的引入:
import java.util.Date;
import org.testng.Reporter;
import org.testng.annotations.Test;

public class Test1 {

    @Test(description = "${caseName}")
    public void test() throws MalformedURLException {
        AndroidDriver driver = null;

        try{
            DesiredCapabilities des = new DesiredCapabilities();
            //手机信息:
            des.setCapability("platformName", "Android");//平台名称
            des.setCapability("platformVersion", "7.1.1");//系统版本
            des.setCapability("udid", "YLZDIB5SYTQSKVIZ");//adb devices获取
            des.setCapability("deviceName", "test");//随便起

            //应用信息:
            des.setCapability("appPackage", "com.android.contacts");//App安装后的包名
            des.setCapability("appActivity", "com.android.contacts.PeopleActivityAlias");//activity启动页

            //其他:
            des.setCapability("unicodeKeyboard", "True");//支持中文输入
            des.setCapability("resetKeyboard", "True");//支持中文输入
            des.setCapability("autoGrantPermissions", "True");
            des.setCapability("noReset", "True");

            driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), des);//手机联通的电脑IP地址、端口在appium上获取
            JsonObject settings = driver.getSettings();
            System.out.println("设备信息值" + settings);
            Reporter.log(new Date() + " 【信息】 环境准备完成<p/>");
            Reporter.log(new Date() + " 【信息】  测试开始<p/>");

            driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//设置超时等待时间
            driver.findElement(By.xpath("//android.view.View[@content-desc=\"拨号\"]")).click();//定位'拨号'
            driver.findElement(By.id("com.android.contacts:id/one")).click();
            driver.findElement(By.id("com.android.contacts:id/seven")).click();
            driver.findElement(By.id("com.android.contacts:id/three")).click();
            driver.findElement(By.id("com.android.contacts:id/show_dialpad_btn")).click();//拨号
            Reporter.log(new Date() + " 【信息】  测试完成");
            screenshots(driver);
        } catch (Exception e) {
            Reporter.log(new Date() + " 【错误】  测试错误,具体详情请");
            screenshots(driver);
        } finally {
            if(null!=driver) {
                driver.quit();
            }
        }
    }

    //截图
    public void screenshots(AndroidDriver driver) {
        File file = driver.getScreenshotAs(OutputType.FILE);
        File screenFile=new File("F:\\screenFile.png");
        Utils.copyFile(file, screenFile);
        String s = "F:\\\\screenFile.png";
        Reporter.log("<a href=\"" + s + "\" target=_blank>点击查看截图</a><p/>", true);
    }
}

6.执行

  1. maven clean
  2. maven test
  3. 执行生成后的文件放在:工程路径\target\surefire-reports\html,可直接点开index.html查看

7.报错解决

 该代码笔者已执行过多次且可使用,如遇到报错问题,从下面几方面查找问题所在:
  1. Appium需要开启,并校验 本地/远程 IP、端口是否匹配。
  2. 仅支持安卓手机。
  3. 查看手机 udid 和 系统版本是否对应。
  4. 查看手机App 应用包 和 启动页 是否存在。
  5. 截图有F盘的路径,电脑是否存在F盘,否则修改路径。

8.信息获取

  • 获取手机序列号udid:adb devices
  • 获取手机启动APP的应用包和启动页:(com.android.contacts、 com.android.contacts.PeopleActivityAlias)
    1.寻找包名 adb shell pm list package -f
    2.根据包名寻找启动页
    • adb shell
    • dumpsys package 包名

* Appium+Java 手机自动化测试功能整理

Appium+Java 手机自动化测试

发布了8 篇原创文章 · 获赞 0 · 访问量 216

猜你喜欢

转载自blog.csdn.net/Dawn____Dawn/article/details/103277885