9

私の単体テスト スイートには、最新の iOS バージョンにのみ適用できるいくつかのテスト ケースが含まれています。予想通り、古い iOS バージョンでスイートを実行すると、これらのテストは失敗します。

これらのテスト ケースを特定の iOS バージョンでのみ実行する必要があることを示す標準的な方法はありますか?

私が考えた1つのオプション:

- (void) testSomethingThatOnlyWorksOniOS7
{
    const BOOL iOS7OrHigher = floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1;
    if (!iOS7OrHigher) return;

    // Actual test goes here
}

SenTestCaseまたは、特定のテストを動的にスキップするように指示できますか?

4

4 に答える 4

5

あなたのアプローチは私にはうまくいくようです。

一般的に言えば、iOS のバージョンに基づいて選択的に単体テストを実行する「標準的な方法」のようなものはないと思います。

一方で、あなたのアプローチは、iOS のバージョンに応じて、1 つの機能を選択的に、または異なる方法で実装するために使用できるものと同じです。CocoaWithLove: Tips and Tricks from conditional...に関するこのディスカッションについては、すでにご存知かもしれません。かなり古いものですが、ここで説明するアプローチは今でも有効です。

単体テストの実行方法は指定しませんが、これを処理するための本当にクールな方法である IMO は、実装の外部で実行するテストを指定できるようにすることです。テストの実装を汚染しないでください。

これは、たとえば、各テストに関連付けられたバージョン番号を通じて行うことができます。単体テストの実装を呼び出す前に、関数呼び出しでバージョン番号を確認しますtestSomethingThatOnlyWorksOniOS7

編集:

実は、最初に考えていたよりも簡単かもしれません。今、私は少しハックしています...

実際のテストメソッド呼び出しが行われる OCUnit 内の場所を変更できます (これについてはわかりません。申し訳ありませんが、見つけるのは難しいとは思いません...)。これにより、セレクター名がチェックされます:セレクター名を文字列 ( NSStringFromSelector) に変換し、それが何らかの正規表現に一致する場合は、特定の分岐を取ります (これは、単にそのテストを無視して、あなたの場合になります)。

賢明ではないかもしれない OCUnit を変更することで心配している場合は、メソッドの入れ替えによって上記のことを行うことができます: セレクター名が式と一致しない場合にのみ、元の実装を呼び出し、それ以外の場合は何もしません。

于 2013-10-15T10:53:05.517 に答える
3

最善の方法はrespondsToSelector:、iOS 7 でしか利用できないことがわかっている方法で実行することです。

[view respondsToSelector:@selector(snapshotViewAfterScreenUpdates:)]

また

[UIView instancesRespondToSelector:@selector(snapshotViewAfterScreenUpdates:)]
于 2013-10-15T10:44:25.030 に答える
1

これを行うための標準的な方法はありません。一般的に言えば、テストは iOS コミュニティがあまり話題にするものではありません。私がこれにアプローチする方法は、特定の iOS7 テストをテスト ターゲットに独自に配置し、基本的にそのスイートをそれに応じて実行することを決定することです。

于 2013-10-15T10:53:25.310 に答える
0

@sergioが提案したように、OCUnitで遊んでみましたが、遠く離れることはできませんでした。これまでのところ、バージョン固有のテストにマクロで注釈を付けています。次のようになります。

#define SKIP_IF_VERSION(v) if (floor(NSFoundationVersionNumber) <= v) return;

- (void)testSomethingThatOnlyWorksOniOS7
{ SKIP_IF_VERSION(NSFoundationVersionNumber_iOS_6_1)
// Test goes here
}

このアプローチで私が気に入らないのは、とにかくテストが実行される (何もしない) ことです。テストを完全にスキップすることをお勧めします。

于 2013-10-15T13:52:24.447 に答える