给app编写测试用例,很多时候我们只是听说过,没写的原因有很多:
- 没时间,业务功能都写不完
- 没心思,Bug都还没修完
- 不知测试用例有啥用
- 不会写App测试用例
- 领导没这个要求
这篇文章我会从测试用例是什么,为什么要写,怎么写来描述一下这些概念
什么是测试用例
测试用例也是代码,业务代码用来实现功能需求;而测试用例用来验证业务代码逻辑是否正确,边缘情况是否考虑周全,新的代码有没有引入Bug,已修复的Bug会不会因为新加的逻辑又复现了。
一般写测试会遵循Given, When, Then三步
- Given: 创建测试需要的环境和状态,以及要测的任务列表.
- When: 运行测试用例,这会运行需要被覆盖的代码.
- Then: 和预期结果比对测试的返回,输出是通过还是失败.
测试用例的好处
Google提倡写测试用例,认为这应该是应用开发过程中必要的一部分。通过持续对应用运行测试,可以在发布应用之前验证其正确性、功能行为和易用性。
测试还会为带来以下好处:
- 快速获得故障反馈。
- 在开发周期中尽早进行故障检测。
- 更安全的代码重构,让你可以优化代码而不用担心bug回归。
- 稳定的开发速度,帮助您最大限度地减轻技术债
Android 测试用例
策略
一个测试用例是否合理,符合预期?一般会从三个维度来衡量:
- 覆盖率:测试用例可以覆盖多少行代码,覆盖多少种边缘Case
- 速度:运行这个测试用例需要花费多少计算资源和持续多少时间,可能是几毫秒到几分钟
- 拟真度:运行过程中的环境和数据是否真实产生还是mock,一般拟真度越高,速度越慢,这需要一个权衡
分类
测逻辑的用例我们希望它能快速运行;测环境因素的,会希望它尽量符合真实环境等。根据测试用例的侧重点不同一般会把测试用例分为下面三种:
- 单元测试(Unit test):速度快,拟真度低,测试单个类的单个方法的一种Case
- 集成测试(Integration test):速度稍慢,可以验证几个类之间的逻辑
- 终端测试(E2e):拟真度高,但一般需要在终端上运行所以速度比较慢
分别对应Android测试代码里的@SmallTest,@MediumTest,@LargeTest,一般推荐的比例是7:2:1。@SmallTest 在android 工程的test目录下,其它两种需要依赖Android环境,放在androidTest目录下。
写一个SmallTest
我们需要测试覆盖的大部分场景都是业务逻辑代码,这些代码我们会内聚在一个个类里,比如XXViewModel或者mvp的present。写个测试用例来验证ViewModel逻辑和LiveData。
1 |
|
写一个MediumTest
1 |
|
依赖
1 | // Dependencies for local unit tests |
总结
现实中我们总是沉迷于业务代码。测试用例的重要性很多时候只在理论中。通过两周的实践,有以下体验:
- 写合格的测试用例很有挑战:你需要需要快速学习Test工具怎么用,发散的逆向思维来Mock边界,类似周伯通双手互搏术。
- 测试用例很有价值:比如登录模块,支付模块,当你把所有异常情况都用测试用例覆盖了,你会觉得很稳,代码重构也会很有底气。监控出一个遗漏Case,补一个测试用例,会觉得更稳了。
- 测试用例对代码思维提升:写几个测试用例后,你
会不自觉开始审视自己写的代码逻辑,对架构也会开始有想法。因为烂代码是特别难写测试用例的。这样良性循环,代码越来越科学,测试用例也越来越健壮。