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>
两个关键配置:
-
parallel=”{methods/classes/tests}”
指定methods/classes/tests标签在同一线程中
-
thread-count=”{你想要并发执行的线程数量}”
执行TestNG.xml文件,可以看到两个测试类会在同一时间并行执行测试。
TestNG结合Appium并发执行测试
Step1:开启多个Appium Server,指定不同的监听端口
Step2:adb连接上多台设备
这里以夜神的多开功能演示,默认第一台夜神模拟器端口62001,第二台端口62025,第三台62026...
多台真机只需打开USB调试模式,勾选弹框即可
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>
运行效果:
欢迎来到testingpai.com!
注册 关于