不知道為什麼CTS在網路上找到的資訊總是停留在Android 4.4。偶有幾篇2016的卻也僅只於5.1的lollipop。雖然其實Google在官方上的說明其實也已經很清楚。但是卻缺少了Windows版本的說明.只好自己照unix script來試試瞜!
由於Android過個季也會因為Security patch的關係升級TestPlan,快速的疊代也是追的蠻辛苦的,實際跑玩一Run才發現總是要結關前就能趕的及測過也是挺不容易的呢。
這邊的Setup guide裡面就只提到Linux與Mac…
https://source.android.com/compatibility/cts/setup
好吧~ 廢話完了開始進入正題,這邊我拿的是這個時間點最新的CTS 7.1 r5
Android 7.1 R5 Compatibility Test Suite (CTS)
解開後的路徑”android-cts\tools\cts-tradefed”也就是在UNIX下要執行的腳本
首先開頭就是對於環境的檢查,最少就是要有adb, aapt, java。
Java這邊我的電腦本來就已經裝好JRE 1.8,而adb和aapt都可以透過android-sdk來取得。
記得要Update到最新的API level,當前是25.0.3
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | # launcher script for cts-tradefed harness # can be used from an Android build environment, or a standalone cts zip checkFile() { if [ ! -f "$1" ]; then echo "Unable to locate $1" exit fi; } checkPath() { if ! type -P $1 &> /dev/null; then echo "Unable to find $1 in path." exit fi; } checkPath aapt checkPath adb checkPath java |
接續環境的檢查,諸如確定Java版本,Android的Build env detect 看來作用是取得CTS_ROOT.
debug_flag這段和os我們則是都用不到可以略過的
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | # check java version JAVA_VERSION=$(java -version 2>&1 | head -n 2 | grep '[ "]1\.[678][\. "$$]') if [ "${JAVA_VERSION}" == "" ]; then echo "Wrong java version. 1.6, 1.7 or 1.8 is required." exit fi # check debug flag and set up remote debugging if [ -n "${TF_DEBUG}" ]; then if [ -z "${TF_DEBUG_PORT}" ]; then TF_DEBUG_PORT=10088 fi RDBG_FLAG=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=${TF_DEBUG_PORT} fi # get OS HOST=`uname` if [ "$HOST" == "Linux" ]; then OS="linux-x86" elif [ "$HOST" == "Darwin" ]; then OS="darwin-x86" else echo "Unrecognized OS" exit fi # check if in Android build env if [ ! -z "${ANDROID_BUILD_TOP}" ]; then if [ ! -z "${ANDROID_HOST_OUT}" ]; then CTS_ROOT=${ANDROID_HOST_OUT}/cts else CTS_ROOT=${ANDROID_BUILD_TOP}/${OUT_DIR:-out}/host/${OS}/cts fi if [ ! -d ${CTS_ROOT} ]; then echo "Could not find $CTS_ROOT in Android build environment. Try 'make cts'" exit fi; fi; if [ -z ${CTS_ROOT} ]; then # assume we're in an extracted cts install CTS_ROOT="$(dirname $0)/../.." fi; |
到這邊開始把要跑的jar檔一起收進JAR_PATH這個環境變數裡.
最主要就是由上一段code定義好的CTS_ROOT基礎去撈 android-cts/tools 底下
tradefed-prebuilt, hosttestlib, compatibility-host-util, cts-tradefed這四個執行模組.
然後中段的部分視環境情況載入google指定模組和Libary.
但是這些我們載下來的檔案裡頭都是沒有的.
所以就只剩下最後的東西 android-cts/testcases/*.jar 所有的test module.
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | JAR_DIR=${CTS_ROOT}/android-cts/tools JARS="tradefed-prebuilt hosttestlib compatibility-host-util cts-tradefed" for JAR in $JARS; do checkFile ${JAR_DIR}/${JAR}.jar JAR_PATH=${JAR_PATH}:${JAR_DIR}/${JAR}.jar done OPTIONAL_JARS=" google-tradefed google-tradefed-tests google-tf-prod-tests" for JAR in $OPTIONAL_JARS; do if [ -f "$JAR.jar" ]; then JAR_PATH=${JAR_PATH}:${JAR_DIR}/${JAR}.jar fi; done # load any shared libraries for host-side executables LIB_DIR=${CTS_ROOT}/android-cts/lib if [ "$HOST" == "Linux" ]; then LD_LIBRARY_PATH=${LIB_DIR}:${LIB_DIR}64:${LD_LIBRARY_PATH} export LD_LIBRARY_PATH elif [ "$HOST" == "Darwin" ]; then DYLD_LIBRARY_PATH=${LIB_DIR}:${LIB_DIR}64:${DYLD_LIBRARY_PATH} export DYLD_LIBRARY_PATH fi # include any host-side test jars for j in ${CTS_ROOT}/android-cts/testcases/*.jar; do JAR_PATH=${JAR_PATH}:$j done |
當然最後的最後就是把這些環境變數都代入JAVA machine run啦.
119 | java $RDBG_FLAG -cp ${JAR_PATH} -DCTS_ROOT=${CTS_ROOT} com.android.compatibility.common.tradefed.command.CompatibilityConsole "$@" |
我們分析完整個腳本後,需要的是確保DOS shell裡面adb, aapt, java
已經是可以直接執行的.所以要修改的是進入腳本時windows PATH環境變數.
其二是要處理兩個放進JAVA執行時的變數CTS_ROOT和JAR_PATH.
CTS_ROOT是去指定當下存放的路徑,然後再把這些JAR file都能疊代進JAR_PATH裡頭.
依據結論,下列即是代換成Windows下可以跑的Batch腳本.
SDK_ROOT指向系統上安裝android-sdk的路徑
CTS_ROOT則填入存放CTS的目錄
@echo off set SDK_ROOT=%ANDROID_HOME% set CTS_ROOT=D:\CTS set "RUN_PATH=" set "JAR_PATH=" set PATH=%PATH%;%SDK_ROOT%\platform-tools\;%SDK_ROOT%\tools\;%SDK_ROOT%\build-tools\25.0.3\ :: set RDBG_FLAG=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y SETLOCAL ENABLEDELAYEDEXPANSION :: include \android-cts\tools for %%f in (%CTS_ROOT%\android-cts\tools\*.jar) do set RUN_PATH=%%f;!RUN_PATH! :: include any host-side test jars for %%f in (%CTS_ROOT%\android-cts\testcases\*.jar) do set JAR_PATH=%%f;!JAR_PATH! java -Xmx512M -cp %RUN_PATH%%JAR_PATH% -DCTS_ROOT=%CTS_ROOT% com.android.compatibility.common.tradefed.command.CompatibilityConsole |
最後放到CTS目錄底下存成cts.bat直接點兩下就可以快樂執行他瞜.
最後的最後
run cts是跑整份testplan這是沒有變的,但是v2的版本取消了class與method的方式指定部分測試.
而是改成由test module的方式如下鍵入module test:
run cts -m Gesture –test android.gesture.cts.GestureTest#testGetStrokes
run cts -m CtsGestureTestCases –test android.gesture.cts.GestureTest#testGetStrokes
如果不知道要測試的module可以用”list m”來查詢.詳細請參閱官網瞜
Refers:
http://cloudlife2013.blogspot.tw/2015/04/jrejdk.html
https://discuss.appium.io/t/error-aapt-not-found-when-running-test/7321