AndroidTV出口海外市场需要google test认证,Google为AndroidTV开发商准备了一系列的测试套件,用于提高app/framework/hal的相容性,进一步提升开发者/用户体验。对于开发者来说就是需要测试-解决-测试相关module fail项,除了google waive项之外,其余的fail issue全都要解决:不管用什么的方式(不能修改原始套件)。

CTS:Compatibility Test Suite,用于测试App和framework的兼容性。

VTS:Vendor Test Suite,向上用于测试与framework相容,向下测试与OS kernel的相容性。 

GTS:Google Mobile Service Test suite,测试google GMS相关服务的套件。

STS:Security Test Suite,主要用于测试Android Security Pacth是否有生效。

CTS Verifier:CTS的补充,需要手动验证。(相机、传感器、蓝牙等)

根据现有环境和需求:atest和am instrument是验证CTS的另2种方式,但没CTS tool强大,

Google atest的使用_fchyang的博客-CSDN博客_atest

使用am instrument验证CTS问题_fchyang的博客-CSDN博客_instrument -e class

准备步骤

参照: CTS/VTS/GTS Host端服务器安装配置_fchyang的博客-CSDN博客,//搭建服务器,安装相关tool。

官网:https://source.android.google.cn/compatibility/cts,//相关知识介绍,不同版本套件下载,测试命令等 都可以去看看

  • CTS:AndroidP r7套件有321 modules,
  • VTS:AndroidP r7套件有107 modules(VtsHalSensorsV1_0Target waive),
  • CTS-On-GSI:和VTS用同一个套件,有312 modules,
  • GTS:AndroidP r4版本有78 modules,
  • STS:AndroidP r4版本有3 modules。

怎么测试:以cts为例,相应的准备工作有哪些?

1、Bootcode

  • 设定不同的mac地址,以免相同mac造成地址冲突。
  • 不同方案的平台可能不同,根据需要设定,系统跑起来之后不能发生睡眠(cts往往跑几十个小时是有的,而且中间不能发生断电、待机等)

2、UI的设定:

  • Settings -> Device Preferences -> About -> Build   : 连续按 7 次 显示 Developer options 启动,不用再按
  • Settings ->Device Preferences -> Developer options -> Stay awake -> enable
  • Settings ->Device Preferences -> Developer options -> USB debugging -> enable 
  • Settings -> Device Preferences -> Screen saver -> Turn screen off
  • Settings -> Device Preferences -> Location -> Location status -> Use Wi-Fi to estimate location -> 确认同意

3、开一个终端输入: watch -n 1 adb connect “ip”,首先要确认device已经在线,这个命令每隔1s去检查adb是否有断线,断线的话自动连上。另开一个终端,从官网上下载相应Android版本的套件进行解压,cd android-cts/tools$ ./cts-tradefed 运行就进入测试shell环境,紧接着就可以输入测试命令,测试命令官网上都能找得到,可以help all看看。

  • 进行整个fullTest:run cts -s "ip":5555 --exclude-filter “moduleName”
  • 测试一个module:run cts -s "ip":5555 -m "moduleName"
  • 测试一个module其中的某一个testcase:run cts -s "ip":5555 -m module -t "testCase"
  • 多个devices进行一起测试,比如4台设备(前提最好知道这4台设备的ip地址):run cts -s “ip1”:5555 -s "ip2":5555 -s "ip3":5555 -s "ip4":5555 --shard-count 4 --exclude-filter "moduleName" 
  • 测试一个module,但是不想跑这个module的某个class,比如:run cts -s ip1:5555 -m CtsNetTestCases --exclude-filter "CtsNetTestCases android.net.cts.Ikev2VpnTest"
  • retry的时候,可以加--retry-type NOT_EXECUTED or FAILED,会重试之前会话中未执行的测试or失败的测项
  • 更多命令参考:https://source.android.com/docs/compatibility/cts/command-console-v2

如果测试过程中adb断线的话,测试大概率会fail,会出现找不到device,或是broken pipe等错误,通常连上adb 重测就会pass。

要跑完所有module,进行fulltest可执行如下command:run cts -s 192.168.1.106:5555 --exclude-filter CtsHostsideNetworkTests --skip-preconditions --skip-device-info ,fulltest之后会在android-cts/results/2019.06.11_10.31.21/test_result_failures.html,可以用浏览器打开看看。相应的log在android-cts/logs/2019.06.11_10.31.21/下面。(2019.06.11_10.31.21 这个是跑测试开始的时间,每次测试都会不同)

PS:ip是指测试设备的ip地址(比如192.168.1.106),可以用ifconfig or ip a 查看Ethernet的地址。--exclude-filter是测试的时候排除某个module。比如你想排查某个module是否有干扰因素,可以用exclude-filter。(如果已知局域网就连了4台设备,也可以去掉-s ip:5555,直接用run cts --shard-count 4即可,最多试过6个平台一起跑,没确认上限是多少)。--skip-preconditions --skip-device-info则是跳过收集device信息及条件检查等工作,减少了一点测试时间,单测一条case可以加上,全跑的话不建议加上。

下面罗列的1、2、3是指CTS/GTS/CTSGSi google认为可以豁免waive的项目(芯片方案商向google报备,申请豁免id)

1、CTS需要waive的项目

armeabi-v7a CtsHostsideNetworkTests
TestResultDetails
com.android.cts.net.HostsideVpnTests#testAppDisallowed

fail

java.lang.AssertionError: Failed to successfully run device tests for com.android.cts.net.hostside: Test run failed to complete. Expected 1 tests, received 0

com.android.cts.net.HostsideVpnTests#testDefault

fail

java.lang.AssertionError: Failed to successfully run device tests for com.android.cts.net.hostside: Test run failed to complete. Expected 1 tests, received 0

armeabi-v7a CtsSecurityTestCases
TestResultDetails
android.security.cts.EncryptionTest#testEncryption

fail

junit.framework.AssertionFailedError: Device encryption is required

armeabi-v7a CtsViewTestCases
TestResultDetails
android.view.cts.PixelCopyTest#testDialogProducer

fail

java.lang.AssertionError: Top edge; expected=ffffff00, actual=ff99a124

2、GTS需要waive的项目

armeabi-v7a GtsAssistantHostTestCases
TestResultDetails
com.google.android.assistant.gts.AssistantTest#testAssistantOpenFrontCamera

fail

java.lang.AssertionError

com.google.android.assistant.gts.AssistantTest#testAssistantOpenRearCamera

fail

java.lang.AssertionError

com.google.android.assistant.gts.AssistantTest#testAssistantTakePhotoWithoutVoiceInteraction

fail

java.lang.AssertionError

com.google.android.assistant.gts.AssistantTest#testAssistantTakeSelfieWithoutVoiceInteraction

fail

java.lang.AssertionError

armeabi-v7a GtsPermissionTestCases
TestResultDetails
com.google.android.permission.gts.PackageInstallerComponentTest#testPackageInstallerVersion

fail

java.lang.RuntimeException: PackageInstaller expected version >= 5218085, Please check.

3、CTS-On-GSI需要waive的项目

armeabi-v7a CtsBluetoothTestCases
TestResultDetails
android.bluetooth.cts.BluetoothLeScanTest#testBasicBleScan

fail

junit.framework.AssertionFailedError: Scan results shouldn't be empty

android.bluetooth.cts.BluetoothLeScanTest#testScanFilter

fail

junit.framework.AssertionFailedError: Scan results shouldn't be empty

armeabi-v7a CtsHiddenApiBlacklistCurrentApiTestCases
TestResultDetails
android.signature.cts.api.HiddenApiTest#testSignature

fail

repackaged.junit.framework.AssertionFailedError:

armeabi-v7a CtsHiddenApiBlacklistDebugClassTestCases
TestResultDetails
android.signature.cts.api.DebugClassHiddenApiTest#testSignature

fail

repackaged.junit.framework.AssertionFailedError:

armeabi-v7a CtsHostsideNetworkTests
TestResultDetails
com.android.cts.net.HostsideVpnTests#testAppDisallowed

fail

java.lang.AssertionError: Failed to successfully run device tests for com.android.cts.net.hostside: Test run failed to complete. Expected 1 tests, received 0

com.android.cts.net.HostsideVpnTests#testDefault

fail

java.lang.AssertionError: Failed to successfully run device tests for com.android.cts.net.hostside: Test run failed to complete. Expected 1 tests, received 0

armeabi-v7a CtsSecurityTestCases
TestResultDetails
android.security.cts.EncryptionTest#testEncryption

fail

junit.framework.AssertionFailedError: Device encryption is required

 4某些测项需要特殊手法才能pass

fulltest or retry or 单测多次都不能过,可以考虑重启device,重新disconnect/connect device去测,终极的话就是重烧img镜像文件 or data reset,这样都不能过那就是软件bug,需要SW去解决的。(bug可能是芯片厂商 or google issue)

  • android.appsecurity.cts.AdoptableHostTest#testPrimaryStorage,因为CTS里有media测项,测试的时候需要先copy media到device data分区(emmc/flash),占用空间有2G左右。CtsAppSecurityHostTestCases testPrimaryStorage测试期间会在类似ddr与data分区之间搬运资料(看起来还是有往data分区搬,df -h可以查看data分区在变大),但是2G的资料也不是瞬间就搬过来的,就会类似卡住的迹象,要超过十分钟那样才能测完,并且是fail。所以一般情况下,retry这项之前可以先做data reset的动作,Setting->Device Preferences->Reset,这样就会把data分区下先前copy过去的media remove掉。或者直接将通过命令行将data下的media rm掉。

  •  有两条和UI设定Language有关系,Setting->Device Preferences->Language:English(United States),选United Kingdom就会出错。(US vs UK,美帝和大英之间的对决),红框有标出差别。ex:CtsWebkitTestCases android.webkit.cts.WebSettingsTest#testAccessAllowFileAccess 和CtsContentTestCases android.content.pm.cts.PermissionInfoTest#testPermissionInfo

  • 有的测项和网络相关:Wifi/ipv6,需要特定的网络环境配置才能过。ex:CtsLibcoreTestCases libcore.java.net.InetAddressTest#test_getByName_invalid[1]  这项需要将host端ap router DNS设置为8.8.8.8;libcore.java.net.SocketTest#testSocketTestAllAddresses 这项就需要ipv6的环境的特殊手法测试。CtsNetTestCases android.net.cts.DnsTest#testDnsWorks 也是需要ipv6测试环境。CtsNetTestCases android.net.cts.ConnectivityManagerTest#testAcceptRaRtInfoMaxPlen、android.net.cts.ConnectivityManagerTest#testAcceptRaRtInfoMinPlen、android.net.cts.ConnectivityManagerTest#testConnectivityChanged_manifestRequestOnlyPreN_shouldReceiveIntent 等是需要wifi条件下测试的。wifi测项设定:一个路由拉出两根有线(不能上网,只是为了adb连线),一根给到host端电脑,一根给到device设备,这里是指TV,这样host端和TV端可以通过adb连接;另一个路由提供可以连外网的wifi(能上google),TV连上此wifi。这样一来那些需要wifi connected的测项可以pass。(目前tv端 能上网的有线 + 无线是不能共存的,只有不能上网的有线 + 无线可以共存;也就是说假如tv连上无线,此时上网的有线接入,wifi就断掉了。优先使用有线)

  • CTSGSI测项需要先烧user版img,烧完之后最好直接刷system.img,不用在等user版img烧完之后,进开机向导一步一步设定进入Launcher,设定太多反而某些测项也不容易过。ex:CtsAppSecurityHostTestCases android.appsecurity.cts.ExternalStorageHostTest#testSecondaryUsersInaccessible

小结:Google test 有些具有一定的随机性,相同的软件+硬件,不同环境或时间点多测试几次有的pass,有的fail,不过我们最终是要出报告,需要的是pass。如果大概率的出错,那就要排查是软件 or 硬件 or环境 or 测试手法是否有问题。

Logo

智屏生态联盟致力于大屏生态发展,利用大屏快应用技术降低开发者开发、发布大屏应用门槛

更多推荐