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

Yoa*_*rtz 19 xcode xctest

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

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

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

这个问题有解决方案吗?谢谢,Yoav

Osc*_*rro 15

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

只需覆盖invokeTest基类中的方法(继承自XCTestCase类的方法):

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

    @try
    {
        [super invokeTest];
    }
    @finally
    {
        self.continueAfterFailure = YES;
    }
}
Run Code Online (Sandbox Code Playgroud)

而已!

  • 很奇怪,但在Xcode 9中不起作用.它仍然在`XCTFail`之后继续执行. (4认同)

nCo*_*d3d 7

最简单的方法是添加:

continueAfterFailure = false
Run Code Online (Sandbox Code Playgroud)

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

迅速

override func setUp() {
    super.setUp()

    continueAfterFailure = false
}
Run Code Online (Sandbox Code Playgroud)

Objective-C的

 - (void)setUp {
    [super setUp];

    [self setContinueAfterFailure:NO];
}
Run Code Online (Sandbox Code Playgroud)

  • 从[Apple文档](https://developer.apple.com/documentation/xctest/xctestcase/1496260-continueafterfailure):"`continueAfterFailure` - 一个布尔值,指示测试用例是否应在发生故障后继续运行." 它仅涉及单个"测试用例",而不是所有可用的测试. (3认同)
  • 在Objective-C中,您应该使用NO而不是FALSE. (2认同)
  • 您还应该在 `tearDown()` 中将 ` continueAfterFailure` 设置为 `true`,否则所有测试将在一次失败后停止。 (2认同)

Chr*_*eux 5

一种选择是正常检查条件,然后失败,如果结果为假,则从测试中返回。

像这样:

if (!condition) {
  XCFail(@"o noes");
  return;
}
Run Code Online (Sandbox Code Playgroud)

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

Kiwi这样的BDD测试库在这种情况下更为优雅,因为它们使在许多测试之间共享设置变得更加容易,从而导致每个测试的断言更少。


Pas*_*que 5

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

self.continueAfterFailure = NO;
@try
{
    // Perform test code here
}
@finally
{
    self.continueAfterFailure = YES;
}
Run Code Online (Sandbox Code Playgroud)