为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕桂英546537 2022-06-12 10:48:16
你好!我试图找出在 Windows 10 中使用 MvvmCross 和 Visual Studio Community 2017 开发的 Xamarin 应用程序 (Xamarin.Android) 的代码覆盖率。描述我们已经尝试过两次:我们第一次创建了一个 MSTest 项目,我们能够在 Visual Studio 的测试资源管理器中运行,还可以使用 SonnarQube 导出输出。尽管我们可以检查我们的代码重复、错误、漏洞和代码气味,但 SonarQube 根本不会报告代码覆盖率。我们意识到这是因为 Xamarin 项目使用 .NET Standard 而不是 .NET Framework,而 SonarQube 仅支持 .NET Framework。然后我们找到了这个带有 Mac 解决方案的链接,我引用了这个链接:看起来我们遇到的最佳解决方案是使用 NUnitLite 运行程序将测试编译成可执行文件,然后使用日志分析器、mprof-report 和 ReportGenerator 生成最终的 html 文件:例如mono --debug --profile=log:coverage,covfilter=+MyNamespace,covfilter=-NotMyNamespace,output=coverage.mlpd MyTests.exe --noresultmprof-report --reports=coverage --coverage-out=coverage.xml coverage.mlpdmono ./packages/ReportGenerator.2.5.6/tools/ReportGenerator.exe -reports:coverage.xml -targetdir:reportfirefox ./report/index.htm所以我们将我们的测试项目转换为使用 NUnit。我们能够使用 NUnit.Adapter 将 NUnit 附加到 Visual Studio,我们能够从中生成可执行文件并从二进制安装程序 (*.msi) 安装 Mono for Windows (x64)。当我们运行第一个命令时,它会返回测试结果,但也会给出错误:在主可执行文件中找不到“日志”分析器,也无法从“单分析器日志”加载它。因此,没有覆盖输出。事实上,似乎也没有mprof-report安装,即使在 Mono 命令提示符中也是如此。那么,考虑到我们绝不倾向于购买企业版软件,有什么方法可以找出我们的 Xamarin MvvmCross 项目的代码覆盖率是多少?如果是这样,怎么办?
查看完整描述

1 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

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

此外,它不包括 Droid 项目。但是当我们使用 MVVM 时,Droid 项目应该只包含视图、资源和绑定(理想情况下)。所以,在我看来,覆盖它并不像其他项目(AppCore、服务等)那么重要......

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

  • 安装 NUnit、NUnitLite、NUnit3TestAdapter、OpenCover 和 ReportGenerator(全部通过 NuGet,直接从 Visual Studio 安装)

  • 将 MSTest 转换为 NUnit

  • 使用 NUnitLite 将测试构建到可执行的控制台应用程序中

  • *将应用程序解决方案debugTypebuildOptions的每个项目(Droid 项目和您拥有的任何测试项目除外)从“便携式”更改为“完整”:转到Project Properties -> Build。然后,在输出部分单击Advanced并选择Debugging Information -> Change to Full。(谢谢,m4ss1m0g!

  • 现在,运行 OpenCover 和 ReportGenerator 命令(或下面修改过的 .bat 脚本),将覆盖率报告生成为人类可读的 .htm 文件。用您的浏览器打开 .htm 文件,然后 - 瞧 - 您的报道被报告了!

这是我使用的简单脚本,我将其放在解决方案的根文件夹中(注意OpenCover 和 ReportGenerator 包的版本,以及使用的所有路径您还可以使用 OpenCover 放置过滤器以排除或包含任何命名空间、类和你想要的方法)。

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 脚本并导航到输出覆盖率所在的文件夹.htm 生成。

  2. 上述过程中的第三步(标有 *)是确保您的测试可执行文件考虑除您的测试项目之外的其他项目的关键。


查看完整回答
反对 回复 2022-06-12
  • 1 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信