UI Automator
UI Automator提供了一組API來構(gòu)建基于交互UI的測試。API允許你執(zhí)行操作,如打開設(shè)置菜單,非常適合黑盒自動化測試,在測試代碼不依賴于應(yīng)用的內(nèi)部實(shí)現(xiàn)
uiautomatorviewer提供了一個方便的圖形用戶界面進(jìn)行掃描和分析在Android設(shè)備上當(dāng)前顯示的UI組件。您可以使用此工具來檢查的布局層次和查看UI組件。
UiDevice類可以訪問設(shè)備并進(jìn)行操作。你可以調(diào)用它的方法來訪問設(shè)備屬性,如當(dāng)前的方向或顯示尺寸。該UiDevice類也讓您執(zhí)行操作,例如:旋轉(zhuǎn)設(shè)備;按下D-pad按鈕;按Back、Home、Menu等;打開通知樹欄;當(dāng)前窗口截圖等。
應(yīng)用相關(guān)的API: UiCollection枚舉容器的UI元素以計數(shù),或通過文字(或?qū)傩缘?針定位子元素; UIObject表示是在設(shè)備上可見的UI元素; UiScrollable?:為可滾動UI容器提供查找支持; UiSelector?:查詢一個或者多個UI元素; Configurator: 設(shè)置參數(shù)。
示例:更改語言
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from uiautomator import device as d
d.screen.on()
d.press.home()
d(text=u"設(shè)置").click()
d(text=u"其他高級設(shè)置").click()
d(text=u"語言和輸入法").click()
d(text=u"中文 (簡體)").click()
d(text=u"English").click()
https://github.com/xiaocong/uiautomator
Appium
Appium是一個移動端的自動化框架,可用于測試原生應(yīng)用,移動網(wǎng)頁應(yīng)用和混合型應(yīng)用,且是跨平臺的。可用于IOS和Android以及firefox的操作系統(tǒng)。原生應(yīng)用是指用android或ios的sdk編寫的應(yīng)用,移動網(wǎng)頁應(yīng)用是指網(wǎng)頁應(yīng)用,類似于ios中safari應(yīng)用或者Chrome應(yīng)用或者類瀏覽器的應(yīng)用。混合應(yīng)用是指一種包裹webview的應(yīng)用,原生應(yīng)用網(wǎng)頁內(nèi)容交互性的應(yīng)用。跨平臺,是當(dāng)今比較流行的開源測試工具。
配置比uiautomator復(fù)雜,需要指定被測應(yīng)用。
示例:python代碼操作計算器
#-*-coding: utf-8 -*-
#coding=utf-8
from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4.4'
desired_caps['deviceName'] = 'baf59937'
desired_caps["unicodeKeyboard"]="True"
desired_caps["resetKeyboard"]="True"
desired_caps['appPackage'] = 'com.miui.calculator'
desired_caps['appActivity'] = '.cal.CalculatorActivity'
driver = webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)
driver.find_element_by_name("1").click()
driver.find_element_by_name("5").click()
driver.find_element_by_id("btn_plus").click()
driver.find_element_by_name("6").click()
driver.find_element_by_id("btn_equal").click()
driver.quit()
Eggplant
使用VNC server之類的網(wǎng)關(guān)。 支持iOS, Android,Windows Phone, BlackBerry,是基于圖像識別的測試工具。腳本:SenseTalk。不受坐標(biāo)限制。
腳本跨OS、不會修改應(yīng)用,能完全控制設(shè)備。
商業(yè)軟件 http://www.testplant.com/eggplant/testing-tools/
adb
adb用于獲取Android日志,android設(shè)備的日志存儲在設(shè)備的循環(huán)內(nèi)存緩沖區(qū)中。adb在android SDK的platform-tools目錄。首先在系統(tǒng)設(shè)置 - >開發(fā)人員設(shè)置中打開USB調(diào)試。
然后使用USB連接線將手機(jī)連接到計算機(jī)。運(yùn)行adb devices獲取連接的設(shè)備列表。
如果要將整個日志保存到文件而不進(jìn)行過濾,請使用命令“adb logcat> logs.txt“。
運(yùn)行命令“adb logcat | findstr Exception“僅顯示例外情況。Linux使用“adb logcat | grep Exception“。
或者,您可以從Google Play安裝logcat查看器(如Catlog)查看logcat條目。
CPU Monitor Advanced Lite
來自Google Play,用于監(jiān)控CPU,可以保存歷史記錄,并以圖形直觀展示,但是大陸的應(yīng)用市場貌似搜索不到。
通常使用替代:CPU Monitor(豌豆莢)、CPU-Z等。
TestObject
TestObject是擁有成百上千真實(shí)設(shè)備的測試平臺,可以直接通過瀏覽器訪問。上載APP然后可以查看執(zhí)行情況,支持Robotium, Espresso和Appium。
通常用于安卓機(jī)型的測試。
商業(yè)軟件:https://testobject.com/
有幾個類似的提供云測試服務(wù)的公司:
云測匯:https://www.yuncehui.cn/ 專注于性能測試
Testin: 即云測,http://testin.cn/ 支持Robotium、淘寶Athrun框架
易測云:支持Robotium、Athrun、Guerrilla等開源測試框架,并使用基于控件識別的、東軟自主研發(fā)的測試工具Radar。http://www.yiceyun.com/
以上幾家沒有TestObject強(qiáng)大,但是有中國特色的選擇之一。
Scan
IOS命令行工具:
ZAPTEST
用于測試跨平臺應(yīng)用程序的軟件測試自動化解決方案。ZAPTEST允許在任何現(xiàn)代操作系統(tǒng),移動設(shè)備或移動設(shè)備上測試任何基于GUI的軟件。包括iOS,Android,WinMo,Blackberry,Windows,Mac和Linux,并支持Agile和CI(DevOps)開發(fā)的測試。 社區(qū)版本是免費(fèi)的,允許您測試網(wǎng)絡(luò),新的Windows應(yīng)用程序或移動應(yīng)用程序。
Traceview
很好的性能分析的工具。它可以通過圖形化的方式讓我們了解我們要跟蹤的程序的性能,并且能具體到method。
記錄過程中每個API的耗時及調(diào)用次數(shù),出現(xiàn)卡頓時,可通過top排序等手段分析是哪些API引起的。
https://developer.android.com/studio/profile/traceview
Memory Profiler
Android Profiler 中的一個組件,可幫助您識別導(dǎo)致應(yīng)用卡頓、凍結(jié)甚至崩潰的內(nèi)存泄漏和流失。 它顯示一個應(yīng)用內(nèi)存使用量的實(shí)時圖表,讓您可以捕獲堆轉(zhuǎn)儲、強(qiáng)制執(zhí)行垃圾回收以及跟蹤內(nèi)存分配。
要打開 Memory Profiler,請按以下步驟操作:
點(diǎn)擊 View > Tool Windows > Android Profiler(也可以點(diǎn)擊工具欄中的 Android Profiler )。
從 Android Profiler 工具欄中選擇您想要分析的設(shè)備和應(yīng)用進(jìn)程。 如果您通過 USB 連接了某個設(shè)備但該設(shè)備未在設(shè)備列表中列出,請確保您已啟用 USB 調(diào)試。
點(diǎn)擊 **MEMORY **時間線中的任意位置可打開 Memory Profiler。
或者,您可以在命令行中使用 dumpsys 檢查您的應(yīng)用內(nèi)存,同時查看 logcat 中的 GC Event。
https://developer.android.com/studio/profile/memory-profiler
Systrace
Systrace的功能包括跟蹤系統(tǒng)的I/O操作、內(nèi)核工作隊(duì)列、CPU負(fù)載以及Android各個子系統(tǒng)的運(yùn)行狀況等。
它能展示API的執(zhí)行時序、耗時及各線程狀態(tài),出現(xiàn)卡頓時可分析API調(diào)用邏輯是否合理及是否出現(xiàn)主線程阻塞。
https://github.com/catapult-project/catapult/tree/master/systrace
AndroidJUnitRunner
AndroidJUnitRunner類是JUnit測試運(yùn)行器,可以讓你在Android設(shè)備上執(zhí)行JUnit3或JUnit4中風(fēng)格的測試類,兼容Espresso和UI Automator測試框架。測試運(yùn)行器加載測試包和應(yīng)用,運(yùn)行測試并報告測試結(jié)果。該類取代 InstrumentationTestRunner類(僅支持JUnit 3)。
這個運(yùn)行器的主要特點(diǎn):
JUnit支持
獲得Instrumentation信息
測試篩選
測試分片
要求的Android2.2(API 8)或更高。
AndroidJunitRunner通過InstrumentationRegistry提供了訪問instrumentation的API。
InstrumentationRegistry.getInstrumentation()返回當(dāng)前正在運(yùn)行的Instrumentation
InstrumentationRegistry.getContext()返回此Instrumentation軟件包的上下文。
InstrumentationRegistry.getTargetContext()返回目標(biāo)應(yīng)用的應(yīng)用上下文。
InstrumentationRegistry.getArguments()返回傳遞給此Instrumentation的參數(shù)Bundle。當(dāng)你要訪問命令行參數(shù)時非常有用。
測試運(yùn)行器兼容JUnit3和JUnit4的(最高JUnit4.10)測試。在同一個包混淆JUnit 3和和JUnit4測試代碼可能會導(dǎo)致不可預(yù)測的結(jié)果。instrumented JUnit 4測試類在設(shè)備或仿真器上運(yùn)行,必須在前面加上@RunWith(AndroidJUnit4.class)
注釋。
比如測試CalculatorActivity類中的加操作:
import android.support.test.runner.AndroidJUnit4;
import android.support.test.runner.AndroidJUnitRunner;
import android.test.ActivityInstrumentationTestCase2;
@RunWith(AndroidJUnit4.class)
public class CalculatorInstrumentationTest
extends ActivityInstrumentationTestCase2<CalculatorActivity> {
@Before
public void setUp() throws Exception {
super.setUp();
// Injecting the Instrumentation instance is required
// for your test to run with AndroidJUnitRunner.
injectInstrumentation(InstrumentationRegistry.getInstrumentation());
mActivity = getActivity();
}
@Test
public void typeOperandsAndPerformAddOperation() {
// Call the CalculatorActivity add() method and pass in some operand values, then
// check that the expected value is returned.
}
@After
public void tearDown() throws Exception {
super.tearDown();
}
}
InstrumentationRegistry類可以訪問測試運(yùn)行的信息。該類包括Instrumentation對象,目標(biāo)應(yīng)用上下文對象,測試應(yīng)用上下文對象及傳遞到測試的命令行參數(shù)。
JUnit 4.x的測試可以使用annotation來配置測試運(yùn)行,并支持Androidannotation:
@RequiresDevice:物理設(shè)備上運(yùn)行。
@SdkSupress:限定最低SDK版本。例如@SDKSupress(minSdkVersion=18)
。
@SmallTest,@MediumTest和@LargeTest:測試分級。
單個test suite可以分片,同一Instrumentation的同一分片可以作為一個組。每個片都有索引號。當(dāng)運(yùn)行測試,使用-e numShards選項(xiàng)指定片數(shù)和-e shardIndex選項(xiàng)來指定要運(yùn)行的片。
例如分成10個碎片,僅執(zhí)行第二片測試,請使用以下命令:
adb shell am instrument -w -e numShards 10 -e shardIndex 2
Espresso
Espresso提供了一組API來構(gòu)建UI測試來測試用戶流程。這些API讓你寫簡潔和可靠運(yùn)行的自動化UI測試。Espresso非常適合白盒自動測試,測試代碼利用了被測應(yīng)用的代碼細(xì)節(jié)。
Espresso的主要特性:
視圖匹配(View matching): 靈活的API用于查看和適配目標(biāo)應(yīng)用。
Action API:一套擴(kuò)展的action API自動化UI交互。
UI線程同步(UI thread synchronization)以提高測試的可靠性。
要求Android2.2(API 8)或更高。
Espresso.onView()方法可以訪問目標(biāo)應(yīng)用程序的UI組件并與之交互。該方法接受一個Matcher參數(shù),搜索視圖層來定位視圖實(shí)例。定位方法可以基于類名、內(nèi)容描述、R.id、顯示的文本。比如
onView(withId(R.id.my_button));
如果搜索成功,onView()方法返回對應(yīng)view的引用,可執(zhí)行用戶操作和斷言。
AdapterView由子view動態(tài)生成。如果目標(biāo)視圖在AdapterView(ListView或GridView)中,onView()方法可能不起作用,因?yàn)榭赡苤患虞d了一部分,Espresso.onData()則可以。
ViewActions可以執(zhí)行視圖點(diǎn)擊(View clicks),滑動(Swipes),按鍵或者按鈕(Key and button press)、文本輸入(Typing text)、打開鏈接(Opening a link)。
// Type text into an EditText view, then close the soft keyboard
onView(withId(R.id.editTextUserInput))
.perform(typeText(STRING_TO_BE_TYPED), closeSoftKeyboard());
// Press the button to submit the text change
onView(withId(R.id.changeTextBt)).perform(click());
由于時間問題,在Android設(shè)備上測試隨機(jī)失敗。之前一般通過sleep和超時處理解決。Espresso測試框架處理Instrumentation和UI線程之間的同步,很好地解決了這些問題。
API參考:developer.android.com/reference/android/support/test/package-summary.html
測試參考:http://developer.android.com/training/testing/ui-testing/espresso-testing.html
robotium
Android用戶場景測試,在Espresso出來直接比較流行,現(xiàn)在有弱化的趨勢。
https://github.com/RobotiumTech/robotium
Genymotion
高效的安卓模擬器 http://www.genymotion.net/
Robolectric
開源。使用shadow objects運(yùn)行測試于普通的工作站/服務(wù)器JVM,它并不依賴于Android提供的測試功能,無須模擬器、設(shè)備,效率高。無須dexing(編譯成Dalvik VM使用的格式),打包,部署和運(yùn)行的過程。
是安卓單元測試的首選工具。
網(wǎng)址:pivotal.github.com/robolectric
Monkey
Monkey是Android中的命令行工具,可以運(yùn)行在模擬器里或?qū)嶋H設(shè)備中。它向系統(tǒng)發(fā)送偽隨機(jī)的用戶事件流(如按鍵輸入、觸摸屏輸入、手勢輸入等),實(shí)現(xiàn)對正在開發(fā)的應(yīng)用程序進(jìn)行壓力測試。Monkey測試是一種為了測試軟件的穩(wěn)定性、健壯性的快速有效的方法。
https://developer.android.com/studio/test/monkey
Android Lint
Android Studio 提供一個名為 Lint 的代碼掃描工具,可幫助您發(fā)現(xiàn)并糾正代碼結(jié)構(gòu)質(zhì)量的問題,而無需實(shí)際執(zhí)行該應(yīng)用,也不必編寫測試用例。該工具會報告其檢測到的每個問題并提供該問題的描述消息和嚴(yán)重級別,以便您可以快速確定需要優(yōu)先進(jìn)行哪些關(guān)鍵改進(jìn)。此外,您可以調(diào)低問題的嚴(yán)重級別,忽略與項(xiàng)目無關(guān)的問題,也可以調(diào)高嚴(yán)重級別,以突出特定問題。
Lint 工具可檢查您的 Android 項(xiàng)目源文件是否包含潛在錯誤,以及在正確性、安全性、性能、易用性、便利性和國際化方面是否需要優(yōu)化改進(jìn)。在使用 Android Studio 時,配置的 Lint 和 IDE 檢查會在您每次構(gòu)建應(yīng)用時運(yùn)行。不過,您可以手動運(yùn)行檢查或從命令行運(yùn)行 Lint。
https://developer.android.com/studio/write/lint?hl=zh-cn#commandline
兼容性測試套件 (CTS)
兼容性測試套件 (CTS) 是一個免費(fèi)的商業(yè)級測試套件CTS 代表兼容性的“機(jī)制”。
CTS 在桌面設(shè)備上運(yùn)行,并直接在連接的設(shè)備或模擬器上執(zhí)行測試用例。CTS 是一套單元測試,旨在集成到工程師構(gòu)建設(shè)備的日常工作流程(例如通過連續(xù)構(gòu)建系統(tǒng))中。其目的是盡早發(fā)現(xiàn)不兼容性,并確保軟件在整個開發(fā)過程中保持兼容性。
CTS 是一個自動化測試工具,其中包括兩個主要軟件組件:
CTS tradefed 自動化測試框架會在桌面設(shè)備上運(yùn)行,并管理測試執(zhí)行情況。
單獨(dú)的測試用例會在被測設(shè)備 (DUT) 上執(zhí)行。測試用例采用 Java 語言編寫為 JUnit 測試,并打包為 Android .apk 文件,以在實(shí)際目標(biāo)設(shè)備上運(yùn)行。
兼容性測試套件驗(yàn)證程序(CTS 驗(yàn)證程序)是對 CTS(可在此處下載)的補(bǔ)充。CTS 驗(yàn)證程序?yàn)闊o法在沒有手動輸入(例如音頻質(zhì)量、加速度計等)的固定設(shè)備上進(jìn)行測試的 API 和功能提供測試。
CTS 驗(yàn)證程序是一款手動測試工具,包含以下軟件組件:
在 DUT 上執(zhí)行并收集結(jié)果的 CTS 驗(yàn)證程序應(yīng)用。
在桌面設(shè)備上執(zhí)行,以便為 CTS 驗(yàn)證程序應(yīng)用中的某些測試用例提供數(shù)據(jù)或額外控制的可執(zhí)行文件或腳本。
monkey runner
monkeyrunner工具提供了API,使用此API寫出的程序可以在Android代碼之外控制Android設(shè)備和模擬器。通過monkeyrunner,您可以寫出一個Python程序去安裝一個Android應(yīng)用程序或測試包,運(yùn)行它,向它發(fā)送模擬擊鍵,截取它的用戶界面圖片,并將截圖存儲于工作站上。monkeyrunner工具的主要設(shè)計目的是用于測試功能/框架水平上的應(yīng)用程序和設(shè)備,或用于運(yùn)行單元測試套件,但您當(dāng)然也可以將其用于其它目的。
下面是簡單的monkeyrunner程序,它連接到設(shè)備,創(chuàng)建MonkeyDevice對象。 程序使用MonkeyDevice對象安裝Android應(yīng)用程序包,運(yùn)行activity,并將關(guān)鍵事件發(fā)送到activity。 然后程序截取結(jié)果的屏幕截圖,創(chuàng)建MonkeyImage對象。 從該對象,程序輸出包含屏幕截圖的.png文件。
# Imports the monkeyrunner modules used by this program
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
# Connects to the current device, returning a MonkeyDevice object
device = MonkeyRunner.waitForConnection()
# Installs the Android package. Notice that this method returns a boolean, so you can test
# to see if the installation worked.
device.installPackage('myproject/bin/MyApplication.apk')
# sets a variable with the package's internal name
package = 'com.example.android.myapplication'
# sets a variable with the name of an Activity in the package
activity = 'com.example.android.myapplication.MainActivity'
# sets the name of the component to start
runComponent = package + '/' + activity
# Runs the component
device.startActivity(component=runComponent)
# Presses the Menu button
device.press('KEYCODE_MENU', MonkeyDevice.DOWN_AND_UP)
# Takes a screenshot
result = device.takeSnapshot()
# Writes the screenshot to a file
result.writeToFile('myproject/shot1.png','png')
DDMS
DDMS 的全稱是DalvikDebug Monitor Service,是 Android 開發(fā)環(huán)境中的Dalvik虛擬機(jī)調(diào)試監(jiān)控服務(wù)。提供測試設(shè)備截屏、查看特定進(jìn)程正在運(yùn)行的線程以及堆信息、Logcat、廣播狀態(tài)信息、模擬電話呼叫、模擬接收及發(fā)送SMS、虛擬地理坐標(biāo)等服務(wù)。
https://developer.android.com/studio/profile/monitor
openstf
通過瀏覽器控制管理多臺安卓設(shè)備。
https://github.com/openstf/stf
參考資料
- 緊張整理更新中,討論 釘釘免費(fèi)群21745728 qq群144081101 567351477
- 本文涉及的python測試開發(fā)庫 謝謝點(diǎn)贊!
- 本文相關(guān)書籍下載
- 更多python性能測試工具參考
- 2018最佳12個開源或免費(fèi)web服務(wù)器和客戶端性能測試工具