手機自動化測試 Appium 的架構

手機自動化測試 Appium 的架構

這篇文章主要說明為什麼 appium 是筆者認為未來手機自動化測試的主流?

appium的架構為何? Appium目前有哪些限制?

最後附上一個 Appium 自動化測試實作的範例。

iOS/Android 通吃的自動化測試程式

為什麼筆者認為 appium是未來手機自動化測試的主流呢? 因為他”通吃”的特性

  • 1. 支援大部分的程式語言 Python, Java, C# Ruby..不受限於手機平台,可選用自己熟悉的程式語言開發自動化測試
  • 2. 寫好的測試程式可以支援 iOS 也可以支援 android,測試程式不需要特別的修改。(當然需要改一行指定要啟動 iOS or Android)

Appium Archiecture

Appium iOS架構

Appium 是如何與 iOS 溝通呢? 如下圖所示。

Appium 啟動之後就像是一個 Web proxy,程式語言 WebDeriver Script 透過 http JSON的方式跟手機溝通。

Appium

Instruments command client (written in node.js)

Appium Android 架構

與 iOS 架構相同,Appium 啟動之後就像是一個 Web proxy,程式語言 WebDeriver Script 透過 http JSON的方式跟手機溝通。

特別不同的地方在於

 

1. UIAutomator framework為 android 內建原生的架構

2. Bootstrap.jar (TCP server)。Android 中這個檔案為 JAR 而 iOS 為 JS

3. Android versions < 17, Selendroid framework : 如果要測試 Android 比較舊的版本,就必須額外安裝設定 Selendroid。

4. Android versions >= 17, UI Automator (預設)

 

Appium

 

Appium session

當 appium server 啟動時,每一個自動化測試就會建立一個連線至 appium

同樣的,appium server 也會建立一個連線至iOS or Android 手機

Android 計算機自動化測試程式

這個自動化測是會執行下列動作

1. 啟動計算機

2. 按下 2+4 =

3. 驗證結果是否為 6

[pastacode lang=”java” message=”” highlight=”” provider=”manual”]

package src_Appium;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
//import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.*;


public class Calculator {
WebDriver driver;

@BeforeClass
public void setUp() throws MalformedURLException{
	//Set up desired capabilities and pass the Android app-activity and app-package to Appium
	DesiredCapabilities capabilities = new DesiredCapabilities();
	capabilities.setCapability("BROWSER_NAME", "Android");
	capabilities.setCapability("VERSION", "4.4.2"); 
	capabilities.setCapability("deviceName","Emulator");
	capabilities.setCapability("platformName","Android");
 
   
   capabilities.setCapability("appPackage", "com.android.calculator2");
// This package name of your app (you can get it from apk info app)
	capabilities.setCapability("appActivity","com.android.calculator2.Calculator"); // This is Launcher activity of your app (you can get it from apk info app)
//Create RemoteWebDriver instance and connect to the Appium server
 //It will launch the Calculator App in Android Device using the configurations specified in Desired Capabilities
   driver = new RemoteWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
}

@Test
public void testCal() throws Exception {
   //locate the Text on the calculator by using By.name()
   WebElement two=driver.findElement(By.name("2"));
   two.click();
   WebElement plus=driver.findElement(By.name("+"));
   plus.click();
   WebElement four=driver.findElement(By.name("4"));
   four.click();
   WebElement equalTo=driver.findElement(By.name("="));
   equalTo.click();
   //locate the edit box of the calculator by using By.tagName()
   WebElement results=driver.findElement(By.tagName("EditText"));
	//Check the calculated value on the edit box
assert results.getText().equals("6"):"Actual value is : "+results.getText()+" did not match with expected value: 6";

}

@AfterClass
public void teardown(){
	//close the app
	driver.quit();
}
}

[/pastacode]

Appium 目前缺點

  1. 一台Mac 一個 iOS  app 執行。也就是說如果要同時測試兩個 iOS app就需要兩台 Mac 機器。

其它之後陸續分享,相信隨著版本的更新缺點會越來越少的.

 

Leave a Reply

Your email address will not be published. Required fields are marked *