我正在尝试使用XCTest框架测试我的应用程序。如果某些逻辑条件成立(使用Assert),我希望我的单个测试用例失败。我不希望测试用例中的其余代码运行,因为这可能会导致问题(例如,访问空指针)我还希望测试用例的其余部分正常运行,只有失败的测试被标记为失败。我注意到XCTestCase有一个名为continueAfterFailure的属性。但是,将其设置为YES会导致失败的测试在Assert之后继续执行行,而将其设置为NO会导致其余测试根本不运行。有没有解决这个问题的办法?
b1uwtaje1#
帕斯卡的回答给了我正确实现这一点的想法。当Assert失败时,XCTool现在的行为与OCUnit类似:测试用例的执行立即中止,调用tearDown,并运行下一个测试用例。只需在基类(从XCTestCase类继承的基类)中重写方法invokeTest:
invokeTest
- (void)invokeTest { self.continueAfterFailure = NO; @try { [super invokeTest]; } @finally { self.continueAfterFailure = YES; } }
字符串就是这样!
93ze6v8z2#
最简单的方法是添加:
continueAfterFailure = false
字符串setUp()方法。所以它看起来像这样:
**斯威夫特 *
override func setUp() { super.setUp() continueAfterFailure = false }
型Objective-C**
- (void)setUp { [super setUp]; [self setContinueAfterFailure:NO]; }
型
wmtdaxz33#
一种选择是正常检查条件,如果条件为假,则失败并从测试返回。大概是这样的:
if (!condition) { XCTFail(@"o noes"); return; }
字符串您可以将其 Package 在一个帮助宏中以保持可读性。像Kiwi这样的BDD测试库对于这类事情来说更优雅,因为它们可以更容易地在许多测试之间共享设置,从而减少每个测试的Assert。
rpppsulh4#
我可以使用continueAfterFailure并让其他测试通过以下模式运行:
continueAfterFailure
self.continueAfterFailure = NO; @try { // Perform test code here } @finally { self.continueAfterFailure = YES; }
字符串
tyg4sfes5#
在Swift项目中,我使用了一个helper函数(在我所有测试的共享超类中定义,它本身扩展了XCTestCase):
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()中显式地实现这一点。
fatalError
XCTFail
tearDown
Never
Void
continueAfterFailure == true
self.continueAfterFailure
true
setUp()
5条答案
按热度按时间b1uwtaje1#
帕斯卡的回答给了我正确实现这一点的想法。当Assert失败时,XCTool现在的行为与OCUnit类似:测试用例的执行立即中止,调用tearDown,并运行下一个测试用例。
只需在基类(从XCTestCase类继承的基类)中重写方法
invokeTest
:字符串
就是这样!
93ze6v8z2#
最简单的方法是添加:
字符串
setUp()方法。所以它看起来像这样:
**斯威夫特 *
型
Objective-C**
型
wmtdaxz33#
一种选择是正常检查条件,如果条件为假,则失败并从测试返回。
大概是这样的:
字符串
您可以将其 Package 在一个帮助宏中以保持可读性。
像Kiwi这样的BDD测试库对于这类事情来说更优雅,因为它们可以更容易地在许多测试之间共享设置,从而减少每个测试的Assert。
rpppsulh4#
我可以使用
continueAfterFailure
并让其他测试通过以下模式运行:字符串
tyg4sfes5#
在Swift项目中,我使用了一个helper函数(在我所有测试的共享超类中定义,它本身扩展了
XCTestCase
):字符串
正如注解所示,对
fatalError
的调用实际上从未执行过;XCTFail
以有序的方式中止测试(调用tearDown
,运行下一个测试等)。这个调用只是为了欺骗编译器接受Never
作为返回类型,因为XCTFail
返回Void
(如果continueAfterFailure == true
,它 * 确实 * 返回)。请注意,对于每个测试方法,
self.continueAfterFailure
都重置为默认true
。您也可以在setUp()
中显式地实现这一点。