XCTestフレームワークを使用してアプリケーションをテストしようとしています。
(アサーションを使用して)何らかの論理条件が満たされた場合、単一のテストケースが失敗するようにします。これにより問題が発生する可能性があるため(たとえば、nullポインターへのアクセス)、テストケースの残りのコードを実行したくありません。残りのテストケースも正常に実行し、失敗したテストのみを実行します。失敗としてマークされます。
XCTestCaseにcontinueAfterFailureというプロパティがあることに気づきました。ただし、これをYESに設定すると、失敗したテストでアサーション後に行の実行が続行され、NOに設定すると残りのテストがまったく実行されなくなります。
この問題の解決策はありますか?
パスカルの答えは私にこれを適切に達成するという考えを与えました。 XCToolは、アサーションが失敗したときにOCUnitのように動作するようになりました。テストケースの実行はすぐに中止され、tearDownが呼び出され、次のテストケースが実行されます。
基本クラス(XCTestCaseクラスから継承するクラス)のメソッドinvokeTest
をオーバーライドするだけです。
- (void)invokeTest
{
self.continueAfterFailure = NO;
@try
{
[super invokeTest];
}
@finally
{
self.continueAfterFailure = YES;
}
}
それでおしまい!
最も簡単な方法は、以下を追加することです。
continueAfterFailure = false
setUp()メソッドに。したがって、次のようになります。
スウィフト
override func setUp() {
super.setUp()
continueAfterFailure = false
}
Objective-C
- (void)setUp {
[super setUp];
[self setContinueAfterFailure:NO];
}
1つのオプションは、通常の状態をチェックし、それが失敗した場合、テストがfalseの場合はテストから戻ることです。
このようなもの:
if (!condition) {
XCFail(@"o noes");
return;
}
これをヘルパーマクロでラップして、読みやすさを維持することができます。
Kiwi のようなBDDテストライブラリは、多くのテスト間でセットアップを共有しやすくなり、テストごとのアサーションが少なくなるため、この種の場合にはよりエレガントです。
私はcontinueAfterFailure
を使用でき、このパターンを使用して他のテストを実行できます。
self.continueAfterFailure = NO;
@try
{
// Perform test code here
}
@finally
{
self.continueAfterFailure = YES;
}