使用TestNG進行模塊自動化壓力測試

前言

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章