iOSテスト/仕様TDD / BDDと統合および受け入れテスト


229

iPhoneのビヘイビア駆動開発に使用するのに最適なテクノロジーは何ですか?そして、これらのテクノロジーの健全な使用を実証するいくつかのオープンソースのサンプルプロジェクトは何ですか?ここに私が見つけたいくつかのオプションがあります:


ユニットテスト

テスト::ユニットスタイル

  1. 「iOS開発ガイド:ユニットテストアプリケーションとその他のOCUnitリファレンス」で説明されているOCUnit / SenTestingKit
  2. キャッチ
  3. GHUnit
  4. Mac向けGoogleツールボックス:iPhoneユニットテスト

RSpecスタイル

  1. キウイ(これには、あざけりと期待も付いています)
  2. 器用なiOS-Acceptance-Testing仕様に示されているUIオートメーション付きのJasmine

受け入れ試験

セレンスタイル

  1. UIオートメーション(デバイスで動作)

    更新:ズッキーニフレームワークは、キュウリとUIオートメーションをブレンドしているようです!:)

    古いブログ投稿:

  2. UISpecRunnerよるUISpec

  3. FoneMonkey

キュウリのスタイル

  1. フランクiCukeキュウリに基づいてiPhoneトークを満たしています

  2. KIF(機能性を保つ)ことでスクエア

  3. Zucchini Frameworkは、テストの記述にCucumber構文を使用し、ステップ定義にCoffeeScriptを使用します。

追加

結論

まあ、明らかに、この質問に対する正しい答えはありませんが、ここで私が現在行くことを選択したものです:

ユニットテストでは、XCode 4でOCUnit / SenTestingKitを使用していました。これはシンプルで堅牢です。しかし、私たちの言葉は私たちの世界を作り出すので、TDD よりも BDDの言語を好む(なぜRSpecがTest :: Unitよりも優れているのか)だから今、私はARCKiwiコード補完/オートコンプリートでKiwiを使用しています。OCUnitの上に構築されており、RSpecスタイルのマッチャーとモック/スタブが付属しているため、CidarよりもKiwiを好みます。更新:現在、Kiwiが無料のブリッジオブジェクトのスタブをサポートしていないため、現在OCMockを調べています

受け入れテストには素晴らしいUIオートメーションを使用します。各テストケースを記録して、テストの作成を自動化できます。また、Appleが開発しているため、将来性が期待できます。また、デバイスやInstrumentsからも機能するため、メモリリークの表示など、他の優れた機能を利用できます。残念ながら、UIオートメーションではObjective-Cコードの実行方法がわかりませんが、Frank&iCukeを使用すると実行できます。したがって、ユニットテストで下位レベルのObjective-Cのものをテストするか、クリックするとObjective-Cコードを実行するビルド構成UIButton専用のを作成します。TEST

どのソリューションを使用していますか?

関連する質問


1
少なくとも数か月前の時点で、重要な研究室が杉を使用していたことを知っています。(ええと、私はそれが彼らのgithubアカウントに与えられていることを考えると明白だと思います)そんなお店の応援で、それが私の選択です。
Jed Schneider

1
それは良い点です。しかし、それでもAppleは、Cedarではなく、ユニットテストフレームワークを使用することをお勧めします。それで、それはピボタル対です。林檎。どっちに行く?
ma11hew28 2010年

2
私は、このスレッドの読者に興味のあるフランク、KIFとUIAutomationを比較する記事を書いたsgleadow.github.com/blog/2011/10/26/...
シチュー

回答:


53

tl; dr

Pivotalでは、RubyプロジェクトでRspecを使用して愛しているため、Cedarを作成しました。CedarはOCUnitに置き換わるものや競合するものではありません。RspecがRubyでBDDスタイルのテストを開拓したように、BDDスタイルのテストの可能性をObjective Cにもたらすことを意図していますが、Test :: Unitを排除していません。どちらを選択するかは、主にスタイルの好みの問題です。

場合によっては、OCUnitが機能する方法のいくつかの欠点を克服するためにCedarを設計しました。具体的には、デバッガーをテストで使用したり、コマンドラインやCIビルドでテストを実行したり、テスト結果の有用なテキスト出力を取得したりしたいと考えました。これらのものは多かれ少なかれあなたにとって有用かもしれません。

長い答え

CedarやOCUnitなどの2つのテストフレームワークを決定することは、優先されるスタイルと使いやすさの2つに帰着します。スタイルから始めましょう。それは単に意見と好みの問題だからです。使いやすさはトレードオフのセットになる傾向があります。

スタイルの考慮事項は、使用するテクノロジーや言語を超えています。xUnitスタイルのユニットテストは、BDDスタイルのテストよりもずっと以前から存在していますが、後者は主にRspecにより急速に人気が高まっています。

xUnitスタイルのテストの主な利点は、その単純さと幅広い採用(ユニットテストを作成する開発者の間で)です。コードの記述を検討できるほぼすべての言語で、xUnitスタイルのフレームワークを利用できます。

BDDスタイルのフレームワークは、xUnitスタイルと比較すると、2つの主な違いがある傾向があります。テスト(または仕様)の構造と、アサーションを記述するための構文です。私にとって、構造的な違いが主な差別化要因です。xUnitテストは1次元であり、特定のテストクラスのすべてのテストに対して1つのsetUpメソッドを使用します。ただし、テストするクラスは1次元ではありません。多くの場合、競合する可能性のあるいくつかの異なるコンテキストでアクションをテストする必要があります。たとえば、addItem:メソッドを使用した単純なShoppingCartクラスを考えてみます(この回答のために、Objective C構文を使用します)。このメソッドの動作は、カートが空のときと、カートに他のアイテムが入っているときとで異なる場合があります。ユーザーが割引コードを入力した場合は異なる場合があります。指定の商品ができる場合は異なる場合があります ' t選択した配送方法で配送されます。これらの可能性のある条件が互いに交差する場合、幾何学的に増加する可能性のあるコンテキストの数が生じます。xUnitスタイルのテストでは、多くの場合、これはtestAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodAppliesのような名前の多くのメソッドにつながります。BDDスタイルのフレームワークの構造により、これらの条件を個別に整理することができます。これにより、すべてのケースを確実にカバーし、個々の条件を簡単に検索、変更、または追加できるようになります。例として、Cedar構文を使用すると、上記のメソッドは次のようになります。xUnitスタイルのテストでは、多くの場合、これはtestAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodAppliesのような名前の多くのメソッドにつながります。BDDスタイルのフレームワークの構造により、これらの条件を個別に整理することができます。これにより、すべてのケースを確実にカバーし、個々の条件を簡単に検索、変更、または追加できるようになります。例として、Cedar構文を使用すると、上記のメソッドは次のようになります。xUnitスタイルのテストでは、多くの場合、これはtestAddItemWhenCartIsEmptyAndNoDiscountCodeAndShippingMethodAppliesのような名前の多くのメソッドにつながります。BDDスタイルのフレームワークの構造により、これらの条件を個別に整理することができます。これにより、すべてのケースを確実にカバーし、個々の条件を簡単に検索、変更、または追加できるようになります。例として、Cedar構文を使用すると、上記のメソッドは次のようになります。

describe(@"ShoppingCart", ^{
    describe(@"addItem:", ^{
        describe(@"when the cart is empty", ^{
            describe(@"with no discount code", ^{
                describe(@"when the shipping method applies to the item", ^{
                    it(@"should add the item to the cart", ^{
                        ...
                    });

                    it(@"should add the full price of the item to the overall price", ^{
                        ...
                    });
                });

                describe(@"when the shipping method does not apply to the item", ^{
                    ...
                });
            });

            describe(@"with a discount code", ^{
                ...
            });
        });

        describe(@"when the cart contains other items, ^{
            ...
        });
    });
});

場合によっては、アサーションの同じセットを含むコンテキストが見つかります。これは、共有されたサンプルコンテキストを使用してドライアップできます。

BDDスタイルのフレームワークとxUnitスタイルのフレームワークの2番目の主な違いであるアサーション(または「マッチャー」)構文は、単に仕様のスタイルをやや良くするだけです。本当に好きな人もいれば、嫌いな人もいます。

それは使いやすさの問題につながります。この場合、各フレームワークには長所と短所があります。

  • OCUnitはCedarよりはるかに古く、Xcodeに直接統合されています。つまり、新しいテストターゲットを作成するのは簡単で、ほとんどの場合、テストを実行して「そのまま」実行できます。一方、iOSデバイスで実行する場合など、一部のケースでは、OCUnitテストを機能させることがほぼ不可能であることがわかりました。ライブラリを取得して自分でリンクしているため(Xcodeの簡単なタスクではない)、Cedar仕様の設定にはOCUnitテストよりも多くの作業が必要です。私たちはセットアップをより簡単にするために取り組んでおり、どんな提案でも大歓迎です。

  • OCUnitはビルドの一部としてテストを実行します。つまり、テストを実行するために実行可能ファイルを実行する必要はありません。テストが失敗した場合、ビルドは失敗します。これにより、テストの実行プロセスが1ステップ簡単になり、テスト出力がビルド出力ウィンドウに直接送られるため、見やすくなります。いくつかの理由により、Cedar仕様を実行可能ファイルに組み込み、個別に実行することを選択しました。

    • デバッガを使えるようにしたかったのです。他の実行可能ファイルを実行するのと同じようにCedar仕様を実行するので、同じようにデバッガーを使用できます。
    • テストで簡単にコンソールロギングが必要でした。OCUnitテストではNSLog()を使用できますが、出力はビルドウィンドウに送られます。ビルドウィンドウを読むには、ビルドステップを展開する必要があります。
    • コマンドラインとXcodeの両方で、読みやすいテストレポートが必要でした。OCUnitの結果はXcodeのビルドウィンドウに適切に表示されますが、コマンドラインから(またはCIプロセスの一部として)ビルドすると、テスト出力が多数のその他のビルド出力と混在します。個別のビルドフェーズと実行フェーズにより、Cedarは出力を分離するため、テスト出力を簡単に見つけることができます。デフォルトのCedarテストランナーは、標準スタイルの印刷 "。"をコピーします。合格した各仕様については、「F」は不合格の仕様などです。Cedarにはカスタムレポーターオブジェクトを使用する機能もあります。そのため、少しの労力で好きな方法で結果を出力できます。
  • OCUnitはObjective Cの公式ユニットテストフレームワークであり、Appleによってサポートされています。Appleは基本的に無制限のリソースを持っているので、彼らが何かをしたいなら、それは成し遂げられるでしょう。そして、結局のところ、これは私たちが取り組んでいるAppleのサンドボックスです。しかし、このコインの裏返しは、Appleが毎日膨大な数のサポートリクエストとバグレポートを受け取るということです。それらはすべてを処理することについては非常に優れていますが、報告した問題をすぐに処理したり、まったく処理したりできない場合があります。CedarはOCUnitよりもはるかに新しく、焼き加減が少ないですが、質問や問題、提案がある場合は、Cedarメーリングリスト(cedar-discuss@googlegroups.com)にメッセージを送信してください。できる限りのお手伝いをします。また、Github(github.com/pivotal/cedar)からコードをフォークして、不足していると思われるものを追加してください。

  • iOSデバイスでOCUnitテストを実行するのは難しい場合があります。正直なところ、私はしばらくこれを試していなかったので、それは簡単になったかもしれませんが、前回試みたとき、UIKit機能が動作するためのOCUnitテストを取得できませんでした。Cedarを作成するときに、シミュレータとデバイスの両方でUIKitに依存するコードをテストできることを確認しました。

最後に、ユニットテスト用にCedarを作成しました。つまり、UISpecのようなプロジェクトと実際には比較できません。UISpecを使用してみてからかなり時間が経過しましたが、主にiOSデバイスでプログラムによってUIを駆動することに重点を置いていることがわかりました。Appleが(当時)UIAutomationを発表しようとしていたので、Cedarがこれらのタイプの仕様をサポートしないようにすることを明確に決定しました。


徹底的な対応ありがとうございます。RSpecの本を読んで、Cederを試してみましょう。UISpecをSeleniumセクションに移動し、そこにもUIAutomationを追加しました。UIAutomationに関するブログ投稿を読んでいます。フランクは実際にはもっとシンプルで読みやすいだけでなく、文書化されているように見えるので、それから始めることを考えています。UIAutomationと同じくらい強力であることを願っています。あなたはUIAutomationがライフサイクルの問題をテストできると言います。iCukeもできるのかしら…
ma11hew28

8

私はフランクを受け入れテストミックスに投げ込む必要があります。これはかなり新しい追加ですが、これまでのところ私にとってはうまく機能しています。また、icukeとは異なり、実際に積極的に取り組んでいます。



4

素晴らしいリスト!

iOSアプリケーションをUIテストするための別の興味深い解決策を見つけました。

ズッキーニフレームワーク

に基づいていUIAutomationます。フレームワークを使用すると、画面中心のシナリオをCucumberのようなスタイルで記述できます。シナリオは、シミュレーターおよびデバイスからコンソールから実行できます(CIに対応しています)。

アサーションはスクリーンショットに基づいています。柔軟性に欠けるように聞こえますが、ハイライトされた画面比較を備えた素晴らしいHTMLレポートを取得し、ピクセル単位の正確なアサーションを設定する領域を定義するマスクを提供できます。

各画面はで説明する必要がCoffeScriptあり、ツール自体はルビで書かれています。これは一種のポリグロットの悪夢ですが、このツールは素晴らしい抽象化を提供しUIAutomation、画面が記述されている場合はQA担当者でも管理できます。


タイト!ありがとう。これを上の質問に追加しました。
ma11hew28

2

受け入れテストにはiCukeを、ユニットテストにはCedarを選択します。UIAutomationはAppleにとって正しい方向への一歩ですが、ツールには継続的インテグレーションのより良いサポートが必要です。たとえば、現在、InstrumentsでUIAutomationテストを自動的に実行することはできません。


1

GHUnitは単体テストに適しています。統合テストでは、UISpecを使用して成功しましたが(github fork here:https : //github.com/drync/UISpec)、軽量のセットアップであることが約束されているため、iCukeを試すことを楽しみにしています。 RSpecやCucumberなどの良さをテストするレールを使用します。



弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.