单元测试,就是对我们写的代码进行最小粒度的测试,可以测试函数的执行情况及运行时间。在新版本的Android Studio中,我们新建一个工程,就会自动生成单元测试目录及自动添加测试框架的依赖。
Android自动化测试和代码覆盖率报告
关于Android单元测试的相关知识,在这里不作讲解,大家可以参考其它文章。代码覆盖率报告是表现单元测试的覆盖情况,这里也不对它的进行阐述。
关于单元测试,需要依赖Junit4框架和AndroidJunit4框架。如果要进行UI相关的测试需要依赖espresso框架。为了模拟一些无法测试的情况,可能还需要依赖mockito框架。关于这些知识,大家可以参考这些文章:

Android单元测试只看这一篇就够了
Mock及Mockito的使用
Android利用Espresso进行UI自动化测试的方法详解
Android代码覆盖率工具的使用

掌握了以上文章中的内容,大家就可以写单元测试了,并且可以生成单元测试覆盖率报告。
通过./gradlew createDebugCoverageReport这个命令,它会自动在各个工程中生成一份覆盖率报告。无法把它们合并在一起。并且必须在各个library工程中写单元测试。这样显示很麻烦。我们期望的是只在app主工程中写单元测试,并且生成的报告包括依赖工程。因为app主工程已经依赖了其它library工程。
想达到这种效果,我们就需要在app主工程的build.gradle文件中加入以下内容

apply plugin: 'com.android.application'
apply plugin: 'jacoco'
jacoco {
    //编译如果出现could not read execution data请修改这个版本号
    toolVersion = "0.8.2"
}
task jacocoTestReport(type: JacocoReport) {
    group = "Reporting"
    description = "Generate Jacoco coverage reports" 
    sourceDirectories = files() //源码
    classDirectories = files() //class字节码
    //定义需要过滤的代码
    def fileFilter = ['**/R.class', '**/R$*.class','**/BuildConfig.*', '**/Manifest*.*','android/**/*.*']
    project.rootProject.allprojects.each { project ->
        if (project.name != "app") { //报告中去除app工程中的代码
            sourceDirectories += files("${project.projectDir}" + "/src/main/java")
            classDirectories += fileTree(dir: "${project.projectDir}" + "/build/intermediates/classes/debug", excludes: fileFilter)
        }
    }
   //build时打印路径
    sourceDirectories.files.each {
        logger.lifecycle(it.path)
    }
    classDirectories.files.each {
        logger.lifecycle(it.path)
    }
//设置ec文件源
    executionData = fileTree(dir: "$buildDir", includes: ["outputs/code-coverage/connected/*.ec"])
    reports {//报告生成目录
        xml.enabled = false
        html.enabled = true
        html.destination file("${buildDir}/reports/allReports")
    }
}

添加配置后,在工程根目录运行命令
./gradlew createDebugCoverageReport
执行此task后就会在xxx/build/outputs/code-coverage/connected路径下生xxx.ec文件。
再执行
./gradlew jacocoTestReport
就会在xxx/build/reports/allReports目录下生成所有工程的单元测试覆盖率报告。

注意,不要忘了在library工程的build.gradle文件中打开覆盖率报告开关:

 buildTypes {
        debug {
            testCoverageEnabled = true
        }
      ...
  }

另外,library工程不要添加任何与单元测试有关的框架和代码。单元测试框架只需要在app主工程中添加即可。

相关文章:

  • 2019-09-03
  • 2022-02-11
  • 2021-12-31
  • 2021-12-21
  • 2021-12-31
  • 2021-02-11
  • 2021-10-07
猜你喜欢
  • 2021-05-22
  • 2022-12-23
  • 2021-12-31
  • 2022-12-23
  • 2022-12-23
  • 2021-10-14
  • 2021-12-21
相关资源
相似解决方案