安卓自动化测试入门-1
本文翻译自Riggaroo的《Introduction to Automated Android Testing – Part 1》
注意:以下的测试特指“程序员编写的自动化代码测试”
水平有限,欢迎指教。如有错漏,多多包涵。
我见过许多人对安卓的测试感到困惑与不确定。在过去,对安卓App进行自动化测试是非常困难的,而且也没有多少指导。在这个系列,我将会给你介绍一种简单许多的测试编写方法。这篇博客只是帮你开始进行测试编写,后面的那些将会更加深入地介绍安卓自动化测试。让我们开始吧。
为什么我们需要自动化测试?
鉴于你已经开始阅读这篇博客,你可能并不是真的需要一个理由。下面是一些我为什么喜欢写单元测试的原因。
- 测试能强迫你去多考虑一些不同的情况,并在不知不觉中让你的代码更加干净。
- 如果你编写了测试,你会对自己的代码更有信心。
- 闪亮的绿色状态条及详细标明你的代码有多少被覆盖的酷炫报告是编写测试的美味果实。
- 回归测试将更容易完成,因为自动化测试将第一个把bug挑出来。
对我来说,回归测试的好处是最大的。如果你重构了代码并且通过了测试,你就会很自信没有损坏之前的任何功能。唯一的问题是编写测试的好处并不会立即呈现,只有数个月后当你需要重构时,才能体会测试的真正美好。
安卓有几种类型的测试?
单元测试
单元测试一般是重复执行可能的最小功能代码,可以是一个方法,一个类或者一个组件。
用于单元测试的工具:
UI测试 - Instrumentation测试
一个UI测试或Instrumentation测试模拟各种典型的用户与App的交互行为。例如点击按钮、输入文本,这些行为UI测试都可以做到。
用于UI测试的工具:
- Espresso - 用于一个App内的测试,选择子项,确保某些东西可见。
- UIAutomator - 用于测试不同App之间的交互行为。
还有一些工具适合用于此类测试,例如Robotium, Appium, Calabash, Robolectric。
在编写自动化测试之前,需要做些什么?
为了能让你对你的App编写自动化测试,你应该遵循一些架构模式以便使你的App整洁容易测试。一种容易编写测试的架构是用于View层的Model View Presenter(MVP)与用于网络及数据库访问的Repository Pattern(仓库模式)。
当然,这并不是作为一个安卓工程师的你的唯一的选择,仅仅只是你为了让测试覆盖到尽可能多的代码并使代码简洁干净而探索的一种途径。
我发现如果没有一个清晰定义的结构,那么就非常难以编写测试。写出来的测试经常是没有用的,又不知道去测试什么。而且在一个大型的App里面,想要提高代码覆盖率也是非常困难的。当依赖生产环境的服务器时,我的UI测试也不够可靠。希望我们能在这一系列的博客中解答这些疑难。
用一种便于测试的方式构建你的App
下面的图描述了我这一系列博客中用于演示的App的架构:
- Views(视图层) - Activities 和 Fragments。这是我们设置文本及改变UI的地方。我比较喜欢将Android特有的代码约束在这一层,并尽量不将context传递到view以外,显然这不容易做到,但是这是一个值得尽力去遵守的指导。Views层应该只和presenters交互。
- Presenters(主持层) - 这是业务逻辑所在的地方,它决定什么应该被视图显示出来。Presenters从Repositories获取信息并传递给Views。尽量避免将Android特有的代码放到Presenter里面,因为这样会使单元测试变得更加困难。
- Repositories(仓库层) - 决定从哪里获取数据,是从本地持久化数据库?还是从网络?Repositories只与Presenters交互。
- Models(模型层) - 典型POJO,用于Presenters与Views之间传递信息。
单元测试用于测试Presenters跟Repositories。UI测试用于从Views到Repositories的一系列代码。
还有许多优秀的文章描述了MVP和其它架构。本系列博客并不会深入架构细节。想阅读更多不同的Android架构的文章,请点击这里,这里,还有这里。
自动化测试会放在我的App的哪个位置?
在你的App文件夹结构中,有两个文件夹会存放测试代码:test
和 androidTest
。
androidTest
- Android Instrumentation 测试位于这个文件夹。这里的测试需要运行在模拟器或者真机。
test
- 单元测试位于这个文件夹。单元测试只需要运行在本地机器的JVM即可,无需Android模拟器或真机。这意味着它们并不需要访问Android的类(例如Context
类)。
现在我们明白了不同类型的测试代码及它们的摆放位置。下一篇博客将会深入讲解如何架构你的代码,以便更好地编写单元测试。
下一篇 Part2原文地址