Tips3 编写测试用例

作者: 常思行 | 来源:发表于2018-06-01 14:58 被阅读69次

    当你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);”是用来断言42+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 了。
    • 现在重新运行一遍测试用例:

      重新运行测试用例
      你就会发现测试又能成功通过了。

    之后你可以不断地补充新的测试用例,并让程序永远都可以跑通所有的测试用例,这样的程序才会更加健壮,出现 bug 的概率也会更小。

    感谢优秀的你跋山涉水看到了这里,欢迎关注下让我们永远在一起!

    相关文章

      网友评论

      本文标题:Tips3 编写测试用例

      本文链接:https://www.haomeiwen.com/subject/dicksftx.html