Tips3 编写测试用例

发表于:2017-6-26 10:29

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:WillFlow    来源:博客

分享:
  当你google查找AndroidStudio单元测试的时候,有大量的资料教程,但是都不完整,至少跟着教程一步步的是无法看到自己想看的效果的,所以我写了此篇,想尽量完整地向大家展示单元测试的编写过程。
  Android Studio 自带的单元测试功能用起来很简单,它不需要修改gradle或者AndroidManifest.xml文件里的内容,直接编写测试用例即可。不过即使是这样,我相信大多数的程序员都还是不喜欢编写测试用例的,因为这是一件很繁琐的事情而且好像显得很多余:明明运行一下程序,观察运行结果就能知道对与错了,为什么还要通过代码来进行判断呢?确实,如果只是普通的一个小程序,编写测试用例是有些多此一举,但是当你正在维护一个非常庞大的工程时,你就会发现编写测试用例是非常有必要的。
  举个例子吧!比如你确实正在维护一个很庞大的工程,里面有许许多多数也数不清的功能。某天,你的领导要求你对其中一个功能进行修改,难度也不高,你很快就解决了,并且测试通过。但是几天之后,突然有人发现其他功能出现了问题,最终定位出来的原因竟然就是你之前修改的那个功能所导致的,这下你可就冤死了。
  不过千万别以为这是天方夜谭,在大型的项目中,这种情况还是很常见的。由于项目里的很多代码都是公用的,你为了完成一个功能而去修改某行代码,完全有可能因此而导致另一个功能无法正常工作。
  所以,当项目比较庞大的时候,一般都应该去编写测试用例的。如果我们给项目的每一项功能都编写了测试用例,每当修改或新增任何功能之后,就将所有的测试用例都跑一遍,只要有任何测试用例没有通过,就说明修改或新增的这个功能影响到现有功能了,这样就可以及早地发现问题,避免事故的出现。
  一、目录介绍

  目录结构
  mian:项目代码;
  androidTest:编写Android测试用例使用;
  test:编写Java测试用例使用,如果所写的测试代码没有使用android sdk(android.*下的代码),那么可以在test目录下新建测试用例;
  二、运行我们的测试用例
  Android Studio 本身就是支持Android单元测试的,我用的是 AS2.2.3 版本,它甚至无需像之前的版本那样需要进行繁琐的配置。

  Android Studio 2.2.3 版本
  (1)编写测试用例
  这里我们首先进入到Java的测试类当中:

  Java单元测试类
  其中“assertEquals(4, 2 + 2);”是用来断言4和2+2是否是相等的语句,我们先不做改变。
  点击14行左侧的按钮,然后选择第一项运行:

  运行测试用例
  这时观察到底部Run面板显示为绿色横条,表示为运行测试成功:

  底部Run面板
  然后我们把“assertEquals(4, 2 + 2);”改为“assertEquals(4, 5);”。
  按照刚才的步骤运行测试用例:

  运行测试用例
  由于 4 和 5 是不相等的,那么断言失败,所以Run面板中显示出红色并表示出了错误的原因。
  到这里我们自然就明白了测试用例是什么,测试用例其实就是一段普通的程序代码,通常是带有期望的运行结果的,测试者可以根据最终的运行结果来判断程序是否能正常工作。
  那么单元测试又是什么呢?单元测试是指对软件中最小的功能模块进行测试,如果软件的每一个单元都能通过测试,说明代码的健壮性已经非常好了。下面我们就一起来进行一下Android的单元测试。
  (2)单元测试
  首先在 MainActivity 中编写 androidTest() 方法,该方法用于向集合 testList 中添加不重复的 int 值,并返回此时 testList 的大小:
  待测试方法:

  待测试方法
  然后在 ExampleInstrumentedTest 测试类中进行断言测试:

  断言测试
  此时运行测试用例:

  运行测试用例
  发现没有异常情况抛出,说明测试通过。
  不过,现在这个单元测试其实只是覆盖了很少的情况而已,我们应该再编写一些特殊情况下的断言,看看程序是不是仍然能够正常工作。
  修改 ExampleInstrumentedTest 中的代码,如下所示:

  特殊情况下的断言
  可以看到,这里我们又调用了一次 androidTest() 方法来添加int值到 testList 中,并且添加的仍然还是2。连续添加两次相同int值,这应该算是一种比较特殊的情况了。这时我们觉得 androidTest() 有能力去过滤掉重复的数据,因此在断言的时候认为目前
  androidTest() 中的testList大小仍然是 3。
  重新运行一遍测试用例,结果如图:

  特殊情况下断言运行结果
  很遗憾,测试用例没有通过。从这个测试用例中我们发现, androidTest() 方法中的代码原来是不够健壮的,这个时候就应该对代码进行优化了。
  修改 androidTest() 中的代码,如下所示:

  androidTest()修改后
  这里我们在 androidTest()方法中加入了一个 if 判断,只有当集合中不包含传入的int值的时候才会将它添加到集合中,这样就可以解决掉int值重复的 bug 了。
  现在重新运行一遍测试用例:

  重新运行测试用例
  你就会发现测试又能成功通过了。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号