您的位置:首页 > 移动开发 > Android开发

在Android中同时使用unit test和instrument test作为单元测试

2017-05-15 14:07 555 查看
转载:http://www.jianshu.com/p/4b03123b4f81


前言

作为开发人员,我们需要编写必要的单元测试以验证程序的稳定性,而且单元测试也可以用来验证重构的结果。

Android官方现在提供了两种测试途径Android Unit Test 和Android Instrument Test。本篇主要介绍他们各自的运行方式,测试结果和测试覆盖率结果生成方式,以及在项目中如何同时使用它们。

Android Unit Test: 脱离emulator和device独立运行在jvm的测试方式。如果想mock更多的Android元件则必须需要Robolectric框架支持,但是测试用例的行为都是运行在Robolectric所建立的仿真Android运行环境中,例如mock packageManager,camera支持的返回信息。

Android Instrument Test: 它是运行在emulator和device上的测试方式,测试用例中所有的行为都是经过android framework验证的,主要的第三方框架支持为Espresso和Robotium。

两种测试方式可以同时在项目中使用,Android Unit Test负责逻辑验证,Android Instrument Test负责验证在真实环境下的逻辑执行(smoke test就够了)。


使用的工具

Android Studio 1.5

Android gradle plugin 1.5.0


Instrument Test 集成(Android新建项目自带)

在项目中使用Instrument Test是Android的默认方式。
默认的测试代码路径为androidTest文件夹。(没有的话,直接建立该文件夹即可)



Instrument Test 默认路径

Android Studio中为什么我的测试类没有绿色背景而且无法运行?

因为现在Android Studio只支持选择一种测试方式进行运行,所以需要切换到对应的测试方式(Test Artifact)。



Android Studio切换测试方式

gradle对应的task启动方式: connectedAndroidTest (没有其他flavor的话,其实connectedDebugAndroidTest也是一样的。)
gradle clean connectedDebugAndroidTest




Gradle task 一览

测试结果存放路径
ProjectRoot\app\build\outputs\androidTest-results\connected


测试覆盖率结果

Android gradle plugin已经默认集成了jacoco来记录InstrumentTest的测试覆盖率,你只需要添加以下属性至app/build.gradle中就可以生成覆盖率结果。当你运行测试的gradle task时,它会自动生成。
testCoverageEnabled true


例子:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
testCoverageEnabled true
}
}


结果文件会在以下文件夹
ProjectRoot\app\build\reports\coverage



Unit Test 集成(Android Studio 1.5建立项目时也自带了)

默认的测试代码路径为test文件夹。(没有的话,直接建立该文件夹即可)



切换到Unit Test模式

gradle对应的task启动方式: test (没有其他flavor的话,其实testDebugUnitTest也是一样的。)
gradle clean testDebugUnitTest


测试结果存放路径
ProjectRoot\app\build\test-results\


测试覆盖率结果

我们需要手动添加jacoco插件来生成UnitTest的测试覆盖率报告,在app/build.gradle中加入以下片段
apply plugin: 'jacoco'

jacoco {
toolVersion = "0.7.1.201405082137"
}

def coverageSourceDirs = [
'../app/src/main/java'
]

task jacocoTestReport(type:JacocoReport, dependsOn: "testDebugUnitTest") {
group = "Reporting"

description = "Generate Jacoco coverage reports"

classDirectories = fileTree(
dir: '../app/build/intermediates/classes/debug',
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/BuildConfig.*',
'**/Manifest*.*']
)

additionalSourceDirs = files(coverageSourceDirs)
sourceDirectories = files(coverageSourceDirs)
executionData = files('../app/build/jacoco/testDebugUnitTest.exec')

reports {
xml.enabled = true
html.enabled = true
}

}


然后运行时请使用 "jacocoTestReport" gradle task
gradle clean testDebugUnitTest jacocoTestReport


生成的覆盖率结果会在以下文件夹中
ProjectRoot\app\build\reports\jacoco\jacocoTestReport



同时运行UnitTest和InstrumentTest

只能运行在命令行中

Android Studio中只能切换测试模式同时运行其中一种,但是命令行则可以同时运行两种测试模式。
gradle clean connectedDebugAndroidTest testDebugUnitTest


同时运行后测试结果

测试结果文件路径不会改变,依然分开存放在build文件夹中
ProjectRoot\app\build\outputs\androidTest-results\connected  // instrument test result folder
ProjectRoot\app\build\test-results\  //unit test result folder


测试覆盖率结果

我们讲使用UnitTest的jacoco插件来合并InstumentTest的测试覆盖率结果,然后得到合并后的测试覆盖率。 我们需要修改一下 "jacocoTestReport" gradle task中executionData这个属性
executionData = files('../app/build/jacoco/testDebugUnitTest.exec’, '../app/build/outputs/code-coverage/connected/coverage.ec')


并在运行时请使用 "jacocoTestReport" gradle task
gradle clean connectedDebugAndroidTest testDebugUnitTest jacocoTestReport


测试结果的存放路径为
ProjectRoot\app\build\reports\jacoco\jacocoTestReport



按照以上方法,我们就可以使用对应的gradle task在命令行中同时跑UnitTest和InstrumentTest了。谢谢阅读!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐