Appium 结合 TestNG 并行执行测试

本贴最后更新于 1331 天前,其中的信息可能已经沧海桑田

Appium测试框架可以让我们使用不同的编程语言(Java、Python、Ruby、JavaScript)测试不同移动端平台的应用(Android、IOS),目前也是最火的移动端测试框架。这篇文章会带着大家学习到如何在不同设备中并行执行测试。

并行执行测试能够带来的好处:

Appium本身并没有提供并行执行这样的功能,我们可以借助Java中最流行的TestNG单元测试框架所提供的功能实现。

TestNG简介

TestNG(Next Generation)下一代单元测试框架技术,在这之前Junit在Java世界中是主流的选择,由于TestNG的强大和易用性,现在已逐步取代Junit成为最流行的单元测试框架技术。

TestNG优点

TestNG与Junit是比较类似的,但是与其相比提供了更为强大的特性并且更加易用,包括不仅限于

TestNG并行测试配置

TestNG可以支持通过xml配置并发测试

<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" parallel="tests" thread-count="2">
    <test name="test01">
        <classes>
            <class name="com.lemon.TestDemo"/>
        </classes>
    </test>
    <test name="test02">
        <classes>
            <class name="com.lemon.TestDemo"/>
        </classes>
    </test>
</suite>

两个关键配置:

执行TestNG.xml文件,可以看到两个测试类会在同一时间并行执行测试。

TestNG结合Appium并发执行测试

Step1:开启多个Appium Server,指定不同的监听端口

image.png

Step2:adb连接上多台设备

这里以夜神的多开功能演示,默认第一台夜神模拟器端口62001,第二台端口62025,第三台62026...

多台真机只需打开USB调试模式,勾选弹框即可

image.png

Step3:编写测试脚本

public class AppiumParallelTest {

    public AndroidDriver driver;

    @Parameters({"udid", "appium_port", "uiautomator2_port"})
    @BeforeTest
    public void setUp(String udid, String appiumPort, String uiautomator2Port) throws Exception {
        DesiredCapabilities capabilities = new DesiredCapabilities();
        // Appium通过udid参数作为唯一标识找到测试的设备
        capabilities.setCapability("udid", udid);
        capabilities.setCapability("deviceName", udid);
        capabilities.setCapability("platformName", "Android");
        capabilities.setCapability("appPackage", "com.lemon.lemonban");
        capabilities.setCapability("appActivity", "com.lemon.lemonban.activity.WelcomeActivity");
        // 较新版本Appium Server默认使用的自动化引擎是UIAutomator2,每个线程对应的UIAutomator2端口都需要不同
        capabilities.setCapability("systemPort", uiautomator2Port);
        driver = new AndroidDriver(new URL("http://127.0.0.1:" + appiumPort + "/wd/hub"), capabilities);
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }

    @Test
    public void testLogin() {
        driver.findElement(MobileBy.id("com.lemon.lemonban:id/navigation_tiku")).click();
        driver.findElement(MobileBy.id("com.lemon.lemonban:id/button_go_login")).click();
        driver.findElement(MobileBy.id("com.lemon.lemonban:id/et_mobile")).sendKeys("13323234545");
        driver.findElement(MobileBy.id("com.lemon.lemonban:id/et_password")).sendKeys("123456");
        driver.findElement(MobileBy.id("com.lemon.lemonban:id/btn_login")).click();
    }

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

}



Step4:TestNG.xml文件配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">

<suite name="Suite" parallel="tests" thread-count="2">
    <!--第一台设备的配置-->
    <test name="device1" >
        <parameter name="udid" value="127.0.0.1:62001"/>
        <parameter name="appium_port" value="4723"/>
        <parameter name="uiautomator2_port" value="8200"/>
        <classes>
            <class name="cases.AppiumParallelTest"/>
        </classes>
    </test>
    <!--第二台设备的配置-->
    <test name="device2" >
        <parameter name="udid" value="127.0.0.1:62025"/>
        <parameter name="appium_port" value="4725"/>
        <parameter name="uiautomator2_port" value="8202"/>
        <classes>
            <class name="cases.AppiumParallelTest"/>
        </classes>
    </test>
</suite>

运行效果:

555.gif

回帖
请输入回帖内容 ...