web-dev-qa-db-ja.com

XCTestCaseがassertで失敗し、テストの実行は続行されないが、他のテストは停止されない

XCTestフレームワークを使用してアプリケーションをテストしようとしています。

(アサーションを使用して)何らかの論理条件が満たされた場合、単一のテストケースが失敗するようにします。これにより問題が発生する可能性があるため(たとえば、nullポインターへのアクセス)、テストケースの残りのコードを実行したくありません。残りのテストケースも正常に実行し、失敗したテストのみを実行します。失敗としてマークされます。

XCTestCaseにcontinueAfterFailureというプロパティがあることに気づきました。ただし、これをYESに設定すると、失敗したテストでアサーション後に行の実行が続行され、NOに設定すると残りのテストがまったく実行されなくなります。

この問題の解決策はありますか?

19
Yoav Schwartz

パスカルの答えは私にこれを適切に達成するという考えを与えました。 XCToolは、アサーションが失敗したときにOCUnitのように動作するようになりました。テストケースの実行はすぐに中止され、tearDownが呼び出され、次のテストケースが実行されます。

基本クラス(XCTestCaseクラスから継承するクラス)のメソッドinvokeTestをオーバーライドするだけです。

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

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

それでおしまい!

14
Oscar Hierro

最も簡単な方法は、以下を追加することです。

continueAfterFailure = false

setUp()メソッドに。したがって、次のようになります。

スウィフト

override func setUp() {
    super.setUp()

    continueAfterFailure = false
}

Objective-C

 - (void)setUp {
    [super setUp];

    [self setContinueAfterFailure:NO];
}
7
nCod3d

1つのオプションは、通常の状態をチェックし、それが失敗した場合、テストがfalseの場合はテストから戻ることです。

このようなもの:

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

これをヘルパーマクロでラップして、読みやすさを維持することができます。

Kiwi のようなBDDテストライブラリは、多くのテスト間でセットアップを共有しやすくなり、テストごとのアサーションが少なくなるため、この種の場合にはよりエレガントです。

5
Chris Devereux

私はcontinueAfterFailureを使用でき、このパターンを使用して他のテストを実行できます。

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