UI测试用例未显示代码覆盖率

27

我有一些使用XCTestCase类编写的测试,并且我想计算代码覆盖率。对于常规测试,它在我的机器人中很好地显示,但是对于 UI 测试始终为 0%。

最简单的测试:

import XCTest

class FAQUITests: XCTestCase {

    let app = XCUIApplication()        
    override func setUp() {
        super.setUp()
        app.launch()
    }

    func openFaqView() {
        app.navigationBars["NavigationBar"].buttons["FAQ"].tap()
    }

    func testFaq() {
        openFaqView()
        app.tables.cells.elementBoundByIndex(0).tap()
    }        

}

这肯定应该显示一些测试覆盖率,但事实并非如此。我已经在我的机器人代码中启用了覆盖率:

输入图像描述

结果是:

输入图像描述

仍然是0%。

Xcode 7.2 (7C68)

编辑: 示例项目:https://Kettu@bitbucket.org/Kettu/so_34718699.git


啊,抱歉。从你的原话来看,好像你期望它在截图中显示:D - Fogmeister
1
据我所了解,无法记录 UI 测试的代码覆盖率,因为它们不是在源代码级别上执行的。 - dasdom
嗯,@dasdom,这听起来很合理。谢谢你指出这一点。 - Jakub
我认为实际问题在于,在 UI 测试期间,应用程序不仅启动一次,而是多次启动。这样很难记录正确的覆盖范围(包括分支)。必须实现一些智能合并,并且每次运行后应用程序必须正常退出。我们以前在 Xcode 版本和 UIAutomation 中也遇到过类似的问题。我认为这对于 Xcode 开发人员来说是低优先级的任务。我们甚至还没有一种从 Xcode 获取 Swift 应用程序覆盖信息的方法。它只显示在 UI 中。 - Sulthan
2个回答

2

检查测试计划中是否启用了“收集覆盖数据”功能。

检查收集覆盖数据


1
如果您只有UI测试目标,就会出现这种情况。添加一个单元测试目标,然后再次运行测试。这次您将看到代码覆盖率。示例目标

enter image description here

UITestcase没有提供覆盖数据,没有单元测试代码。您可以尝试这个方法,在您的Viewcontroller中放置一个按钮,并将IBAction附加到它上面。然后创建UITestcase。通过比较有和没有UITestcases的代码覆盖率,您会看到差异。差异将为您提供UITestcase的代码覆盖率。目前,Xcode不单独提供代码覆盖数据。它依赖于Unit Testcases。
没有UI TestCase的测试覆盖率 with UI Testcase ---使用您的代码 我已经注释掉了您的

func testStepper() {

    let steppersQuery = app.steppers
    steppersQuery.buttons["Increment"].tap()
    steppersQuery.buttons["Decrement"].tap()
}

func testSegmented() {
    app.buttons["Second"].tap()
    app.buttons["Fourth"].tap()
    app.buttons["Third"].tap()
    app.buttons["First"].tap()

}
从TestDemoUITests中得到的结果是这样的without UITesting code
使用您的UITestcase,结果如下with UITestcase
很明显,UITestcase对代码覆盖率有所增加。

4
这不是UI测试的覆盖范围。 - Jakub
当我注释掉UI测试时,这就是结果。 - Arun Balakrishnan
这是我在示例项目中完成的工作,您可以从我的答案中下载。IBAction方法中未显示代码覆盖率。 - Jakub
1
是的,它会触发例如viewDidLoad,因为它启动了屏幕,但这并不适用于被触发的buttonTapped方法。因此,这不是真正的测试覆盖率。请检查我发布的示例项目,并尝试使用UITest测试除viewDidLoad之外的其他方法。 - Jakub
1
仔细查看结果。segmentedControlValueChanged和stepperValueChanged这两种方法是为UITest而调用的,而不是单元测试。因此,在没有UITests的项目中,总体测试覆盖率低于50%,而在有UITests的情况下,测试覆盖率约为80%。因此,UITests的代码覆盖率为80%-50%= 30%。 - Arun Balakrishnan
你是完全正确的。UI测试确实增加了代码覆盖率。刚刚完成了一个样例测试,将代码覆盖率从10.3%提高到28%。 - Abdalrahman Shatou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接