XCTests 过早取消

Posted

技术标签:

【中文标题】XCTests 过早取消【英文标题】:XCTests canceling prematurely 【发布时间】:2018-12-06 01:30:57 【问题描述】:

我正在使用 XCTests 在 Xcode 中运行一些单元测试。当我运行它们时,所有测试要么通过,要么失败,并显示绿色小勾号或红色十字。 主要问题似乎是我的测试过早取消并且没有正常运行。

这里有更多信息:

    运行测试时,没有任何控制台输出,这在以前没有发生过。我的意思是我之前确实有预期的控制台输出,现在我没有。 运行测试时,不需要我解锁 iPhone 即可运行应用程序。此外,即使我的 iPhone 已解锁,它也不会像以前那样运行应用程序。

    运行我的测试时,它完成编译,然后很快在 Xcode 的信息栏中显示“正在取消...”(在您构建项目时显示警告和“正在构建”的顶部和居中条) .

    我使用的是 .xcworkspace 文件(因为我使用的是 Pod)

    我有一个构建方案,即项目。 我遇到了同样的问题,另外还有绿色检查和红叉在运行后没有出现在我的测试中的问题,有时我的测试根本没有出现在测试选项卡中。我通过删除 Podfile.lock 文件、Pods 目录和 .xcworkspace 目录,然后运行 ​​Pod install 来解决这些问题。这样做后,我遇到了同样的问题,除了这两个问题。 我尝试在不同的分支上运行新的测试,同样的问题。

    在遇到任何这些问题之前,我只是在编写测​​试并尝试不同的编写测试方法。我已恢复所有这些更改,但仍然出现这些错误。

    在没有模拟器的情况下运行测试时,我也发现了同样的问题。

    当我从 Xcode 编译和运行应用程序时,它运行良好。

任何关于如何解决这个问题的建议都会很棒!如果需要,请询问更多详细信息。

这是我运行测试的视频。我建立了一个新项目和新的单元测试目标来展示发生了什么。 注意:里面有一个空测试,一个应该总是通过的测试:

如您所见,问题在于测试运行不正常。绿色和红色十字不再出现,本应始终通过的测试失败,没有控制台输出,并且在顶部信息栏中几乎立即显示“正在取消...”。 任何关于为什么会发生这种取消的建议都会很棒!

以下是代码设置的一些截图:

这也是代码(这只是创建新单元测试后的基本代码,除了我添加了一个应该始终通过的断言):

import XCTest
@testable import example

class exampleTests: XCTestCase 

    override func setUp() 
        // Put setup code here. This method is called before the invocation of each test method in the class.
    

    override func tearDown() 
        // Put teardown code here. This method is called after the invocation of each test method in the class.
    

    func testExample() 
        // This is an example of a functional test case.
        // Use XCTAssert and related functions to verify your tests produce the correct results.
        XCTAssertTrue(true)
    

    func testPerformanceExample() 
        // This is an example of a performance test case.
        self.measure 
            // Put the code you want to measure the time of here.
        
    

编辑:

所以,按照@CPR 的建议,我在模拟器上再次尝试,错误基本上都消失了。我在物理设备上再次尝试,但错误仍然存​​在注意:我之前在模拟器上尝试过,得到了同样的错误。从那以后我没有改变任何东西,所以我不确定为什么它现在起作用了。这是在 sim 上运行测试的控制台输出(不确定这是否有帮助,但无论如何我都会添加它):

Test Suite 'All tests' started at 2018-12-06 03:59:53.045
Test Suite 'exampleTests.xctest' started at 2018-12-06 03:59:53.046
Test Suite 'exampleTests' started at 2018-12-06 03:59:53.046
Test Case '-[exampleTests.exampleTests testExample]' started.
Test Case '-[exampleTests.exampleTests testExample]' passed (0.001 seconds).
Test Case '-[exampleTests.exampleTests testPerformanceExample]' started.
/Users/akashkundu/Documents/example/exampleTests/exampleTests.swift:30: Test Case '-[exampleTests.exampleTests testPerformanceExample]' measured [Time, seconds] average: 0.000, relative standard deviation: 115.251%, values: [0.000004, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001, 0.000001], performanceMetricID:com.apple.XCTPerformanceMetric_WallClockTime, baselineName: "", baselineAverage: , maxPercentRegression: 10.000%, maxPercentRelativeStandardDeviation: 10.000%, maxRegression: 0.100, maxStandardDeviation: 0.100
Test Case '-[exampleTests.exampleTests testPerformanceExample]' passed (0.348 seconds).
Test Suite 'exampleTests' passed at 2018-12-06 03:59:53.396.
     Executed 2 tests, with 0 failures (0 unexpected) in 0.348 (0.350) seconds
Test Suite 'exampleTests.xctest' passed at 2018-12-06 03:59:53.396.
     Executed 2 tests, with 0 failures (0 unexpected) in 0.348 (0.350) seconds
Test Suite 'All tests' passed at 2018-12-06 03:59:53.397.
     Executed 2 tests, with 0 failures (0 unexpected) in 0.348 (0.351) seconds 

谁能解释为什么在物理设备上运行测试会导致这些错误?

编辑:

这是@CPR 发现的 Xcode 中“消息”选项卡中的错误/日志消息:

这是文本中的错误/日志代码:

example.app encountered an error (Failed to establish communication with the test runner. (Underlying error: Unable to connect to test manager on 8b441d96d063b3b6abf55b06115441d160e85e67. (Underlying error: kAMDMuxConnectError: Could not connect to the device.)))

----------------------------------------------- ------------------------------------

解决方案:

感谢@CPR,解决方案是只需重启设备。另一个经验教训是使用“消息”标签查看日志和错误,这是“断点”标签旁边最右边的标签。

他的完整答案here。

【问题讨论】:

您是否尝试在测试中设置断点以查看它们是否被命中?也可以在模拟器而不是您的设备上尝试,看看是否有任何变化。 我想我过去在我的项目中遇到代码签名问题时也看到过类似的事情。您的证书设置正确吗?您有有效的 Apple 开发者帐号吗?这也可能是电缆问题(如果您使用的是无线调试,则可能是网络连接问题)。再次向您提出同样的问题:当您在设备上运行它时,您是否看到断点被击中?其他代码(不是测试)是否在设备上成功运行? Xcode 的“消息”视图中也应该有一些日志显示构建输出。在设备上运行时,您在此处看到任何内容吗?您可以尝试通过 Apple 开发人员门户创建新的配置文件/证书,以防问题与配置文件相关。 你试过重启设备了吗? @CPR 重新启动它,一切运行顺利。很好,“打开和关闭”。非常感谢! 【参考方案1】:

问题已在 cmets 中解决。对于未来的读者,如果遇到类似问题,请检查以下几点:

    检查 Xcode 消息选项卡以查找构建错误。 酌情重启设备/模拟器。 这解决了这种情况下的问题。 在设备/模拟器上卸载/重新安装应用程序。 证书/配置文件是否有效?尝试生成新的并重新运行。 它可以在模拟器上运行吗?如果是,这可能是设备本身的问题。 运行代码时是否遇到断点?如果是,那么这是一个测试失败。如果不是,则问题甚至在测试运行之前就发生了(就像这里的情况一样)。

【讨论】:

以上是关于XCTests 过早取消的主要内容,如果未能解决你的问题,请参考以下文章

在 XCTests 中使用 AFHTTPRequestOperation

为啥我应该使用单独的测试目标来运行 XCTests,我应该怎么做?

单例不使用 XCTests - iOS

在运行 XCTests 时访问主应用程序包

我应该重构以便能够使用 XCTests 进行模拟吗?

多种产品的可重复使用 XCTests