一、测试金字塔
- 小型测试是指单元测试,用于验证应用的行为,一次验证一个类。
- 中型测试是指集成测试,用于验证模块内堆栈级别之间的交互或相关模块之间的交互。
- 大型测试是指端到端测试,用于验证跨越了应用的多个模块的用户操作流程。
沿着金字塔逐级向上,从小型测试到大型测试,各类测试的保真度逐级提高,但维护和调试工作所需的执行时间和工作量也逐级增加。因此,编写的单元测试应多于集成测试,集成测试应多于端到端测试。虽然各类测试的比例可能会因应用的用例不同而异,但我们通常建议各类测试所占比例如下:小型测试占 70%,中型测试占 20%,大型测试占 10%。
按照测试金字塔模型以及投入/产出比,我们可以得知越向下回报率越高,所以应该使用大量的单元测试和全面的接口测试来覆盖产品提供的基本逻辑和功能,使用少量的集成(UI)测试来进行前端界面的功能验证。其中,单元测试的成本最小,也更容易发现问题。
二、工程结构介绍
- 用于执行测试用例指令的 app-debug.apk;
- 用于执行测试用例的 app-debug-androidTest.apk;
- 将来可采用application module的方式,新增其它的测试业务,将测试用例模块与测试业务模块拆分,减少对业务模块代码的污染;
src下有3个文件目录:
- androidTest — android单元测试或UI测试源码目录,需运行在模拟器或真机;
- main — 接收和执行测试指令的源码目录,运行在模拟器或真机;
- test — java单元测试源码目录,也可通过mock或Robolectric技术执行android单元测试,运行在JVM;
src目录结构树如下:
三、开发测试用例
1.测试环境配置
在module gralde中,添加如下配置项。
1) 配置依赖项
2) 配置测试运行器
2.构建测试目录
插桩单元测试的用例代码,需要放在module_name/src/androidTest[VariantName]/java/ 目录下。
一般在新建工程时,AS默认会自动创建这些目录 。 当然也可以手动创建:选择任意一个源代码方法,调出创建新测试的窗口(ctrl+shift+T),如下图:
点击进入“Create Test”对话框,然后选择Destination Package栏的“...”来选择包结构。如下图:
点击“OK”之后,会生成相应的测试目录。
3.编写测试用例
使用AndroidX Test API+JUni4编写测试用例。插桩单元测试类应该是一个 JUnit 4 测试类。
- 常用注解
@Test:将一个方法标记为测试方法,被@Test注解的方法不允许有参数,且返回值需为void ;
@Ignore:忽略一个测试方法,在运行类测试时,被此注解标记的方法将不被执行;
@Before:在每一个被@Test标记的方法之前运行;
@After:在每一个被@Test标记的方法之后执行;
@BeforeClass:在所有测试方法之前执行,被注解的方法必须是public static;
@AfterClass:在所有测试方法之后执行,被注解的方法必须是public static ;
@Rule:方法级规则,在每个测试方法执行时都会被调用;
@ClassRule :Class级规则,在测试类被执行时调用,只调用一次;
- 使用断言
推荐使用Google的Truth断言。
- 测试类命名规则
类名+Test 或者 类名+InstrumentedTest。例如:
对于接口类,如果接口类名的字母I开头,其测试类名开头不用包含字母I。
四、运行测试用例
1.编译
使用build task进行编译时,如果project中有超过1个的application module,则编译module时,需指定module名。命令格式如下:
$./gradelw :moduleName:taskName
例如:
$./gradlew :app:build
可用./gradlew projects查看module名。例如:
2.安装
使用install task进行安装。命令格式如下:
$./gradelw :moduleName:install+variantName
例如:
$./gradlew :app:installDebugAndroidTest
3.运行
使用connected task进行测试,命令格式如下:
$./gradlew connectedAndroidTest
或者使用adb命令启动测试。命令格式如下:
$adb shell am instrument [flags] <test_package>/<runner_class>
如果在app的gradle文件中,没有另行指定test_package,在app的package_name后追加.test即可。例如:
$adb shell am instrument -w
com.example.junitframework.test/androidx.test.runner.AndroidJUnitRunner
详情参考gradle官方文档和Android Studio官方文档。
五、查看测试报告
1.生成测试报告
1) 使用gradle
./gradlew :module_name:connectedVariantNameAndroidTest
$./gradlew :app:cAT //cATconnectedAndroidTest
module_name/build/reports/androidTests/connected.html
https://developer.android.google.cn/studio/test/command-line#RunTestsGradle
2) 使用adb
Usage:
adb shell am instrument [flags] <test_package>/<runner_class>
eg:
$adb shell am instrument -w com.example.junitframework.test/androidx.test.runner.AndroidJUnitRunner
2.查看测试报告
1) xml格式
https://github.com/272664150/QJunitFramework
2) html格式