2014-01-08 2 views
12

XCTestフレームワークを使用してアプリケーションをテストしようとしています。テストを実行せずに他のテストを停止しないでassertを指定してXCTestCaseに失敗する

いくつかの論理条件が成立している(アサーションを使用している)場合、単一のテストケースが失敗することを望みます。 これは問題につながる可能性があるため、テストケース内の残りのコードは実行したくありません。たとえば、ヌルポインタへのアクセス 残りのテストケースを正常に実行したいだけです失敗したテストには失敗したとマークされます。

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

この問題を解決する方法はありますか? ありがとう、 Yoav

答えて

10

パスカルの答えは、これを適切に達成するために私のアイデアを与えました。アサーションに失敗した場合、XCToolはOCUnitのようになりました。テストケースの実行は直ちに中止され、tearDownが呼び出され、次のテストケースが実行されます。それだけです

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

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

単にあなたの基底クラスで(XCTestCaseクラスから継承1)の方法invokeTestをオーバーライドします!

+1

Xcode 9では奇妙ですが動作しません。'XCTFail'の後も実行を続けます。 – Andy

3

条件を正常にチェックしてから、失敗し、テストが偽であれば、テストから復帰することです。このような

何か:

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

あなたは読みやすさを維持するためにヘルパーマクロでこれを包むことができます。

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

+0

+1を、私はこれは、すべての 'XCTAssertXxx'を複製以外の唯一の方法だと思いますマクロ。 – trojanfoe

+1

これは唯一の方法ではありません。もっと良いアプローチについて他の回答を確認してください。 –

3

私はcontinueAfterFailureを使用してこのパターンを用いて実行し、他のテストを聞かせすることができる午前:

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

ありがとうございます。私は、テストケースのコードを変更する必要がない、より良い答えを出すためにそれを使用しました。見てみな。 –

4

最も簡単な方法は、追加することです:

continueAfterFailure = false 

のsetUp()メソッドに。だから、次のようになります。

スウィフト

override func setUp() { 
    super.setUp() 

    continueAfterFailure = false 
} 

のObjective-C

- (void)setUp { 
    [super setUp]; 

    [self setContinueAfterFailure:NO]; 
} 
+1

Objective-Cでは、FALSEではなくNOを使用する必要があります。 –

+0

objCでは、TRUE/FALSEまたはYES/NOを使うことができます。それは事を変更するものではなく、文法的なものです。 – nCod3d

+0

もちろん、0と1と言うこともできますが、適切なObjCがYES/NOであるため、私たちはしません。確かにそれは動作し、それを使用して、私はそれを修正する唯一の人ではないことを知っている。 –

関連する問題