2013-03-20 9 views
7

私は、CoreGraphicsフレームワークを使用して、グラフィックアプリケーションを持っているユニットテストのカスタムUIViewの

私はモデルファイルのためのユニットテストスーツを持っていながら、私は自分のカスタムUIViewのためのユニットテストを作成する方法を理解することができないよう、

私の目標はビューの基本的なプロパティを設定し、描画関数の結果を見ることですが、私のセッターでは私が呼び出しました: [self setNeedsDisplay]; 実際のアプリケーションから呼び出されていますが、私の 'drawRect'関数がユニットテストから呼び出されていません

ユニットテストプロジェクトを描画する方法はありますか? uiプロジェクトをテストするためのベストプラクティス/ツールは何ですか?

おかげ

答えて

2

描画をテストするための簡単な方法は、最初の描画は、あなたが望む方法(そうなしTDD)を見えるようにすることです。次に、図面をPNGにレンダリングするテストを行います。ベースラインPNGのキャプチャとそのPNGとの比較の間にテストコードを切り替えるには、#if条件を使用します。

新しいOSバージョンでレンダリングがわずかに変更されることがあります。ベースラインイメージテストのために単一のOSを使用してください。必要に応じて新しいベースラインを取得します。

このようなテストを実施することで、図面コードをリファクタリングすることができます。同じイメージをレンダリングする場合、最新の変更は良好です。違いがある場合は、変更を受け入れるかどうかについて眼球の決定をしなければなりません。

編集:最近、手作業で行うのではなく、FBSnapshotTestCaseを使用します。テストに失敗した場合、「何かが間違っている」という結果を出すのではなく、イメージを保存します。こうすることで、手動でアプリを起動して問題のビューに移動することなく、サイドバイサイドの比較を行うことができます。また、さまざまな向きの異なるデバイスへのレンダリングをシミュレートします。これは、自動レイアウトのチェックには非常に適しています。

+0

すばらしい解決策Jon!私は自分の目でカスタムビューの結果をテストします。私がビューでたくさん変わるので、ここでの私の推論は、それが間違っているかどうかを見なければならないということです。それにもかかわらず、私はとにかくそのようなものを比較することについて考えることができませんでした。たぶん私はそれをテスト:)そしておそらくこれはあなたの次のスクリーンキャストのための話題かもしれません*ヒント* :) – Pfitz

+0

@ジョンリード、このアプローチを実装する方法の詳細やリンクを教えてください。 –

+0

PNGにレンダリングしますが、PNGのCRCをテストします。そうすれば、目で確認する必要があるのは一度だけです。テストが失敗した場合は、CRCが変更され、再度チェックする必要があることがわかります。 – Nanki

2

一般的にユニットテストビューは適切ではありません。ユニットテストは、ロジックの離散的なアトムを検証するためのものであり、コードを適切に考慮している場合、ビューにはロジックがほとんどありません。

さらに成功したアプローチは、UIAutomation framework(またはあなたの選択したオートメーションツール)を使用することです。これにより、アプリが実際に実行されている間(シミュレータまたはデバイスのいずれか)、シミュレートされたユーザーの対話を自動化できます。 UIAutomationには、さまざまなビューメソッド(captureRectWithName())があり、特定のビューを検索してスクリーンショットすることができます。たとえば、ImageMagick's command line compare toolに接続して、正しいことを確認していることを確認できます。

+0

OCUnitのような単体テストフレームワークで、一定の受け入れテストを書くこともできます。これを行う利点は、特定のビューのような個別のコンポーネントの描画を検証できることです。もちろん、スクリーンショット全体を取得することもできますが、これらは変更される可能性が高くなります。 –

0

私は個人的には、XCUIテストを使用してビューで行うすべてのレンダリングをテストする必要があると思います。ただし、カスタムレンダリング、または追加した数学やロジックを作成するビジネスロジックは、テストして、他のクラスから分離して実行する必要があります。

あなたのUIAutomationテストでは、ビューがレンダリングされているかどうかがチェックされますが、単体テストではその中に存在する可能性のある数学やビジネスロジックが検証されます。

関連する問題