android自动化测试总体说明

来源:互联网 发布:泰山学院网络管理系统 编辑:程序博客网 时间:2024/05/17 08:49
android自动化测试总体说明


核心工具:
uiautomatorviewer – 一个图形界面工具来扫描和分析应用的UI控件。
uiautomator – 一个测试的Java库,包含了创建UI测试的各种API和执行自动化测试的引擎。
入门参考博客:http://blog.csdn.net/chenbang110/article/details/23371731

ant 打包工具
入门参考博客:http://www.cnblogs.com/yaozhongxiao/p/3523061.html (签名与渠道部分可以忽略)
重点:项目引用第三方jar时要修改buil.xml文件的内容,防止在编译时出现找不到所引用的类,
 在运行时也会出现该问题,因为编译时没有把第三方jar加入到编译后的jar包中
 解决以上两个问题的参考方案:
 1、先在build.xml的<project></project>中加入
<project>
........
<import file="custom_rules.xml" optional="true" />
...........
</project>
 2、创建custom_rules.xml,和build.xml同在一个文件夹中,写入以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<project>
<target name="compile" depends="-build-setup, -pre-compile">
<echo message="${jar.libs.dir}" />
<javac encoding="${java.encoding}" source="${java.source}"
target="${java.target}" debug="true" extdirs="" includeantruntime="false"
destdir="${out.classes.absolute.dir}" bootclasspathref="project.target.class.path"
verbose="${verbose}" fork="${need.javac.fork}">
<src path="${source.absolute.dir}" />

<compilerarg line="${java.compilerargs}" />
<classpath>
<fileset dir="${jar.libs.dir}" includes="*.jar" />
</classpath>
</javac>
</target>

<target name="-dex" depends="compile, -post-compile">
<dex executable="${dx}" output="${intermediate.dex.file}"
nolocals="@{nolocals}" verbose="${verbose}">
<fileset dir="${jar.libs.dir}">
<include name="*.jar" />
</fileset>
<path path="${out.classes.absolute.dir}" />
</dex>
</target>
</project>
 3、把所有jar包放到libs目录中
 
  解决以上两个问题的参考方案2:
  把步骤2中custom_rules.xml文件内容<target>...</target>直接追加到build.xml的<project></project>中,把所有jar包放到libs目录中




对uiautomator类的回调方法的执行流程:
第一、回掉setName(),得到类中所有的 测试用例,及方法签名为public void testXxx()
测试用例的执行顺序按按方法名称的ascii码表增序执行
如下:
0:setName() ->testOrder
0:setName() ->testOrder1
0:setName() ->testOrder2
0:setName() ->testOrder3
0:setName() ->testOrder4
0:setName() ->testOrder5
为什么次序都是0?而name却不一样


第二、回调run开始执行测试用例
1:run(TestResult result)->junit.framework.TestResult@41a98a08
第三、统计测试用例的数目
2:countTestCases()
第四、获取执行的测试用例的方法名
3:getName()
第五、回调runBare,runBare方法依次执行setUp(),runTest(),tearDown();
4:runBare()
5:setup
6:runTest()
第六、runBare()执行runTest()时,回调测试用例方法textXxx()
7:testOrder()
8:tearDown()
第七,执行完tearDown(),返回到runBare(),runBare()结束后,再次执行run(TestResult result),
直至所有测试用例都执行完。


执行流程:
0:setName() 
for(){ //循环次数在setName()后决定
run(TestResult result)->junit.framework.TestResult
countTestCases()
getName()
runBare(){
setup
runTest(){
testOrder()
}
tearDown()
}
}




总结:所有的测试代码直接加入到testXXX()中就可以了,setup()测试前的准备,tearDown()测试后的处理


测试的源码:
package com.zyclong.uiautomar;


import junit.framework.TestResult;
import android.os.Bundle;


import com.android.uiautomator.core.UiDevice;
import com.android.uiautomator.testrunner.IAutomationSupport;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;


public class TestMethod extends UiAutomatorTestCase {


private int order=0;
private int xiawo=0;
private int xiawo1=0;
public TestMethod(){}
@Override
public UiDevice getUiDevice() {
// TODO Auto-generated method stub
System.out.println((order++)+":getUiDevice()");
return super.getUiDevice();
}


@Override
public Bundle getParams() {
// TODO Auto-generated method stub
System.out.println((order++)+":getParams()");
return super.getParams();
}


@Override
public IAutomationSupport getAutomationSupport() {
// TODO Auto-generated method stub
System.out.println((order++)+":getAutomationSupport()");
return super.getAutomationSupport();
}


@Override
protected void setUp() throws Exception {
// TODO Auto-generated method stub
System.out.println((order++)+":setup");
super.setUp();
}


@Override
public void sleep(long ms) {
// TODO Auto-generated method stub
System.out.println((order++)+":sleep()");
super.sleep(ms);
}


@Override
protected void tearDown() throws Exception {
// TODO Auto-generated method stub
System.out.println((order++)+":tearDown()");
super.tearDown();
}


@Override
public int countTestCases() {
// TODO Auto-generated method stub
System.out.println((order++)+":countTestCases()");
return super.countTestCases();
}


@Override
protected TestResult createResult() {
// TODO Auto-generated method stub
System.out.println((order++)+":createResult()");
return super.createResult();
}


@Override
public TestResult run() {
// TODO Auto-generated method stub
System.out.println((order++)+":run()");
return super.run();
}


@Override
public void run(TestResult result) {
System.out.println((order++)+":run(TestResult result)->"+result.toString());
// TODO Auto-generated method stub
super.run(result);
}


@Override
public void runBare() throws Throwable {
System.out.println((order++)+":runBare() ");
// TODO Auto-generated method stub
super.runBare();
}


@Override
protected void runTest() throws Throwable {
System.out.println((order++)+":runTest() ");
// TODO Auto-generated method stub
super.runTest();
}


@Override
public String toString() {
System.out.println((order++)+":toString() ");
// TODO Auto-generated method stub
return super.toString();
}


@Override
public String getName() {
System.out.println((order++)+":getName() "+super.getName());
// TODO Auto-generated method stub
return super.getName();
}


@Override
public void setName(String name) {
xiawo1=xiawo1+1;
++xiawo;
System.out.println(xiawo+"---->"+xiawo1);
System.out.println((order++)+":setName() ->"+name);
// TODO Auto-generated method stub
super.setName(name);
/**
* 1---->1
0:setName() ->testOrder
1---->1
0:setName() ->testOrder1
1---->1
0:setName() ->testOrder2
1---->1
0:setName() ->testOrder3
1---->1
0:setName() ->testOrder4
1---->1
0:setName() ->testOrder5
*/
}


public void testOrder(){
System.out.println((order++)+":testOrder()");
}
public void testOrder1(){
System.out.println((order++)+":testOrder1()");
}
public void testOrder2(){
System.out.println((order++)+":testOrder2()");
}
public void testOrder3(){
System.out.println((order++)+":testOrder3()");
}
public void testOrder4(){
System.out.println((order++)+":testOrder4()");
}
public void testOrder5(){
System.out.println((order++)+":testOrder5()");
}




}





实际的运行日志:


F:\zyclong\workspace\android\UIAM_Register>adb shell uiautomator runtest UIAM_Register.jar -c com.lynhsp.register.TestMethod
0:setName() ->testOrder
0:setName() ->testOrder1
0:setName() ->testOrder2
0:setName() ->testOrder3
0:setName() ->testOrder4
0:setName() ->testOrder5
1:run(TestResult result)->junit.framework.TestResult@41a98a08
2:countTestCases()
3:getName()
INSTRUMENTATION_STATUS: numtests=6
INSTRUMENTATION_STATUS: stream=
com.lynhsp.register.TestMethod:
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: test=testOrder
INSTRUMENTATION_STATUS: class=com.lynhsp.register.TestMethod
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS_CODE: 1
4:runBare()
5:setup
6:runTest()
7:testOrder()
8:tearDown()
INSTRUMENTATION_STATUS: numtests=6
INSTRUMENTATION_STATUS: stream=.
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: test=testOrder
INSTRUMENTATION_STATUS: class=com.lynhsp.register.TestMethod
INSTRUMENTATION_STATUS: current=1
INSTRUMENTATION_STATUS_CODE: 0
1:run(TestResult result)->junit.framework.TestResult@41a98a08
2:countTestCases()
3:getName()
INSTRUMENTATION_STATUS: numtests=6
INSTRUMENTATION_STATUS: stream=
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: test=testOrder1
INSTRUMENTATION_STATUS: class=com.lynhsp.register.TestMethod
INSTRUMENTATION_STATUS: current=2
INSTRUMENTATION_STATUS_CODE: 1
4:runBare()
5:setup
6:runTest()
7:testOrder1()
8:tearDown()
INSTRUMENTATION_STATUS: numtests=6
INSTRUMENTATION_STATUS: stream=.
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: test=testOrder1
INSTRUMENTATION_STATUS: class=com.lynhsp.register.TestMethod
INSTRUMENTATION_STATUS: current=2
INSTRUMENTATION_STATUS_CODE: 0
1:run(TestResult result)->junit.framework.TestResult@41a98a08
2:countTestCases()
3:getName()
INSTRUMENTATION_STATUS: numtests=6
INSTRUMENTATION_STATUS: stream=
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: test=testOrder2
INSTRUMENTATION_STATUS: class=com.lynhsp.register.TestMethod
INSTRUMENTATION_STATUS: current=3
INSTRUMENTATION_STATUS_CODE: 1
4:runBare()
5:setup
6:runTest()
7:testOrder2()
8:tearDown()
INSTRUMENTATION_STATUS: numtests=6
INSTRUMENTATION_STATUS: stream=.
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: test=testOrder2
INSTRUMENTATION_STATUS: class=com.lynhsp.register.TestMethod
INSTRUMENTATION_STATUS: current=3
INSTRUMENTATION_STATUS_CODE: 0
1:run(TestResult result)->junit.framework.TestResult@41a98a08
2:countTestCases()
3:getName()
INSTRUMENTATION_STATUS: numtests=6
INSTRUMENTATION_STATUS: stream=
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: test=testOrder3
INSTRUMENTATION_STATUS: class=com.lynhsp.register.TestMethod
INSTRUMENTATION_STATUS: current=4
INSTRUMENTATION_STATUS_CODE: 1
4:runBare()
5:setup
6:runTest()
7:testOrder3()
8:tearDown()
INSTRUMENTATION_STATUS: numtests=6
INSTRUMENTATION_STATUS: stream=.
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: test=testOrder3
INSTRUMENTATION_STATUS: class=com.lynhsp.register.TestMethod
INSTRUMENTATION_STATUS: current=4
INSTRUMENTATION_STATUS_CODE: 0
1:run(TestResult result)->junit.framework.TestResult@41a98a08
2:countTestCases()
3:getName()
INSTRUMENTATION_STATUS: numtests=6
INSTRUMENTATION_STATUS: stream=
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: test=testOrder4
INSTRUMENTATION_STATUS: class=com.lynhsp.register.TestMethod
INSTRUMENTATION_STATUS: current=5
INSTRUMENTATION_STATUS_CODE: 1
4:runBare()
5:setup
6:runTest()
7:testOrder4()
8:tearDown()
INSTRUMENTATION_STATUS: numtests=6
INSTRUMENTATION_STATUS: stream=.
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: test=testOrder4
INSTRUMENTATION_STATUS: class=com.lynhsp.register.TestMethod
INSTRUMENTATION_STATUS: current=5
INSTRUMENTATION_STATUS_CODE: 0
1:run(TestResult result)->junit.framework.TestResult@41a98a08
2:countTestCases()
3:getName()
INSTRUMENTATION_STATUS: numtests=6
INSTRUMENTATION_STATUS: stream=
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: test=testOrder5
INSTRUMENTATION_STATUS: class=com.lynhsp.register.TestMethod
INSTRUMENTATION_STATUS: current=6
INSTRUMENTATION_STATUS_CODE: 1
4:runBare()
5:setup
6:runTest()
7:testOrder5()
8:tearDown()
INSTRUMENTATION_STATUS: numtests=6
INSTRUMENTATION_STATUS: stream=.
INSTRUMENTATION_STATUS: id=UiAutomatorTestRunner
INSTRUMENTATION_STATUS: test=testOrder5
INSTRUMENTATION_STATUS: class=com.lynhsp.register.TestMethod
INSTRUMENTATION_STATUS: current=6
INSTRUMENTATION_STATUS_CODE: 0
INSTRUMENTATION_STATUS: stream=
Test results for WatcherResultPrinter=......
Time: 0.1


OK (6 tests)




INSTRUMENTATION_STATUS_CODE: -1


接下来就是自由发挥了。