【问题标题】:How to obtain code coverage with Xamarin MvvmCross?如何使用 Xamarin MvvmCross 获得代码覆盖率?
【发布时间】:2018-12-12 16:59:47
【问题描述】:

tl;博士

嗨!我试图找出我们的 Xamarin 应用程序 (Xamarin.Android) 的代码覆盖率是多少,该应用程序是使用 MvvmCross 和 Visual Studio Community 2017 在 Windows 10 中开发的。

说明

我们已经尝试过两次了:

  • 我们第一次创建 MSTest 项目时,我们能够在 Visual Studio 的测试资源管理器中运行,还可以使用 SonnarQube 导出输出。尽管我们可以检查我们的代码重复、错误、漏洞和代码异味,但 SonarQube 根本不会报告代码覆盖率。

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

看起来我们遇到的最佳解决方案是使用 NUnitLite 运行程序将测试编译成可执行文件,然后使用日志分析器、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)。当我们运行第一个命令时,它会返回测试结果,但也会报错:

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

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

那么,考虑到我们根本不倾向于购买企业版软件,是否有任何方法可以找出 Xamarin MvvmCross 项目的代码覆盖率?如果可以,怎么做?

【问题讨论】:

  • 现在我正在尝试安装单声道,并在 Ubuntu 应用程序中再次进行第二次尝试(从 Microsoft Store 下载并安装)。我会不断更新这篇文章。
  • Mono 安装在 Ubuntu Bash 中并正常工作。 mprof-report 也可以。只是按照问题中提到的链接的尝试,它以人类可读的形式生成了输出文件,但报告没有覆盖任何行。看起来它忽略了我的解决方案,只考虑了测试项目,但它是依赖项。我现在将调整 covfilter 命名空间。
  • 好的,看起来covfilter 中声明的命名空间没有问题。相反,当我在 Ubuntu 中运行第一个 Mono 命令时,它会引发异常:System.TypeInitializationException : The type initializer for 'AutoMapper.Mappers.FlagsEnumMapper' threw an exception. ----> System.MissingMethodException : Method 'Array.Empty' not found.。在 Windows 中运行完全相同的 Mono 命令时不会发生这种情况。我现在就调查一下。
  • 好的,看来是安装的Mono版本有问题。通过apt-get安装的是4.2.1,但最新的是5.16.0。我继续尝试另一种方法,并安装了 OpenCover 来替代 Mono。但是现在,它只考虑我的解决方案中的测试项目,而不考虑解决方案中的任何其他程序集(使用 Mono 的最后一次尝试至少会考虑测试调用的第一行,然后应用程序会因异常而崩溃).. .

标签: c# xamarin mono code-coverage mvvmcross


【解决方案1】:

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

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

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

  • 安装 NUnit、NUnitLite、NUnit3TestAdapter、OpenCover 和 ReportGenerator(全部通过 NuGet,直接从 Visual Studio 安装)
  • Convert MSTest to NUnit
  • Build tests into an executable console application with NUnitLite
  • *将应用程序解决方案中每个项目(Droid 项目和您拥有的任何测试项目除外)中的buildOptions 中的debugType 从“便携式”更改为“完整”:转到项目属性 -> 构建。然后,在Output Section上点击Advanced并选择Debugging Information -> Change to Full。 (Thanks, m4ss1m0g!)
  • 现在,运行 OpenCover 和 ReportGenerator 命令(或下面修改后的 .bat 脚本),将覆盖率报告生成为人类可读的 .htm 文件。用您的浏览器打开 .htm 文件,然后 - 瞧 - 您的报道被报告了!

这是我使用的简单脚本,我将它放在解决方案的根文件夹中(注意 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. 上述过程的第三步(标有 *)是确保您的测试可执行文件考虑您的其他项目(除了您的测试项目)的关键。

【讨论】:

    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2013-08-20
    • 2020-02-26
    • 2021-01-24
    相关资源
    最近更新 更多