最近在做接口测试,想通过代码覆盖率来判断一下接口用例是否缺失,但是每次通过命令来生成覆盖率报告,感觉太麻烦,所以就想着把jacoco集成到测试工具平台中,只需要点几个按钮,就能查看到覆盖率报告。
测试工具平台中只要添加一个页面即可,关键是实现下面流程的代码。
实现流程:
这里搭建了一个django服务,分别实现代码下载和编译、获取exec文件、生成报告、获取报告地址,
1 def compileCode(request): 2 3 result =JacocoModel.objects(index=request.GET['index']).first() 4 projectName=result.projectName 5 logger.debug("开始生成覆盖率的服务:"+projectName) 6 res=impl_compile_code(request) 7 return HttpResponse(res+"服务编译完成") 8 9 10 def generateExec(request): 11 result = JacocoModel.objects(index=request.GET['index']).first() 12 projectName = result.projectName 13 logger.debug("开始生成exec的服务:" + projectName) 14 res = impl_generate_exec(request) 15 return HttpResponse(res + "的jacoco的exec生成完成") 16 17 def generateReport(request): 18 result = JacocoModel.objects(index=request.GET['index']).first() 19 projectName = result.projectName 20 logger.debug("开始生成report的服务:" + projectName) 21 res = impl_generate_report(request) 22 return HttpResponse(res + "的report生成完成") 23 24 def viewReport(request): 25 result = JacocoModel.objects(index=request.GET['index']).first() 26 projectName = result.projectName 27 logger.debug("获取report地址的服务:" + projectName) 28 res = impl_generate_view(request) 29 return HttpResponse(res)
其中数据保存在mongodb中,结构如下
下面是代码下载和编译的具体实现
1 def impl_compile_code(request): 2 3 logger.debug("获取index对应的信息") 4 result = JacocoModel.objects(index=request.GET['index']).first() 5 JacocoModel.objects(index=request.GET['index']).update(set__compileStatus='0') 6 JacocoModel.objects(index=request.GET['index']).update(set__execStatus='0') 7 JacocoModel.objects(index=request.GET['index']).update(set__reportStatus='0') 8 projectName = result.projectName 9 gitUrl = result.gitUrl 10 branchName=result.branchName 11 12 14 15 logger.debug('服务名:' + projectName) 16 logger.debug('gitUrl:' + gitUrl) 17 18 logger.debug("准备下载代码") 19 logger.debug("删除上一次代码--开始") 20 dirpath=BaseImpl.jacocofile 21 deldircmd=''.join(['cd ',dirpath,' && rm -rf ',projectName]) 22 logger.debug("执行命令:"+deldircmd) 23 baseImpl.printCmdLog(createCmd([deldircmd])()) 24 logger.debug("删除上一次代码--结束") 25 26 logger.debug("下载代码--开始") 27 clonecmd=''.join(['cd ',dirpath,' && git clone ',gitUrl]) 28 logger.debug("执行命令:" + clonecmd) 29 baseImpl.printCmdLog(createCmd([clonecmd])()) 30 logger.debug("下载代码--结束") 31 32 logger.debug("切换代码分支--开始") 33 switchBranchcmd=''.join(['cd ',dirpath,projectName,' && git checkout ',branchName]) 34 logger.debug("执行命令:" + switchBranchcmd) 35 baseImpl.printCmdLog(createCmd([switchBranchcmd])()) 36 logger.debug("切换代码分支--结束") 37 38 logger.debug("编译代码-开始") 39 compilecmd=''.join(['cd ',dirpath,projectName,' && mvn compile']) 40 logger.debug("编译代码命令:"+compilecmd) 41 pl=createCmd([compilecmd])() 42 logger.debug("编译代码-结束") 43 44 flag=baseImpl.checkBuildStatus(pl) 45 JacocoModel.objects(index=request.GET['index']).update(set__compileStatus=flag) 46 return result.projectName
服务器的相关操作都是通过命令行实现,基于python的subprocess库,下面是执行命令的工具方法
1 def createCmd(cmdList): 2 def _createCmd(): 3 pl = [] 4 for cmd in cmdList: 5 p=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 6 p.wait() 7 pl.append(p) 8 return pl 9 return _createCmd
实现了所有方法后,可以将django服务,部署到docker中执行。docker容器中需要包含jacoco、maven、ant、python3、git
最后在生成的报告,放到宿主机上的nginx中,如下:
并在nginx.conf中修改下面的配置,当/usr/local/nginx/data下生成报告内容后,就可以查看报告了
实现结果:
这个Django服务也可以单独使用,使用浏览器访问服务即可,例如下面的获取报告地址