为什么? Class 显示在单元测试覆盖率中,即使未添加到测试目标中

Why? Class showing in Unit test coverage Even though not added in test targets

我有一些 UIView class 正在覆盖范围内。我没有在单元测试目标下添加它们。既不在单元测试中也不在 UI 单元测试中。但仍然显示那些文件。

我不知道它们是否包含在测试范围内。

问:如何将它们从单元测试覆盖范围中移除? 问:它们是否涉及单元测试覆盖率分数?

Class 包含在单元测试覆盖率中:

Class未添加到测试目标中:

我认为您的问题与收集所有目标的代码覆盖率有关。

  1. 创建新目标 - 您可以复制现有目标。

  1. 主机应用程序更改为全新的目标。

  1. 将您的测试方案设置更改为新目标作为代码覆盖源。请看截图:

  1. 记得添加到你的测试文件中@testable import UnitTestExampleCodeCoverage
  2. 添加到您想要的新目标文件中。 在我的示例项目中,我有:AppDelegateViewControllerViewController2ViewController3ViewController4ViewView2View3View4。我添加到新目标:AppDelegateViewController3ViewController4View3View4 所以只有这五个 类 应该是计算代码的基础报道。

  3. 为您的 类 添加测试。

  4. 代码覆盖率报告仅包含 类 添加到新目标 。请记住,旧目标可以是您的主要目标 - 新目标只是实现您目标的一种抽象层:"remove some classes from code coverage report".

这是整个项目:https://github.com/mStaruchowicz/SO55723759

测试愉快 ;)

当您在项目中激活覆盖时,目标中的所有文件都将计算覆盖。

我推荐你使用XCOV: https://github.com/nakiostudio/xcov

您可以 运行 覆盖并放置您忽略的文件以提高正确覆盖率。

@Sandy,回答你的问题:

How we can remove them from unit test coverage?

从 Xcode 10.2 开始,无法从测试覆盖率报告中排除文件。

Are they involve in unit test coverage score?

是的。所有文件占总覆盖率%。

如果您想计算不考虑某些文件的测试覆盖率分数,最好的机会是编写脚本来解析 xccov 输出。

我找不到任何关于如何与之交互的官方文档,但 this post 是一个很好的起点。

如果您想要可自定义的 UT 覆盖率报告,您可以在其中忽略您想要的文件,Slather 可能是最好的工具。

您可以通过在 ignore 选项下配置 .slather.yml 文件中的文件来忽略覆盖率计算中的文件。

请查找详细信息here如何忽略。

单元测试时运行,

  • 您的应用已启动
  • 测试被注入并且运行

问题是应用程序启动会启动您的正常序列,创建视图并可能启动一些网络调用。这不仅会干扰代码覆盖率报告——它可能会毒害您的单元测试。例如,如果您通过让单元测试触发通知来测试通知,您需要知道侦听该通知的唯一对象是由测试创建的,而不是在应用程序启动时出现的。

另一个忽略某些文件覆盖率的问题是:您将如何查看这些文件的单元测试覆盖率?

解决方案是使用几乎不执行任何操作的不同应用委托进行测试。