Android开发经验谈Android技术知识Android开发

【测试】- Android单元测试初探

2020-05-22  本文已影响0人  拔萝卜占坑

简介

最近重新开始学习了一下,Android的单元测试,以前都是马马虎虎看了看,觉得用处不大,还要写代码,麻烦。最近动手去写了一些单元测试,在有些情况下,相比通过安装App,界面操作来测试要方便,快捷很多。特别是项目复杂的时候。

其实很多开发者都知道单元测量,也能写一些简单的单元测试,但是就我工作以来,很少,基本没有看到项目中有编写单元测试的。因为编写额外的代码,麻烦,加上不熟悉,就更加不想写了。我以前也是这种想法,但是最近的接触,然后觉得,做单元测试还是很有必要的。

举例

缺点

缺点当然就是要编写额外的测试代码,如果业务逻辑有改动,测试代码也得相应改动,存在后期维护,还有一点点的学习成本。不过总得来说,还是利大于弊的。

参考

studio_test
training_testing
android-testing-templates

单元测试

单元测试可以直接在业务代码的module下编写代码,也可以专门建一个单元测试module。

业务module下做单元测试

我们在新建module的时候,Android Studio会在资源目录src下生成“androidTest”和“test”两个目录,并且有生成一个简单的单元测试文件。单元测试需要的相应依赖也会配置好。你只需要在文件中编写测试代码即可。

单独的测试module

我们可以像创建lib库那样,给需要测试的工程创建一个用于单元测试的module。

在build.gradle中指定需要被测试的module: targetProjectPath ':app'。

android:targetPackage 指定需要被测试module的包名,targetProjectPath这是module在工程中的路径。

测试相关配置

具体字段的意思,可以参考官网。

android {
    compileSdkVersion app.compileSdkVersion
    defaultConfig {
        minSdkVersion 26
        targetSdkVersion app.targetSdkVersion
        testApplicationId "com.pds.test.${project.name}"
        testHandleProfiling true
        testFunctionalTest true
        testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
        // 配置需要被测试的工程,和settings.gradle名字一致
        targetProjectPath ':app'
        javaCompileOptions {annotationProcessorOptions {includeCompileClasspath = true}}}
    testOptions {
        reportDir "$rootDir/test_app/test-reports"
        resultsDir "$rootDir/test_app/test-results"
        // 要仅为本地单元测试指定选项,请配置 testOptions {} 中的 unitTests {} 代码块。
        unitTests {
            // 如果您的测试依赖于资源 默认情况下,Android Studio 3.4 及更高版本提供编译版本的资源。
            includeAndroidResources = true
            all {
                jvmArgs '-XX:MaxPermSize=256m'
                if (it.name == 'test_app') {systemProperty 'debug', 'true'}
            }
        }
    }
    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
}
基础依赖
dependencies {
    implementation 'androidx.test:rules:1.2.0'
    implementation 'androidx.test:runner:1.2.0'
    implementation 'org.hamcrest:hamcrest-core:1.3'
    implementation 'androidx.test.ext:junit:1.1.1'
    implementation 'androidx.test.ext:truth:1.2.0'
    implementation 'com.google.truth:truth:0.42'
}

实战

monkeyrunner

monkeyrunner 工具提供了一个 API,用于编写可从 Android 代码外部控制 Android 设备或模拟器的程序。使用 monkeyrunner,您可以编写一个 Python 程序,以便安装 Android 应用或测试软件包,运行它,向其发送按键,截取其界面的屏幕截图,并将屏幕截图存储到工作站中。monkeyrunner 工具主要用于在功能/框架级测试应用和设备以及运行单元测试套件,但您也可以自由地将其用于其他目的。参考:monkeyrunner

用python编写测试脚本,然后用monkeyrunner工具运行。

monkeyrunner可执行文件存在于sdk/tools/bin目录下,编写好的python脚本用monkeyrunner命令执行,例如: monkeyrunner monkey.py。单独执行python文件是不行的,没法导入python中用到的Java库。

扩展

之所以可以在python里面写Java,需要Jython库的支持,我们可以在工程中导入该库,那么我们就可以用Java代码执行python脚本。python脚本里面编写Java代码。

上一篇 下一篇

猜你喜欢

热点阅读