xcode 使用assert使XCTestCase失败,但测试没有继续运行,也没有停止其他测试

kse8i1jr  于 2023-08-07  发布在  其他
关注(0)|答案(5)|浏览(120)

我正在尝试使用XCTest框架测试我的应用程序。
如果某些逻辑条件成立(使用Assert),我希望我的单个测试用例失败。我不希望测试用例中的其余代码运行,因为这可能会导致问题(例如,访问空指针)我还希望测试用例的其余部分正常运行,只有失败的测试被标记为失败。
我注意到XCTestCase有一个名为continueAfterFailure的属性。但是,将其设置为YES会导致失败的测试在Assert之后继续执行行,而将其设置为NO会导致其余测试根本不运行。
有没有解决这个问题的办法?

b1uwtaje

b1uwtaje1#

帕斯卡的回答给了我正确实现这一点的想法。当Assert失败时,XCTool现在的行为与OCUnit类似:测试用例的执行立即中止,调用tearDown,并运行下一个测试用例。
只需在基类(从XCTestCase类继承的基类)中重写方法invokeTest

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

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

字符串
就是这样!

93ze6v8z

93ze6v8z2#

最简单的方法是添加:

continueAfterFailure = false

字符串
setUp()方法。所以它看起来像这样:

**斯威夫特 *

override func setUp() {
    super.setUp()

    continueAfterFailure = false
}


Objective-C**

- (void)setUp {
    [super setUp];

    [self setContinueAfterFailure:NO];
}

wmtdaxz3

wmtdaxz33#

一种选择是正常检查条件,如果条件为假,则失败并从测试返回。
大概是这样的:

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

字符串
您可以将其 Package 在一个帮助宏中以保持可读性。
Kiwi这样的BDD测试库对于这类事情来说更优雅,因为它们可以更容易地在许多测试之间共享设置,从而减少每个测试的Assert。

rpppsulh

rpppsulh4#

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

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

字符串

tyg4sfes

tyg4sfes5#

在Swift项目中,我使用了一个helper函数(在我所有测试的共享超类中定义,它本身扩展了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()中显式地实现这一点。

相关问题