4097|0

87

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

Android中的自动测试 [复制链接]

这里结合Music的测试程序,分析一下Android测试程序的结构和执行流程。

o TestRunner



1.Instrumentation是一个基本的可执行单元,有点类似于Activity和Service,所有测试程序都必须从它继承过来。

2.TestSuiteProvider是一个接口,有一个接口函数getTestSuite,用来获取测试用例。

3.InstrumentationTestRunner主要是重载了Instrumentation的onCreate和onStart,把执行线程和测试用例关联起来。

4.MusicPlayerStressTestRunner重载getAllTests了,框架通过getAllTests获取测试用例。

o 测试程序的执行过程

1.InstrumentationTestRunner::onCreate
调用getTestSuite获取测试用例,创建AndroidTestRunner对象mTestRunner,把TestRunner和TestCase关联起来。

2.Instrumentation::start
这里创建一个线程InstrumentationThread,然后执行线程的start函数。

3.InstrumentationThread::start
这里反过来调用Instrumentation::onStart, 这个函数实际上是在InstrumentationTestRunner里实现的。

4.InstrumentationTestRunner::onStart
这里真正去调用mTestRunner.runTest。

5.AndroidTestRunner::runTest
这里在一个循环中,去调用每一个测试用例的run函数。

o TestCase



1.Runnable是个接口,里面只有一个run函数。

2.TestCase也个接口,提供了setUp和tearDown两个函数,用来做测试前的初始化和测试后的清除工作。

3.InstrumentationTestCase 对Instrumentation进行包装,提供了sendKeys之类的函数,方便Testcase使用。里面还提供了runTest和runTestOnUiThread两个函数,但我还不知道这里怎么调用过来的。

4.ActivityInstrumentationTestCase是个模板,它在setUp时创建指定的Activity。

5.TestPlaylist则是实际的测试程序,这里实现了testDeletePlaylist之类测试函数。

o 测试程序的分类

1.Suppress
Use this annotation on test classes or test methods that should not be included in a test
suite. If the annotation appears on the class then no tests in that class will be included. If
the annotation appears only on a test method then only that method will be excluded.

2.LargeTest
Marks a test that should run as part of the large tests.

3.MediumTest
Marks a test that should run as part of the medium tests.

4.SmallTest
Marks a test that should run as part of the small tests.

5.Smoke
Marks a test that should run as part of the smoke tests.
The android.test.suitebuilder.SmokeTestSuiteBuilder
will run all tests with this annotation.

在函数或类的前面加相应的annotation,即可对其进行分类。如:

    @LargeTest
    public void testDeletePlaylist() throws Exception{
        boolean isEmptyPlaylist = true;
        addNewPlaylist(MusicPlayerNames.DELETE_PLAYLIST_NAME);
        deletePlaylist(MusicPlayerNames.DELETE_PLAYLIST_NAME);
        isEmptyPlaylist = verifyPlaylist(MusicPlayerNames.DELETE_PLAYLIST_NAME);
        assertFalse("testDeletePlaylist", isEmptyPlaylist);
    }在InstrumentationTestRunner里,会根据命令行参数来决定运行哪一类测试:

    private Predicate getSizePredicateFromArg(String sizeArg) {

        if (SMALL_SUITE.equals(sizeArg)) {
            return TestPredicates.SELECT_SMALL;
        } else if (MEDIUM_SUITE.equals(sizeArg)) {
            return TestPredicates.SELECT_MEDIUM;
        } else if (LARGE_SUITE.equals(sizeArg)) {
            return TestPredicates.SELECT_LARGE;
        } else {
            return null;
        }
    }

testSuiteBuilder.addRequirements(testSizePredicate);在TestSuiteBuilder中对测试程序进行筛选:

     */
    public final TestSuite build() {
        rootSuite = new TestSuite(getSuiteName());

        // Keep track of current class so we know when to create a new sub-suite.
        currentClassname = null;
        try {
            for (TestMethod test : testGrouping.getTests()) {
                if (satisfiesAllPredicates(test)) {
                    addTest(test);
                }
            }
            if (testCases.size() > 0) {
                for (TestCase testCase : testCases) {
                    if (satisfiesAllPredicates(new TestMethod(testCase))) {
                        addTest(testCase);
                    }
                }
            }
        } catch (Exception exception) {
            Log.i("TestSuiteBuilder", "Failed to create test.", exception);
            TestSuite suite = new TestSuite(getSuiteName());
            suite.addTest(new FailedToCreateTests(exception));
            return suite;
        }
        return rootSuite;
    }o AndroidManifest.xml

AndroidManifest.xml用来描述各个测试程序的入口:

    package="com.android.music.tests">

   
        
   


            android:targetPackage="com.android.music"
        android:label="Music Launch Performance">
   


            android:targetPackage="com.android.music"
        android:label="Music Player Functional Test">
   


            android:targetPackage="com.android.music"
        android:label="Music Player Stress Test">
   


o 运行测试程序
1.编译

cd packages/apps/Music/tests
mm
2.安装

adb install ../../../../out/target/product/littleton/data/app/MusicTests.apk
3.运行

adb shell am instrument -w com.android.music.tests/.MusicPlayerFunctionalTestRunner

[ 本帖最后由 liumnqti 于 2010-2-9 13:45 编辑 ]
点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表