前言
由于最近忙于mirage项目,在分析客户的一个问题时,客户提到了使用TestNG来进行一些压力测试,比如连续拍照500次以上,不断的进入设置、滑动、退出200次。 当时咨询了下项目里的测试同僚,发现我司在压力测试方面做得比较少,性能测试方面主要使用的monkey测试。无奈,只有自己学习琢磨了。
本文一来用于记录学过的东西,二来也可以给会用到这个工具的测试或开发同事借鉴。
通过这个工具,开发同事可以验证自己模块是否存在问题。
PS:如果文字有不正确的地方,请务必帮忙纠正。
TestNG介绍
- TestNG是Java中的一个测试框架,类似于JUnit和NUnit,功能都差不多,只是功能更加强大,使用也更方便。
- 可以使用TestNG来进行一些自动化测试,比如压力测试。
- 通过压力测试可以验证系统app,比如相机、设置等在多次重复运行后是否会挂掉,是否会卡顿。
TestNG环境搭建(基于windows)
- 安装jdk(TestNG requires JDK 7 or higher)
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 注意:x64是64位的,如果电脑是32位的,请到官网下载Windows x86 jdk-7u79-windows-i586.exe 配置环境变量 1.找到jdk安装目录,如D:\Program Files\Java\jdk1.7.0_51\bin 2.计算机->右键属性->高级系统设置->环境变量,找到系统变量中的Path变量,将上面的目录添加到变量值中,切记不要误删掉其他值,每个值之间使用;隔开。保存。 3.打开cmd控制台,执行java -version,确定版本安装正确
- 安装eclipse
- 配置sdk
将sdk目录配置到环境变量中,如配置jdk一样
- 安装Appinum
下载地址:https://bitbucket.org/appium/appium.app/downloads/
- 必要的jar包
下载地址:http://pan.baidu.com/s/1jGy588I
- 安装TestNG eclipse插件
1.选择 Help / Install new software 2.输入 http://beust.com/eclipse 后选择TestNG,安装 3.安装成功后,依次选择Wondow->Show View->找到TestNG(JAVA下)->OK
TestNG代码编写
- 创建项目导入必要包
File->New->Java Project,输入项目名称,完成 右键项目名称->Build Path->Configure Build Path 选择Libraries->Add External JARs...,将从服务器上拷贝下来的testng下的包全部导入
- 编写测试类
eg1:编写连续拍照500次 - TestCamera.java
package com.ckt.test;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.remote.MobileCapabilityType;
import java.net.URL;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class TestCamera {
private AppiumDriver mAppiumDriver;
Scanner mScanner;
int num = 500; //执行测试500次
@BeforeTest
public void setUp() throws Exception {
/** 动态输入执行次数,需要动态输入就将注释去掉
System.out.println("Please enter the no of times you want to capture picture :");
mScanner = new Scanner(System.in);
num = mScanner.nextInt();
*/
// Set up desired capabilities and pass the Android app-activity and app-package to Appium
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "Android");
capabilities.setCapability(MobileCapabilityType.VERSION, "4.4.2"); //sdk platform version
capabilities.setCapability(MobileCapabilityType.PLATFORM, "Windows");
capabilities.setCapability("deviceName", "0123456789ABCDEF"); //adb devices,devices name
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("newCommandTimeout", 120);
//test package name ,有源码的话,直接看AndroidManifest.xml
//cmd控制台 输入 uiautomatorviewer,启动相机,点击uiautomatorviewer 上的Device Screenshot
//在uiautomatorviewer右侧Note Detail中会显示当前应用包名
capabilities.setCapability("appPackage", "org.codeaurora.snapcam");
//执行adb shell dumpsys activity|grep -A 5 "Running activities",查找当前运行的activity
//没有grep的windows,执行adb shell dumpsys activity activities > d:\activity.txt,搜索Running activities
capabilities.setCapability("appActivity", "com.android.camera.CameraActivity");
mAppiumDriver = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
mAppiumDriver.manage().timeouts().implicitlyWait(360, TimeUnit.SECONDS);
}
@Test
public void capturing() throws Exception {
for (int i = 0; i < num; i++) {
//点击uiautomatorviewer左侧相机按钮,右侧Note Detail中的resource-id会显示相机拍照按钮element
mAppiumDriver.findElement(By.id("org.codeaurora.snapcam:id/shutter_button")).click();
Thread.sleep(2000);
System.out.println("TestCamera cases " + (i+1) + " successfully executed");
}
}
@AfterTest
public void quit() throws Exception
{
if (mAppiumDriver != null) {
mAppiumDriver.quit();
}
}
}
eg2:编写进入设置,滑动后,退出 - TestSettings.java
package com.ckt.test;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.remote.MobileCapabilityType;
import java.net.URL;
import java.util.Scanner;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
public class TestSettings {
private AppiumDriver mAppiumDriver;
Scanner mScanner;
@BeforeTest
public void setUp() throws Exception
{
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(MobileCapabilityType.BROWSER_NAME, "Android");
capabilities.setCapability(MobileCapabilityType.VERSION, "4.4.2");
capabilities.setCapability(MobileCapabilityType.PLATFORM, "Windows");
capabilities.setCapability("deviceName", "0123456789ABCDEF");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("appPackage", "com.android.settings");
capabilities.setCapability("appActivity", "com.android.settings.Settings");
mAppiumDriver = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
mAppiumDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}
@Test
public void settings() throws Exception {
Thread.sleep(1000);
mAppiumDriver.swipe(661, 1105, 597, 50, 0);
mAppiumDriver.swipe(661, 1105, 597, 50, 0);
mAppiumDriver.swipe(661, 1105, 597, 50, 0);
mAppiumDriver.swipe(661, 1105, 597, 50, 0);
mAppiumDriver.swipe(599, 300, 661, 1105, 0);
mAppiumDriver.swipe(599, 300, 661, 1105, 0);
mAppiumDriver.swipe(599, 300, 661, 1105, 0);
mAppiumDriver.swipe(599, 300, 661, 1105, 0);
System.out.println("TestSettings successfully executed");
}
@AfterTest
public void quit() throws Exception {
if (mAppiumDriver != null) {
mAppiumDriver.quit();
}
}
}
eg3:编写批量执行文件 - ExceteSetting.xml
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="TestSuite">
<test name="TestCamera" >
<classes>
<class name="com.ckt.test.TestCamera"/>
</classes>
</test>
<test name="TestSettings" >
<classes>
<class name="com.ckt.test.TestSettings"/>
</classes>
</test>
</suite>
- Demo下载
下载地址:http://pan.baidu.com/s/1pJFWvLh 下载到导入eclipse,java项目,导入必要的包后即可运行
TestNG执行测试
- 启动Appium Server
运行安装好的Appium,点击右上角三角形按钮启动服务
- 连接手机到PC
- 执行单个测试
选择测试类,如TestCamera,右键Run As->TestNG Test
- 执行批量测试
选择批量配置文件,如ExceteSetting.xml,右键Run As->TestNG TestNG
执行情况会显示在Console中
其他压力测试方法
- 对于压力测试工具很多,在没有接触TestNG之前,我是采用简单的shell script来做的,比如:
将以下内容放入capture.sh中,chmod +x capture.sh,添加可执行权限
#!/bin/bash
for((i=1;i<1000;i++))
do
adb shell input tap 550 1800
echo $i
sleep 2
done
连接设备,执行./capture.sh即可
- 缺陷
以上方法采用adb shell input模拟输入事件实现,(550,1800)是相机拍照按钮在屏幕上的坐标。分辨率不同就需要重新修改
参考文档
http://testng.org/doc/index.html