Xcode 7 次测试未 运行 但报告成功

Xcode 7 Tests don't run but reports success

我正在尝试向我的项目添加一个测试目标,但是当我 运行 测试时,似乎没有执行实际测试,而是 Xcode 总是报告成功,但是指示测试是否通过的小方块仍然清晰。

我只有一个测试目标和一个class:

@implementation Tests

- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

- (void)testExample {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
    XCTAssert(false, "");
}

- (void)testPerformanceExample {
    XCTAssert(false, "");
}

@end

测试应该会失败,但会显示一个提示成功的弹出窗口。另外,测试报告说没有测试。

如果我尝试 运行 单独测试 "succeed" 但我没有得到有关报告的任何信息并且方块仍然是空的。

有什么解决办法吗?

如果您正在为 iOS 构建,您通常会在物理设备上将 Xcode 设置为 运行 吗?如果是这样,请尝试在 iOS 模拟器上将其设置为 运行。

我发现如果您在物理设备上将 Xcode 7 设置为 7,则单元测试的行为将与您描述的完全一致。在 iOS 模拟器上临时将 Xcode 设置为 运行 以进行单元测试解决了这个问题,现在它就像一个魅力。

我希望这可以帮助 运行遇到同样问题的任何人。 :D

关闭 iOS 设备,然后重新打开。您可能还需要拔下 USB 电缆并重新连接,以便 Xcode 可以重新建立与设备的通信。当这发生在我身上时,测试会立即报告测试成功,而测试永远不会 运行。我还注意到,当我尝试记录一个新的 UI 测试操作时,Xcode 每次都会崩溃 - 类似于我第一次启用 iOS 之前它的行为方式设置 - 开发人员 - 启用 UI 自动化设置,我记得当启用此功能时需要 iOS 设备重启,所以我尝试 iOS 设备重启并且 Xcode 再次开始运行,我可以记录和 运行 在我的 iOS 设备上测试成功。完全披露:在我重新启动 iOS 设备之前,我还打开和关闭启用 UI 自动化,但我怀疑是否需要这样做。 -rh

如果这是为了 UI 自动化测试,那么可能是因为您没有初始化应用程序并启动它。

XCUIApplication *app = [[XCUIApplication alloc] init];
[app launch];

我遇到了同样的问题,清理构建文件夹即可解决。但是,还有一种更快的方法是 Product -> Perform Action -> Test Without Building

检查控制台 (Command-Shift-Y)。

在我的例子中,打印的输出表明为什么测试不是 运行。 (动态框架的飞行前检查失败。)但是我没有看到它,因为调试区域被折叠了。

另外,在我的情况下,问题已通过将 $(PROJECT_DIR)/Carthage/Build/iOS 添加到我的运行时搜索路径来解决,如 here

所述

对于遇到此问题的任何其他人,请检查以确保您的测试 class 继承自 XCTestCase 而不是 XCTest。我疯狂地尝试所有这些解决方案,直到我意识到我是从错误的 class 继承的。 Xcode 不会抱怨,它只会说没有 运行 测试成功。希望这对某人有帮助。

值得一提的是 Xcode 仅运行以 'test' 开头的 XCTestCase 函数。这与其他平台相反,当我开始使用 Xcode.

进行测试时,这让我感到困惑

这样做的原因是您可以在测试 class 内部使用一些方便有用的方法,您不一定想将其称为测试本身。

在下面的测试中class:

class MyBigTest: XCTestCase {

    func testSensibleInputReturnSensibleAnswer() {
        XCTAssert(/* stuff */)
    }

    func setupSomeKindOfData() {
        // does some data setup here
    }

}

只有 testSensibleInputReturnSensibleAnswer() 会被测试套件调用。 setupSomeKindOfData() 函数可能有一些共享的设置逻辑,许多测试函数将调用这些逻辑。

此外,有些人喜欢用 _ 格式化他们的测试方法名称,以使其更具可读性。例如:test_sensibleAnswer_sensibleResult().

老问题,但在我的案例中解决它的事情已经在这里提到了:

您不能(总是?)重命名测试 classes / cases。创建一个新的 class / case 并丢弃旧的。

FWIW 我在使用 KIF beforeAll 时也遇到了非常相似的问题。有时 beforeAll 中的代码无法正常工作,但测试仍然会 return 成功。

它有时也会使 Xcode 崩溃。请参阅 KIF Github 页面 here。尽管有些人指出问题可能不是因为 KIF,而是因为 XCTest 本身

临时解决方案是避免使用 beforeAll 而是使用 beforeEach

我将测试方法标记为 private,为我解决的只是删除 private 访问修饰符。

创建时我运行遇到这种情况Objective-C测试class与现有Swift同名class。

只需重命名一个测试文件