Android自动化测试中AccessibilityService获取控件信息(1)
已经做到了获得控件信息,但是AccessibilityEventgetSource()得到的是被点击的单体对象。我们需要获得是整个窗口的对象,在API16中AccessibilityService新引入的方法getRootInActiveWindow()可以满足我们的要求,所以我们用这个方法得到整个窗口,然后遍历得到所有子节点。
AccessibilityNodeInfo rowNode = getRootInActiveWindow();
if (rowNode == null) {
Logi(TAG, "noteInfo is null");
return;
} else {
recycle(rowNode);
}
Logi(TAG, "==============================================");
其中循环的方法recycle():public void recycle(AccessibilityNodeInfo info) {
if (infogetChildCount() == 0) {
Logi(TAG, "child widget----------------------------" + infogetClassName());
Logi(TAG, "showDialog:" + infocanOpenPopup());
Logi(TAG, "Text:" + infogetText());
Logi(TAG, "windowId:" + infogetWindowId());
} else {
for (int i = 0; i < infogetChildCount(); i++) {
if(infogetChild(i)!=null){
recycle(infogetChild(i));
}
}
}
}
ServiceTestCase 继承于继承了Junit
框架中的TestCase的AndroidTestCase类。该类中包含有测试应用的许可,控制被测试的应用和Service
等大量方法。同时也提供了模拟的应用(Applcation)和上下文(Context)方便我们可以使Service 独立于其应用进行测试。
Service
TestCasesetUp()方法在每个测试用例调用之前执行,该方法执行的时候配置测试数据通过复制并获得当前系统提供的Context
你可以通过getSystemContext()取得系统的当前Context。如果你重写setUp()方法的话,第一条语句应该是supersetUp()。setApplication(Application)方法和setContext(Context)方法允许你在Service启动之前设置模拟的Context和模拟的Application,如果不做设定,将自动为测试指定MockApplication和MockContext。在调用startService()或者bindService()时,ServiceTestcase会自动初始化测试环境。因此,如果需要设定特定的测试环境,必须要在启动被测Service之前创建需要模拟的对象等等。
需要注意的是ServiceTestCase
bindService()方法和ServicebindService()方法的参数不同的:ServiceTestCasebindService()
方法只需要提供Intent对象,而ServicebindService()还需要指定ServiceConnection和flag。而且ServiceTestCasebindService()方法返回一个IBinder对象的子类,而ServicebindService
()返回的是布尔值。
在每条测试用例运行结束后,teardown()方法会按照Service的生命周期进行回收。比如,通过bindService()方法启动Service的情况下,teardown()方法会自动依次调用该Service的onUnbind()方法和onDestroy()方法。
ServiceTestCase默认会执行testAndroidTestCaseSetupProperly()方法。用于验证该测试类是否在运行其他测试用例之前成功地设置了上下文。
下面以SAF的Security组件的API测试为例,描述测试整个过程:
首先Security组件对外提供的API是以AIDL方式暴露的两个方法
int getAgentVersionCode()
String exec(String[] args, String directory, boolean noResult, boolean
isSync)
因此需要使用ServiceTestCase的bindService()方法来进行测试。
首先新建测试工程,修改AndroidManifestxml
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<uses-library android:name="androidtestrunner" >
</uses-library>
</application>
<instrumentation
android:name="TestRunner"
android:targetPackage="safcmccsecurityagent" >
</instrumentation>
指定被测应用包名,指定TestRunner,声明使用androidtestrunner库。
新建TestRunner类
public class TestRunner extends InstrumentationTestRunner {
@Override
public
TestSuite getAllTests() {
InstrumentationTestSuite
suite = new InstrumentationTestSuite(this);
suiteaddTestSuite(ApiTestclass);
return
suite;
}
}
新建测试类ApiTest
public class ApiTest extends ServiceTestCase<SecurityService> {
public
ApiTest() {
super(SecurityServiceclass);
}
protected void
setUp() throws Exception {
Loge(getName(), "setUp");
supersetUp();
}
protected void
teardown() throws Exception {
Loge(getName(),
"tearDown");
supertearDown();
}
/
Test bind
service
/
public void
testBindable() {
Intent
startIntent = new Intent();
startIntentsetClass(getSystemContext(),
SecurityServiceclass);
IBinder
service = bindService(startIntent);
assertEquals(true,
serviceisBinderAlive());
}
/
Test
getAgentVersionCode
/
public void
testGetAgentVersionCode() {
Intent
startIntent = new Intent();
startIntentsetClass(getSystemContext(),
SecurityServiceclass);
IBinder
service = bindService(startIntent);
if
(serviceisBinderAlive()) {
SecurityAgent
securityAgent = SecurityAgentStub
asInterface(service);
int
versionCode = 0;
try {
versionCode
= securityAgentgetAgentVersionCode();
} catch
(RemoteException e) {
// TODO
Auto-generated catch block
eprintStackTrace();
}
assertEquals(2,
versionCode);
}
}
}
使用与被测应用相同签名编译安装测试apk,即可运行测试了
以上就是关于Android Service如何获得控件的句柄全部的内容,包括:Android Service如何获得控件的句柄、android如何检测哪些应用有service、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)