农行 DevOps 进行时之最佳实践分享:实现 .net web 单元测试代码覆盖率统计
单元测试代码覆盖率是软件测试中的一个度量指标,是衡量程序中源代码被测的比例和程度,DevOps 标准中需要项目单元测试代码覆盖率和接口覆盖率达到一定的比例。农行个人网银评级项目基于本行自研 EBF 框架开发,属于C#技术栈,在 DevOps 评估过程中单元测试覆盖率这个能力项上,项目组结合自身系统实际,探索出了适用该系统的单元测试代码覆盖率收集工具,分别实现了依赖IIS部署.net下web开发项目的单元测试、接口测代码覆盖率数据采集和基于 RunTime 的单元测试代码覆盖率收集。

一、依赖IIS部署.net下web开发项目的单元测试、接口测代码覆盖率数据采集

VisualStudio2015企业版中提供了单元测试及代码覆盖率收集工具。开发人员在安装有 VisualStudio2015企业版的开发机器上运行单元测试的时候,可以很方便地分析单元测试的代码覆盖率的情况,不需要进行特殊的配置。但运行在 IIS 中的 ASP.NET 下 Web 应用程序,在程序运行期间去收集代码覆盖率的时候,需要 TFS 生成流水线中使用命令行工具做单独的配置。我行个人网银项目组总结出最佳实践,详细配置如下:
1、利用 VS 内置的代码覆盖率收集工具,通过打开 IIS 测试覆盖率和关闭 IIS 测试覆盖率命令行的方式完成调用及TFS集成,将命令行的执行调用放在TFS生成定义的Agent的任务中执行。
农行 DevOps 进行时之最佳实践分享:实现 .net web 单元测试代码覆盖率统计
2、对覆盖率的结果文件进行格式转换,导出为TFS支持的格式,并将下图覆盖率结果上传到TFS配置库中。
3、最终收集到覆盖率数据文件,可以直接映射到本地,用户可在VS中查看详细信息。
农行 DevOps 进行时之最佳实践分享:实现 .net web 单元测试代码覆盖率统计
4、选择本机的源码路径以后,展示效果如下。
农行 DevOps 进行时之最佳实践分享:实现 .net web 单元测试代码覆盖率统计
5、用户也可以通过下载html报告文件方式查看覆盖率报告。
农行 DevOps 进行时之最佳实践分享:实现 .net web 单元测试代码覆盖率统计
利用这种方式开展的测试,好处是对于系统是无侵入的,不需要优化系统架构。但是对于提升单元测试代码覆盖率难度大,一方面是对于环境的依赖要求比较高,另一方面是对于单元测试的案例编写要求比较高,在短时间内很难提升系统单元测试覆盖率。项目组继续深入探索,优化了系统架构,采用了基于RunTime的单元测试案例编写,并配置了相应的基于RunTime的单元测试代码覆盖率收集流水线。

二、基于RunTime的单元测试代码覆盖率收集

个人网银系统使用自研的 .net 框架 EBF 进行开发,EBF 框架采用模板和配置的思想,将交易分为 Action-Operation-OpStep 三层,单元测试主要针对 opstep 等类的方法和函数进行测试,针对EBF依赖上下文传递数据的特点,扩展现有 EBF 功能,以C#单元测试框架 VSTest 为基础,通过构建测试上下文环境以及虚拟 EBF 依赖的配置、服务机制,实现基于 runtime 的测试框架,能够实现对 Opstep、DAO、工具类、辅助类的测试目标。
农行 DevOps 进行时之最佳实践分享:实现 .net web 单元测试代码覆盖率统计
2.1、项目组扩展了现有EBF功能,新增并封装了动态库Ebf.Test.dll。
2.2、添加ContextHandler及EbfTestContext用于构建上下文,EbfHandler用于初始化EBF框架;
2.3、通过VSTest技术,构建AbstractBaseUnitTest抽象类,针对继承类的单元测试用例,读取输入输出配置,
2.4、编写单元测试用例,构造opstep固定的参数context,利用反射的机制执行对应的opstep,并将返回结果与预期输入进行匹配,得出测试用例结果。
优化后的单元测试代码覆盖率流水线配置如下:
农行 DevOps 进行时之最佳实践分享:实现 .net web 单元测试代码覆盖率统计
通过测试方案模板自动生成单元测试用例代码,然后通过人工填充单元测试用例,这种基于RunTime的单元测试方案,方便开发者在短时间内快速提升单元测试覆盖率,让编写单元测试变得更加简单,让开发人员渐渐爱上编写单元测试用例,从而在系统早起就能够发现一些编码问题。美中不足就是对于系统有侵入,需要项目组投入精力优化系统自身的架构设计,但是这种一劳永逸的升级,付出点成本也是值得的。

作者简介


陈辉,中国农业银行个人网银系统 DevOps 技术经理,从事个人网银开发工作多年,负责个人网银 DevOps 三级贯标工作,具备扎实的 DevOps 领域实践经验。
李靖,中国农业银行研发中心 DevOps 建设流水线组成员,负责 DevOps 流水线沟通协调工作,具备丰富的DevOps流水线建设和支持经验。


2020年11月27日,由云计算开源联盟指导,由高效运维社区和开放运维联盟联合主办的 2020 GOPS 全球运维大会 · 上海站上,隆重发布了 DevOps 标准持续交付部分第九批评估结果,中国农业银行手机存款贷款模块顺利通过由中国信通院开展的《研发运营一体化(DevOps)能力成熟度持续交付3级评估。DevOps 标准共分 5 级,持续交付部分如果能达到 3 级已经是国内领先水准,这代表着中国农业银行在参评项目的持续交付能力达到国内领先水平。这是中国农业银行在 6 月 19 日同时 5 个项目通过持续交付标准评估之后通过的第 6 个项目。
农行 DevOps 进行时之最佳实践分享:实现 .net web 单元测试代码覆盖率统计
中国农业银行通过 DevOps 标准持续交付部分的 3 级评估的项目,分别是:

  • 信贷中台项目
  • 个人网银项目
  • 分布式应用互联平台(AIR)项目
  • 增值税进项税管理项目
  • 金融小店项目
  • 手机银行存款贷款业务