为啥?单元测试覆盖率中显示的类即使没有添加到测试目标中

Posted

技术标签:

【中文标题】为啥?单元测试覆盖率中显示的类即使没有添加到测试目标中【英文标题】:Why? Class showing in Unit test coverage Even though not added in test targets为什么?单元测试覆盖率中显示的类即使没有添加到测试目标中 【发布时间】:2019-04-17 09:01:47 【问题描述】:

尽管如此,我有一些 UIView 类正在被覆盖。我没有在单元测试目标下添加它们。在单元测试和 UI 单元测试中都没有。但仍然显示那些文件。

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

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

单元测试覆盖率中包含的类:

未在测试目标中添加的类:

【问题讨论】:

【参考方案1】:

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

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

    Host Application 更改为全新的目标。

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

    记得添加到你的测试文件@testable import UnitTestExampleCodeCoverage

    添加到您想要的新目标文件。 在我的示例项目中,我有:AppDelegateViewControllerViewController2ViewController3ViewController4ViewView2View3View4。我添加到新目标:AppDelegateViewController3ViewController4View3View4 所以只有这五个类应该是计算代码覆盖率的基础。

    向您的课程添加测试。

    代码覆盖率报告仅包含添加到新目标的类。请记住,旧目标可以是您的主要目标 - 新目标只是实现您目标的一种抽象层:“从代码覆盖率报告中删除一些类”。

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

测试愉快;)

【讨论】:

是的,如果我只选择项目目标,仍然会在测试中添加那些 UIView 文件。 没错,但您可以管理您的目标,例如再添加一个以仅将类保留到测试中并基于计算代码覆盖率。 但这不会给出明确的报告,因为这些是特定于文件而不是项目目标的。不是吗? 为什么不清楚?您的目标是让您的项目的代码覆盖率排除一些基于类的UIView,对吗?因此,您可以创建新目标,该目标仅包含用于计算代码覆盖率的类。然后,您只需为代码覆盖率设置适当的目标,如屏幕截图所示。 @Sandy 我添加了更多关于如何实现您的目标的信息。希望现在一切都清楚了:)【参考方案2】:

您好@Sandy,回答您的问题:

我们如何将它们从单元测试覆盖率中移除?

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

它们是否涉及单元测试覆盖率分数?

是的。所有文件都占总覆盖率的百分比。

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

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

【讨论】:

xcov 用于排除忽略文件的覆盖率。最新的 xcov 有这个问题吗?【参考方案3】:

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

我建议您使用 XCOV: https://github.com/nakiostudio/xcov

您可以运行覆盖并放置您忽略的文件以改进正确的覆盖。

【讨论】:

【参考方案4】:

如果您想要可自定义的 UT 覆盖率报告,您可以忽略所需的文件,Slather 可能是一个最佳工具。

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

请详细了解here如何忽略。

【讨论】:

【参考方案5】:

当单元测试运行时,

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

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

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

解决方案是使用不同的应用委托进行几乎什么都不做的测试。

【讨论】:

以上是关于为啥?单元测试覆盖率中显示的类即使没有添加到测试目标中的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使单元测试全部通过,我的代码覆盖率也为零?

即使我添加了测试单元,sonarqube 的覆盖率也始终为 0%

Xcode 4:为啥我不能将头文件添加到单元测试目标?

为啥使用 jasmine 对 Node typescript 项目进行 Karma 单元测试会显示包含依赖项的覆盖范围?

为啥基于 jest 的单元测试现在会导致 0% 的测试覆盖率?

到底为啥要写单元测试