如何使用MvvmCross获得代码覆盖率?

时间:2018-12-12 16:59:47

标签: c# xamarin mono code-coverage mvvmcross

tl; dr

嗨!我试图找出在Windows 10中使用MvvmCross和Visual Studio Community 2017在 Windows 中开发的Xamarin应用程序(Xamarin.Android)的代码覆盖范围。

说明

我们已经尝试过两次:

  • 我们第一次创建一个MSTest项目,在其中我们可以在Visual Studio的Test Explorer中运行,还可以使用SonnarQube导出输出。尽管我们可以检查代码重复,错误,漏洞和代码气味,但SonarQube根本不报告代码覆盖率。

我们意识到这是因为Xamarin项目使用.NET Standard而不是.NET Framework,而SonarQube仅支持.NET Framework。然后我们发现this link带有Mac的解决方案,我引用:

  

我们遇到的最好的解决方案似乎是使用NUnitLiteRunner将测试编译为可执行文件,然后使用日志分析器,mprof-report和ReportGenerator生成最终的html文件:

     

例如

     

mono --debug --profile=log:coverage,covfilter=+MyNamespace,covfilter=-NotMyNamespace,output=coverage.mlpd MyTests.exe --noresult

     

mprof-report --reports=coverage --coverage-out=coverage.xml coverage.mlpd

     

mono ./packages/ReportGenerator.2.5.6/tools/ReportGenerator.exe -reports:coverage.xml -targetdir:report

     

firefox ./report/index.htm

  • 因此,我们将测试项目转换为使用NUnit。我们可以使用NUnit.Adapter将NUnit附加到Visual Studio,我们可以从中制作出可执行文件,并通过二进制安装程序(* .msi)安装了Mono for Windows(x64)。当我们运行第一个命令时,它返回测试的结果,但也会给出错误:
  

在主可执行文件中找不到'log'分析器,也无法从'mono-profiler-log'中加载它。

因此,没有覆盖输出。实际上,即使在Mono命令提示符中,似乎也没有安装mprof-report

因此,考虑到我们绝不打算购买企业版软件,有没有办法找出Xamarin MvvmCross项目的代码覆盖范围?如果是这样,怎么办?

1 个答案:

答案 0 :(得分:0)

终于明白了!它绝对不是CI / CD友好的,但它至少可以用来了解MvvmCross Xamarin应用程序中单元测试的当前状态。

此外,它也不涉及Droid项目。但是,当我们使用MVVM时,无论如何(理想情况下),Droid项目都应仅包含视图,资源和绑定。因此,我认为,覆盖它并不像其他项目(AppCore,服务等)那么重要。

无论如何,这就是我所做的:

  • 安装NUnit,NUnitLite,NUnit3TestAdapter,OpenCover和ReportGenerator(所有这些都可以通过NuGet直接从Visual Studio中获得)
  • Convert MSTest to NUnit
  • Build tests into an executable console application with NUnitLite
  • *对于应用程序解决方案中的每个项目(Droid项目和您拥有的任何测试项目除外),将debugType中的buildOptions从“ Portable”更改为“ Full”:转至项目属性-> 构建。然后,在输出部分上,单击高级,然后选择调试信息->更改为完整。 (Thanks, m4ss1m0g!
  • 现在,运行OpenCover和ReportGenerator命令(或下面的修改后的.bat脚本),以将覆盖率报告生成为人类可读的.htm文件。使用浏览器打开.htm文件,然后-voilà-报告了覆盖率!

这是我使用的简单脚本,我将其放置在解决方案的根文件夹中(注意OpenCover和ReportGenerator软件包的版本,以及使用的所有路径You can also place filters with OpenCover to exclude or include any Namespaces, Classes and Methods you want)。

packages\OpenCover.4.6.519\tools\OpenCover.Console.exe -skipautoprops -output:<path-where-you-want-your-xml-results-to-be>\coverage.xml -target:<path-to-your-test-executable-generated-by-NUnitLite> -register:user -filter:"+[*]<your-solution-name>.* -[nunit*]* -[*<your-test-project-name>]*"

packages\ReportGenerator.4.0.4\tools\net47\ReportGenerator.exe -reports:<path-where-your-xml-results-output-are--same-as-output-path-above>\coverage.xml -targetdir:coverage

肥胖

  1. 按照上述步骤操作并确认其有效之后,您可以安装AxoCover VisualStudio扩展程序,该扩展程序提供了一种查看当前代码覆盖率的实用方法,而不必运行上面的.bat脚本并进行导航。到生成输出coverage.htm的文件夹。
  2. 上述过程的第三步(标有*)是确保测试可执行文件考虑测试项目之外的其他项目的关键。