在没有测试继续运行但没有停止其他测试的情况下,断言XCTestCase失败

时间:2014-01-08 14:45:42

标签: xcode xctest

我正在尝试使用XCTest框架测试我的应用程序。

如果某个逻辑条件成立(使用断言),我希望我的单个测试用例失败。 我不希望测试用例中的其余代码运行,因为这可能会导致问题(例如,访问空指针) 我还希望测试用例的其余部分正常运行,并将失败的测试标记为失败。

我注意到XCTestCase有一个名为continueAfterFailure的属性。 但是,将其设置为YES会导致失败的测试在断言后继续执行行,并将其设置为NO导致其余测试根本不运行。

这个问题有解决方案吗? 谢谢, 约阿夫

5 个答案:

答案 0 :(得分:14)

帕斯卡的答案给了我正确实现这一目标的想法。当断言失败时,XCTool现在表现得像OCUnit:测试用例的执行立即中止,tearDown被调用,下一个测试用例被运行。

简单地覆盖基类中的方法invokeTest(继承自XCTestCase类的方法):

- (void)invokeTest
{
    self.continueAfterFailure = NO;

    @try
    {
        [super invokeTest];
    }
    @finally
    {
        self.continueAfterFailure = YES;
    }
}

那就是它!

答案 1 :(得分:7)

最简单的方法是添加:

continueAfterFailure = false

进入setUp()方法。所以它看起来像这样:

<强>夫特

override func setUp() {
    super.setUp()

    continueAfterFailure = false
}

<强>目标C

 - (void)setUp {
    [super setUp];

    [self setContinueAfterFailure:NO];
}

答案 2 :(得分:5)

一种选择是正常检查条件,然后失败并从测试返回,如果它是假的。

这样的事情:

if (!condition) {
  XCFail(@"o noes");
  return;
}

您可以将其包装在辅助宏中以保持可读性。

Kiwi这样的BDD测试库对于这类事情来说更加优雅,因为它们可以更容易地在许多测试之间共享设置,从而减少每次测试的断言。

答案 3 :(得分:4)

我可以使用continueAfterFailure并使用此模式运行其他测试:

self.continueAfterFailure = NO;
@try
{
    // Perform test code here
}
@finally
{
    self.continueAfterFailure = YES;
}

答案 4 :(得分:0)

在Swift项目中,我使用了一个辅助函数(在我所有测试的共享超类中定义,它本身扩展了XCTestCase):

/// Like `XCTFail(...)` but aborts the test.
func XCTAbortTest(_ message: String, 
                  file: StaticString = #file, line: UInt = #line
                 ) -> Never {
    self.continueAfterFailure = false
    XCTFail(message, file: file, line: line)
    fatalError("never reached")
}

正如评论所暗示的,对fatalError的调用从未实际执行过; XCTFail以有序的方式中止测试(tearDown被调用,下一次测试运行等)。调用只是为了欺骗编译器接受Never作为返回类型,因为XCTFail返回Void(如果continueAfterFailure == true,它 返回)。

请注意,self.continueAfterFailure会针对每种测试方法重置为默认true。您也可以在setUp()中明确说明。