Android、JUnit深入浅出(三)

通过前面2篇文章的学习,我们对JUnit有了初步的认识,下面我们将深入的解析JUnit数据包。整个JUnit的数据包应该是很强大的,但是一般来说,不一定每个工程都需要这些数据包,而是在JUnit部分数据包的基础上扩展出自己的数据包,Android SDK中也不例外。至于JUnit完整的包,这里我们就不详细分析了,我们这里只解析Android SDK中包含的那些JUnit数据包,以及Android SDK在JUnit的基础上扩展的一些数据包,如下:

SDK功能说明
junit.frameworkJUnit测试框架
junit.runner实用工具类支持JUnit测试框架
android.testAndroid 对JUnit测试框架的扩展包
android.test.mockAndroid的一些辅助类
android.test.suitebuilder实用工具类,支持类的测试运行

在这些包中最为重要的是:junit.frameworkandroid.test,其中前者是JUnit的核心包,后者是Andoid SDK在Junit.framework的基础上扩展出来的包,我们将重点解析这2个包。

首先解析junit.framework包,结构如下:

junit.framework

通过这张图,大家就可以比较清晰的看到JUnit的主要框架,再回去看下上篇文章的例子,对前面的例子感觉明白多了。做个简要的总结,如下:

  1. TestSuit:TestSuite是测试用例的集合;
  2. TestCase:定义运行多个测试用例;
  3. TestResult:收集一个测试案例的结果,测试结果分为失败和错误,如果未能预计的断言就是失败,错误就像一个ArrayIndexOutOfBoundsException异常而导致的无法预料的问题;
  4. TestFailure:测试失败时捕获的异常;
  5. Assert:断言的方法集,当断言失败时显示信息;

TestCase与TestSuite之间的关系,有些类似于图元对象与容器对象之间的关系,在面向对象的语言C++、JAVA中较常见,在这里就不多说了。

举个简单的例子,并简要说明过程

第一步:实现TestCase

  1. 继承父类TestCase;
  2. 定义一下变量在测试中使用;
  3. 在setUp()中初始化这些变量;
  4. 在tearDown()中清理这些变量;
    public class MathTest extends TestCase{
    protected double fValue1;
    protected double fValue2;
    protected void setUp(){
    fValue1= 2.0;
    fValue2= 3.0;
    }
    }
  5. 编写测试单元代码;
    public void testAdd() {
    double result= fValue1 + fValue2;
    assertTrue(result == 5.0);
    }
  6. 运行测试用例,这里有2种方法可以使用:
  • 静态类型:覆盖runTes()和定义测试函数。最常用的就是采用java的匿名类,如下:
    TestCase test= new MathTest(“add”){
    public void runTest() { testAdd();}
    };
    test.run();
  • 动态类型:使用反射来实现runTest,它动态地发现并调用的方法,在这种情况下,测试案例的名字对应的测试方法来运行,如下:TestCase= new MathTest(“testAdd”);
    test.run();

    相比之下,第2种更符合面向对象的思维。

第二步:将TestCase添加到TestSuilt

           TestSuite suite= new TestSuite();
           suite.addTest(new MathTest("testAdd"));

由于TestSuite可以自动从TestCase中提取测试单元并运行,也可以用如下方法:

           TestSuite suite= new TestSuite(MathTest.class);

一个测试用例就完成了,想要更加详细的了解junit.framework,还是到Android SDK中仔细阅读。

总结说明

看了这些代码,再仔细看下JUnit的结构图,是不是感觉更加清晰了,下一篇幅我们将深入解析android.test包。



前面我们学习了junit.framework包,本篇幅我们开始学习android.test包,了解Android SDK是如何扩展junit.framework包。

首先整理android.test包的结构,如下图所示:

Android JUnit深入浅出(三)——JUnit深入解析(下)_27901

在前面的篇幅中说明过:TestCase与TestSuite之间的关系,有些类似于图元对象与容器对象之间的关系。有了这个思想,顺着这张的主线图从上往下看:首先看到的是TestCase类,接着看到InstrumentationTestCase、 AndroidTestCase,最后看到 ApplicationTestCase,ProviderTestCase2,ServiceTestCase,ActivityTestCase。这不就是Android 系统中4大组成元素:Activity、Provider、Service、BroadCast中的前3个,然后我们在看下Android SDK中的说明:

说明
AndroidTestCase如果你要访问资源或其他东西依赖于Activity的环境,在这个类的基础上扩展。
ActivityInstrumentationTestCase2
<T extends Activity>
这个类提供了一个单一的活动功能测试
ApplicationTestCase
<T extends Application>
提供了一个框架,可以在受控环境中测试Application类
ProviderTestCase2
<T extends ContentProvider>
提供了一个框架,可以在受控环境中测试ContentProvider类
ServiceTestCase
<T extends Service>
提供了一个框架,可以在受控环境中测试ServiceTest类。

这些类就不在这里说明,应该与我们平时使用Activity、Service、Provider基本一样。下面举个例子,来说明如何使用这些类,我们就将上一篇J2SE测试例子,在Android中实现:

  1. //MathTest.java
  2. import android.test.AndroidTestCase;
  3. import android.util.Log;
  4. public class MathTest extends AndroidTestCase
  5. {
  6. protected double fValue1;
  7. protected double fValue2;
  8. protected double fRe;
  9. static final String LOG_TAG = “MathTest”;
  10. protected void setUp() {
  11. fValue1= 2.0;
  12. fValue2= 3.0;
  13. fRe = 5.0;
  14. }

  15. public void testAdd()
  16. {
  17. Log.d( LOG_TAG, “testAdd” );
  18. assertTrue( LOG_TAG+”1″, ( (fValue1 + fValue2 ) == fRe ) );
  19. }
  20. }

  21. //ExampleSuite.java
  22. import junit.framework.TestSuite;
  23. public class ExampleSuite extends TestSuite
  24. {
  25. public ExampleSuite()
  26. {
  27. addTestSuite( MathTest.class );
  28. }
  29. }
复制代码
上一篇的例子比较后发现,除了引用的包、父类不一样以外,其他部分是完全一样的,在Android AVD上运行程序后看到的结果如下:

Android JUnit深入浅出(三)——JUnit深入解析(下)_27902

单击按钮“Launch test”运行测试用例,输出测试结果,我们的测试都通过了。这个测试界面是我们自己编写的单元测试的界面, 下一篇幅我们将重点介绍这部分。

总结说明

这里我们简要学习了android.test包,其实这个的内容远不止这些,包含:3个Interface、20个class、2个Error,列举如下:

Android JUnit深入浅出(三)——JUnit深入解析(下)_27903

android.test包深入的学习,只有到 Android SDK 中去仔细阅读了。通过学习android.test,让我们对Android 系统的组成元素:Activity、Provider、Service有了更加深入的了解。(文/ Android开发

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值