使用TestNG进行模块自动化压力测试

时间:2022-12-05 05:07:45

前言

由于最近忙于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