Skip to content
This repository has been archived by the owner on Jun 20, 2023. It is now read-only.

11.1 iOS開発におけるテストとCI

Koya Tamura edited this page May 21, 2013 · 3 revisions

XcodeにはデフォルトでiOSやOSXに関するテストを行うフレームワークが組み込まれている。 またサードパーティ製のテストフレームワークも数多く存在し、テストの重要性はとても高い。

このセクションではiOSにおけるテストの種類とフレームワークの簡単な紹介を行い、iOSアプリケーションのテストを書く際の注意点について解説します

テストフレームワーク

iOS開発に関するテストはXcodeによってもサポートされており、Appleによると大きくロジックテスト(Logic tests)と機能テスト(Application tests)に分かれます。

ロジックテストでは、各ユニット単体がそれ自体で正しく機能することを確認します。 機能テストではアプリケーションにおいて各ユニットが正しく利用されているかを確認します。

MVCパターンに則ってアプリケーションを作成した時に、モデル層についてのテストはロジックテストで行い、ボタンを押した、キーボードに入力した際の挙動や、正しく画面遷移が行われるか、などのテストを機能テストで行います。

iOSにアプリケーションのテストの歴史は浅く、まだ確立したフレームワークはありません。そこでここでは現在利用可能なテストフレームワークについてロジックテストと機能テストに大別して紹介します。

ロジックテストフレームワーク

OCUnit (Sen Testing Framework)
OCMock

OCUnit (Sen Testing Framework)はXcodeにデフォルトで含まれているロジックテストのフレームワークです。OCMockはOCUnitでモックを行う時のためのサポートライブラリです。新規プロジェクトを作る際に、"include unit tests"にチェックを入れるとテスト環境が出来上がるので、簡単に導入できます。テストの実行もXcodeから⌘+Uで実行することができます。 一方でアサーションの数の少なさや複数のスレッドにまたがったテストなどを実行できません。

GHUnit

GHUnitもOCUnitと同様に単体のロジックテストを行うフレームワークです。シミュレータ上で動作し、viewに関するテストを実行できる(viewのレイアウトなどを比較できる)、非同期処理のテストを実行できる、と言う点でOCUnitよりも高機能です。CocoaPodsより導入可能です。

Kiwi

KiwiはXcode上でBDDスタイルでテストを書くことのできるフレームワークです。モックを行うことも出来、Xcode上で⌘+Uで実行することができます。

機能テストフレームワーク

UI Automation

UI AutomationはXcodeにデフォルトで含まれている機能テストのフレームワークです。Instrumentsでシミュレータあるいは実機の動作履歴を覚えておき、その通りに実行することができるかをテストします。テストはJavaScriptで記述します。 ドキュメントについてはこちらをご覧ください。 Automating UI Testing

KIF

KIFはSquare, Incがオープンソースで公開している機能テストフレームワークです。テストはObjective-Cで記述し、シナリオ、ステップなどの段階で記述します。導入はCocoaPodsより行うことができるようになりました。

Frank

Frankは、Ruby On Railsの受け入れテストフレームワーク、Cucumberを利用してテストを行うことの出来る、機能テストのフレームワーク。テストにおいてはアプリケーション内部に埋め込まれたHTTPServerからテストを実行します。

iOSのテストを書く際の注意点

シミュレータ、実機とxcodebuildの違い

iOSアプリケーションのテストの実行方法には Xcode上で⌘+U, シミュレータ上でのテスト, 実機上でのテスト, コマンド xcodebuild を用いたコマンドラインからの実行 などいくつかの種類があります。 この実行方法によって、いくつかテストについて制限があります。 例えば、シミュレータ上でのテストの場合、xibを読み込むことができますが、カメラや位置情報を用いたテストは難しいです。 またコマンドラインからのビルドの場合は、xibの読み込みが行われないことがあります。他にも端末への依存が大きいKeyChainなどもアクセスが難しいです。

これらの制限を踏まえた上でテストを記述すること必要となります。

スレッドをまたぐのが難しい(非同期処理)

バッチ処理を行う単体テストにおいて、テストは一つのスレッド上で行われることが多く、複数のスレッドでの処理や非同期処理はあまり考慮に入れていないケースが多いです。(OCUnitなど)

そのため、非同期処理のテストを書く場合は非同期処理をサポートしているテストフレームワークを用い、明示的に非同期テストを書く必要があります。GHUnitなどでは非同期処理のテストを行うことが出来ます。

通信のモック

通信を行うテストを利用する場合、レスポンスが常に同一のものでないと正しいテストを行うことができません。そのため、サーバーが常に準備されており常に同じレスポンスをする必要があります。しかし、テストのためのレスポンスを返すサーバーを構築するのはコストがかかりますし、どのような時もサーバーを立てておく必要があります。そのような時はレスポンスをモックしてテストを行うことが多いです。

テストのしやすい設計

上述のように、iOSアプリケーションのテストにはいくつか制約や注意点がつきまといます。そのためにも、レスポンスを返すメソッドにする、コントローラにロジックを詰め込まずに、モデル層にロジックを詰め込んでテストを多めに書く、メソッドでは単一のことを行う、など、一般的に言われている テストしやすい設計 を心がけることがiOSアプリケーションの開発においても必要です。

はじめに

  1. iOSについて

  2. Xcode最初のステッフ

  3. 導入

  4. Objective C の基礎

  5. メモリ管理

  6. 1.3 UIViewController1 UIViewController のカスタマイズ(xib, autoresizing)

  7. 1.3 UIViewController1 UIViewController のカスタマイズ(storyboard)

  8. UIViewController2 - ModalViewController

  9. UIViewController2 - ModalViewController(storyboard)

  10. UIViewController3 - ライフサイクル

  11. HomeWork 1 Objective C の基本文法

  12. HomeWork 2 UIViewControllerとModalViewController

  13. HomeWork 3 UIViewController + Animation

  14. UIKit 1 - container, rotate-

  15. UINavigationController

  16. UITabController

  17. Custom Container View Controller

  18. Supporting Multiple Interface Orientations

  19. HomeWork 1 - タブバーからモーダルビューを表示する

  20. HomeWork 2 - NavigationController

  21. HomeWork 2.3 デバイスことに回転対応

  22. UIKit 2- UIView -

  23. UIView

  24. UIView のカスタマイズ

  25. UIView Animation

  26. HomeWork 1 - UIScrollView

  27. UIKit 3 - table view -

  28. UITableView について

  29. UITableViewとNavigationController

  30. custom UITableViewCell の作成

  31. UITableViewのその他のオプション、カスタマイズ

  32. HomeWork 1 - Dynamic height with a custom uitableviewcell

  33. UIKit 4 - image and text -

  34. UIImagePickerController

  35. Assets Library

  36. UITextFiled, UITextView

  37. KeyboardNotification

  38. Homework 1 - フォトの複数枚選択

  39. ネットワーク処理

  40. NSURLConnection

  41. JSONのシリアライズとデシリアライズ

  42. UIWebView

  43. ローカルキャッシュと通知

  44. NSUserDefaults, Settings Bundle

  45. NSFileManager

  46. Key Value Observing

  47. NSNotification、NSNotificationCenter を用いた通知

  48. UILocalNotification

  49. Blocks, GCD

  50. Blocks

  51. GCD

  52. 【演習】GCD,-Blocksを用いたHTTPリクエストマネージャの作成

  53. 設計とデザインパターン

  54. クラス設計 1

  55. クラス設計 2

  56. [クラス設計演習] (https://github.com/mixi-inc/iOSTraining/wiki/9.3-%E3%82%AF%E3%83%A9%E3%82%B9%E8%A8%AD%E8%A8%88%E6%BC%94%E7%BF%92)

  57. 開発ツール

  58. Instruments, デバッガ

  59. CocoaPods

  60. テスト

  61. iOS開発におけるテスト

  62. GHUnit

  63. Kiwi

  64. KIF

  65. In-App Purchase

  66. In-App Purchase

  67. 付録

  68. Tips of Xcode

  69. Auto Layout 入門

  70. Auto Layout ドリル

Edit sidebar

Clone this wiki locally