本文共 2693 字,大约阅读时间需要 8 分钟。
本节书摘来自异步社区《Android 应用测试指南》一书中的第2章,第2.5节创建一个测试用例,作者 【阿根廷】Diego Torres Milano(迭戈 D.),更多章节内容可以访问云栖社区“异步社区”公众号查看
2.5 创建一个测试用例
如上所述,我们将在Test项目中的src目录下面添加测试用例。我们特意利用Junit测试来创建一个单元测试用例。Eclipse提供了操作向导来帮助大家(File | New | Junit Test Case)。
我们打算选择主工程下面的活动Activity作为被测对象,尽管这个例子跟Activity实际内容无关。
创建测试用例时,我们有以下的值需要设置,如表2.2所示。
表2.2 新建用例填写的表格
严格说来,我们这里面有setUp()、tearDown()和constructor()选项,不过这不影响我们这里的例子,因为它比较基础、简单。但是,在实际的场景中,这三个函数都是需要的。
输入完上面描述的值之后,我们的Junit测试用例创建界面如图2.4所示。图2.4 新建Junit用例过程图
最基本的测试框架已经准备好了;剩下的工作就是添加一些虚拟的测试用例来确认流程是通畅的以及所有功能的执行都与预期一致。
Eclipse同样提供了插入桩的测试方法。单击Next会弹出下面的对话框,这里你可以选择需要插入桩的被测函数,如图2.5所示。
虽然说通过插入桩的方式十分方便测试,也很有用。但是你需要考虑,测试应该用行为来驱动而不是通过调用方法来驱动,毕竟行为驱动更加真实,更加符合实际。
图2.5 新建用例选择插入的方法函数
现在我们有了测试用例模板,下一步就是根据需求来完成测试用例。打开最新创建的用例,添加一个测试函数 testSomething()。最好的做法是,在类的最后添加用例。
写的用例代码如框2.1所示。
框2.1 testSometing源代码
/****/package com.example.aatg.myfirstproject.test;import android.test.suitebuilder.annotation.SmallTest;import junit.framework.TestCase;/*** @author diego**/public class MyFirstProjectTests extends TestCase { public MyFirstProjectTests() { this("MyFirstProjectTests"); } /*** @param name*/ public MyFirstProjectTests(String name) { super(name); } /* (non-Javadoc)* @see junit.framework.TestCase#setUp()*/ protected void setUp() throws Exception { super.setUp(); } /* (non-Javadoc)* @see junit.framework.TestCase#tearDown()*/ protected void tearDown() throws Exception { super.tearDown(); } @SmallTest public void testSomething() { fail("Not implemented yet"); }}
这个测试用例会永远执行失败,错误展示如下:Not implemented yet。我们在测试用例中使用了junit.framework.Assert类的fail函数来使得这个测试用例失败,并且显示上述给出的错误信息。
通过命令行,用am instrumentation命令来执行具体的测试用例,需要一个不带入参的构造函数,这点在后面会解释到。
2.5.1 特殊的方法
下面的表2.3中列出并描述了我们测试用例类中用到的特殊方法。表2.3 测试用例中的特殊方法
启动方法,设置初始化属性。比如,网络连接或者创建一个目标对象方便测试。这个方法在测试执行之前会被调用
在这个例子中,我们只是调用了父类中的方法
详情看第1章,测试入门
tearDown关闭某些属性。比如,关闭网络连接。这个方法在测试执行完毕后被调用在这个例子中,我们只是调用了父类的方法,详情参考第1章,测试入门testSomething测试方法样本。我们通过Junit3的反射机制,用test来标注测试函数,这样就可以被框架检测到并作为测试用例来执行了。测试方法的函数名应该很清晰可以辨认出要测什么属性
2.5.2 测试注释
仔细看看上面测试类中的函数定义,你会发现我们是用@MediumTest注释来标注测试函数的。这种注释用来给测试用例分组,然后可以单独执行同一个组的测试用例。还有一些同样类型的其他注释,如表2.4所示。
表2.4 标注的含义
在InstrumentationTestCase类的方法写上这个注释。一旦测试用例执行失败,这个注释下的函数将会重复执行。重复执行的最大次数可以设置,默认值是1。有时候随着时间的变化、环境的影响,一些测试用例执行会偶然失败,这时候这种方式就有用了
比如,假设你要将你的最大重复执行次数设置为4,那么你可以标注为:
@FlakyTest(tolerance=4)@UIThreadTest
在InstrumentationTestCase类中的测试方法下,测试方法将在主线程中执行,又叫UI线程 假设你想修改UI或者在同一个测试用例中利用一些技术进入设备,这时候设备方法可能调用不了。在这种情况下,你可以求助于Activity.runOnUIThread方法使得你可以创建Runnable并且在UI线程中运行你的用例
mActivity.runOnUIThread(new Runnable(){ public void run(){ // do somethings}});@Suppress
这个注释会把你的测试用例从一个测试集合中排出出去
这个注释可以在任何类中使用,即便是没有测试集合的类、或者只含有一个测试函数,或者只含一个测试集合的类,都可以将相应函数设置这个注释,排出在外现在我们的测试用例也准备好了,下一步就是要执行测试用例了。
转载地址:http://rieal.baihongyu.com/