为啥?单元测试覆盖率中显示的类即使没有添加到测试目标中
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
添加到您想要的新目标文件。
在我的示例项目中,我有:AppDelegate
、ViewController
、ViewController2
、ViewController3
、ViewController4
、View
、View2
、View3
、View4
。我添加到新目标:AppDelegate
、ViewController3
、ViewController4
、View3
、View4
所以只有这五个类应该是计算代码覆盖率的基础。
向您的课程添加测试。
代码覆盖率报告仅包含添加到新目标的类。请记住,旧目标可以是您的主要目标 - 新目标只是实现您目标的一种抽象层:“从代码覆盖率报告中删除一些类”。
这是整个项目: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%
为啥使用 jasmine 对 Node typescript 项目进行 Karma 单元测试会显示包含依赖项的覆盖范围?