我正在尝试使用XCTest框架测试我的应用程序。
如果某个逻辑条件成立(使用断言),我希望我的单个测试用例失败。 我不希望测试用例中的其余代码运行,因为这可能会导致问题(例如,访问空指针) 我还希望测试用例的其余部分正常运行,并将失败的测试标记为失败。
我注意到XCTestCase有一个名为continueAfterFailure的属性。 但是,将其设置为YES会导致失败的测试在断言后继续执行行,并将其设置为NO导致其余测试根本不运行。
这个问题有解决方案吗? 谢谢, 约阿夫
答案 0 :(得分:14)
简单地覆盖基类中的方法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()
中明确说明。