Android 库模块覆盖率的仪器测试

Android instrumentation tests for library module coverage

我继承了一个 android 项目来设置代码覆盖率。我没有为 android 做太多事情,在 gradle 中也几乎没有做太多事情,因此我开始寻找有用的教程。令人惊讶的是,前几个教程非常有帮助,我能够包含 jacoco gradle 插件并启用代码覆盖。使用詹金斯我什至生成了一份覆盖率报告。到目前为止一切看起来都很好。

然而,当我看到报告时,我闻到了一股腥味。测试与覆盖率似乎太小了。进一步调查发现了罪魁祸首。

测试本身更多地是作为功能而不是单元编写的。那没关系。但是,项目库的模块中没有测试。相反,库测试是在 gui 模块中编写的(因为这是使用库的地方)。

因此,尽管大多数库功能都被测试覆盖,但覆盖范围仅为来自 gui 模块的内容。

Project

-- Gui module

---- gui sources

---- all the tests

-- Library module

---- library sources

不,我一直在寻找一个有效的解决方案。不幸的是,我所能找到的只是如何将单元和集成 .exec 测试覆盖率结果合并到一份报告中(或其他基于单元测试的解决方案 - none 其中适用于仪器测试)。

我需要的是基于 Gui 模块测试为来自库模块的源代码生成覆盖率。

当我在这里黑暗中跌跌撞撞时,即使是那样的事情,也有可能吗?

对于阅读本文的任何人...如果您有同样的问题,是时候开始用头撞墙了...

今天我很幸运地偶然发现了这个:https://issuetracker.google.com/issues/37004446#comment12

实际 "problem" 似乎是,库项目是 "always" 发布类型。因此它们不包含 "necessary instrumentation setup"(除非您也为发布启用代码覆盖率,尽管我还没有测试过)。

所以解决方案是在要发布的库中专门启用"debug"构建(如前所述,默认为发布类型):

android { 
        publishNonDefault true 
} 

然后在使用library的工程中,指定一个debugCompile依赖(release编译可以使用"default"release配置):

dependencies { 
        debugCompile project(path: 'library', configuration: 'debug') 
        releaseCompile project('library') 
} 

当然(我认为这是理所当然的),记得为库启用测试覆盖率:

android { 
        buildTypes { 
                debug { 
                        testCoverageEnabled true 
                } 
        } 
}