SlideShare une entreprise Scribd logo
1  sur  40
初めての単体テスト
Xcodeでテストしてますか?
         バスケ
    Twitter: @basuke
Agenda
• 単体テスト全般について
• Xcode標準の単体テストを使う
• テストしやすいコードとMVCについて
• GHUnit - もうひとつの単体テスト環境
• 位置情報系のテスト
                      basuke
単体テストとは?
What is Unit Test?


                basuke
単体テスト
• Kent BeckさんがSmalltalk用に作った
• Javaでブレーク、いろんな言語に飛び火
• xUnitと呼ばれるフレームワーク
• 単体テストの手法のメインストリーム
• IDEなどのツールと相性が良い
                         basuke
単体テスト cont.
• 小さい単位で機能をテストしていく
• 簡単に実行、何度も実行
• テストが仕様になる


                     basuke
単体テストの目的
•   コードの質を高められる

•   書いたコードが動くことを確認できる

    •   しかも継続的に

•   設計の正当性を早期に検証できる

•   客観的な視点を手に入れられる

•   気持ちよくプログラミングできる
                        basuke
単体テスト向きでないこと
• インターフェースの動作確認
• グラフィカルな要素の正当性
 • 線が正しく引けているか
• 動作速度の検証
• ストレステスト
                  basuke
Xcodeの
単体テスト環境


          basuke
OCUnit -
SenTestKit
• Objective-C用のxUnitフレームワーク
• Xcodeにバンドルされていて手軽
• 一通りの機能は備えている
• 新規プロジェクトでも既存でも簡単に
 テストを追加できる


                         basuke
テスト用のターゲット
• テストには専用ターゲットを用意する
• 実行はテスト専用スキームを⌘-Uで簡
 単に実行できる




                  basuke
通貨変換アプリを作って
           テストしてみよう
#pragma mark - Actions

- (IBAction)doConvert:(id)sender {
! double anAmount = [amount.text doubleValue];
! double aRate = [rate.text doubleValue];
!
! double aResult = [self convert:anAmount withRate:aRate];
!
! result.text = [[NSNumber numberWithDouble:aResult] stringValue];
}

#pragma mark - Logic

- (double)convert:(double)anAmount withRate:(double)aRate {
! return anAmount * aRate;
}




                                                                 basuke
Xcodeで新規プロジェクト




            basuke
テストコード

- (void)testConvert
{
! double result = [controller convert:78 withRate:78];
! STAssertEquals(result, 1.0, @"¥78=$1");
}




                                                basuke
アプリケーションテスト
 とロジックテスト


         basuke
基本はアプリケーションテスト

• デフォルトで作られるのはアプリケー
 ションテスト

• 別にロジックテストというものもある



                  basuke
ロジックテストとは
• 手軽で迅速に動く
  • シミュレータに切り替わらない
• ビルド設定で
  • Bundle LoaderとTest Hostを削除
• 実際のアプリケーションの環境ではない
 ところでコードを実行する
                           basuke
ロジックテストの欠点
• シミュレータでしか動かない
• 自分でコードをリンクしてあげる必要
 がある

• アプリケーションテストは勝手にリ
  ンクしてくれる

• あくまでロジックの正当性をテスト
                     basuke
Assertの種類


            basuke
同じ値を期待する
• STAssertEqualObjects
 • オブジェクトがisEqual:か
• STAssertEquals
 • 同じ値か
• STAssertEqualsWithAccuracy
 • 幅を持たせた同値チェック
                               basuke
NilとBOOLチェック
• STAssertNil
• STAssertNotNil
 • nil or not nil
• STAssertTrue
• STAssertFalse
 • YES or No
                    basuke
例外を捕捉したりしなかったり

•   STAssertThrows
•   STAssertThrowsSpecific
•   STAssertThrowsSpecificNamed
•   STAssertNoThrow
•   STAssertNoThrowSpecific
•   STAssertNoThrowSpecificNamed
•   STAssertTrueNoThrow
•   STAssertFalseNoThrow
                                  basuke
必ず失敗させる
• STFail
 • とりあえず失敗させておくときに使う
 • 後でテストを書かなくちゃ行けない場
  合など

• 到達してはいけない場合などにも使え
  る

                  basuke
テストしやすいコード


        basuke
なぜテストしにくいか?
• ViewControllerにロジックを入れている
 から

• ロジックは独立したクラスに分離させ
 るべき

• ViewControllerはグルーコードの固まり
 にすべき
                         basuke
MVCが答え
• 表示に関する詳細な実装はView
• 入力に関する詳細な実装もView
• それ以外のロジックはModel
• データもModel
• Modelでの状態の保持は最低限に
                      basuke
実例




     basuke
View

 カスタム
グラフビュー

                 イベント
 カスタム           ハンドリング
 タブバー
                  basuke
Model
 集計を更新する
                       毎月の集計


グラフ用のデータを作る

                       昨年のデータ

 日々記録する



Twitterでつぶやく           日々のデータ



                         basuke
Modelはテストできる
• ただし、ちゃんと書かれたモデルは。
• 外部に依存しないモデル
• 状態を持っていても観測可能なモデル
• 同じ状況で同じ値を渡したら同じ結果が
 返ってくるモデル

• 参照透明性
                  basuke
電卓を作ってみよう
• MVCの話をふまえた上で、どういう構
 成にするか

• 電卓のモデルは何か?



                  basuke
GHUnit
もうひとつの単体テスト環境


            basuke
OCUnit vs GHUnit
• Xcode 3時代はOCUnitは貧弱だった
• GHUnitは救いだった
• Xcode 4になってOCUnitが飛躍的に便利
 になった

• そんな状況な現在。
                       basuke
GHUnitの特徴
•   見やすいテストランナー


•   オープンソース


•   豊富なAssert


•   非同期のテストをサポー
    ト


•   JenkinsによるCIサポート


                       basuke
非同期のテスト
• GHAsyncTestCase
 • 非同期テストケース。別スレッドの完
  了を待つことができる。

• GHMockNSURLConnection
 • NSURLConnectionの動作をシミュレー
  トするクラス

                        basuke
導入は結構簡単
• やってみましょう
• http://gabriel.github.com/gh-unit/docs/
  index.html




                                            basuke
Xcode4.2で導入された
位置情報のテスト手法


            basuke
位置情報アプリのテスト
• これまでは外に出るしかなかった
• Xcode 4.2からシミュレータで位置情報
 が返ってくるようになった

• カスタマイズ可能

                      basuke
シミュレータの位置情報
• 位置情報が返ってくる
• 位置情報サービスの状態の管理
• 位置情報サービス使用確認のリセット
• 位置情報アイコンの表示
• デバッグ > 位置 > カスタマイズ可能
                    basuke
Xcodeでの位置情報
• Scheme単位で位置情報を変更できる
• デバッガー実行中でも切り替えられる
• メジャーな都市がプリセットで用意
• GPXファイルをプロジェクトに追加す
 ることで、好きな場所に設定できる


                    basuke
DEMO


       basuke

Contenu connexe

Tendances

nGrinder3 : だれもが簡単にできる性能テスト
nGrinder3 : だれもが簡単にできる性能テストnGrinder3 : だれもが簡単にできる性能テスト
nGrinder3 : だれもが簡単にできる性能テスト
JunHo Yoon
 
Test Plugins
Test PluginsTest Plugins
Test Plugins
ykhr
 
システムテスト自動化標準ガイド 5章発表資料
システムテスト自動化標準ガイド 5章発表資料システムテスト自動化標準ガイド 5章発表資料
システムテスト自動化標準ガイド 5章発表資料
Masatoshi Itoh
 
Unit testで定時帰宅!
Unit testで定時帰宅!Unit testで定時帰宅!
Unit testで定時帰宅!
Funato Takashi
 
継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング
Takayuki Kondou
 
Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦
urasandesu
 
テスト環境まるごとAwsにのっけてみた
テスト環境まるごとAwsにのっけてみたテスト環境まるごとAwsにのっけてみた
テスト環境まるごとAwsにのっけてみた
Kazuaki Fujikura
 

Tendances (20)

reg-suitとQA Wolfを活用したVisual Regression Test
reg-suitとQA Wolfを活用したVisual Regression Testreg-suitとQA Wolfを活用したVisual Regression Test
reg-suitとQA Wolfを活用したVisual Regression Test
 
モックライブラリを使ってきちんとユニットテストする #Objective-C
モックライブラリを使ってきちんとユニットテストする #Objective-Cモックライブラリを使ってきちんとユニットテストする #Objective-C
モックライブラリを使ってきちんとユニットテストする #Objective-C
 
nGrinder3 : だれもが簡単にできる性能テスト
nGrinder3 : だれもが簡単にできる性能テストnGrinder3 : だれもが簡単にできる性能テスト
nGrinder3 : だれもが簡単にできる性能テスト
 
C++でテスト駆動開発
C++でテスト駆動開発C++でテスト駆動開発
C++でテスト駆動開発
 
Test Plugins
Test PluginsTest Plugins
Test Plugins
 
テスト自動化読書会 第3章 20150523
テスト自動化読書会 第3章 20150523テスト自動化読書会 第3章 20150523
テスト自動化読書会 第3章 20150523
 
phpspecで始めるBDD
phpspecで始めるBDDphpspecで始めるBDD
phpspecで始めるBDD
 
システムテスト自動化標準ガイド 5章発表資料
システムテスト自動化標準ガイド 5章発表資料システムテスト自動化標準ガイド 5章発表資料
システムテスト自動化標準ガイド 5章発表資料
 
JUnit実践入門 xUnitTestPatternsで学ぶユニットテスト
JUnit実践入門 xUnitTestPatternsで学ぶユニットテストJUnit実践入門 xUnitTestPatternsで学ぶユニットテスト
JUnit実践入門 xUnitTestPatternsで学ぶユニットテスト
 
プライベートAPIとの闘い
プライベートAPIとの闘いプライベートAPIとの闘い
プライベートAPIとの闘い
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
Unit testで定時帰宅!
Unit testで定時帰宅!Unit testで定時帰宅!
Unit testで定時帰宅!
 
継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング継続的インテグレーション3分クッキング
継続的インテグレーション3分クッキング
 
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
 
はこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テストはこだてIKA 第4回勉強会 単体テスト
はこだてIKA 第4回勉強会 単体テスト
 
Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦Eclipse を使った java 開発 111126 杉浦
Eclipse を使った java 開発 111126 杉浦
 
kintoneチームを支えるSeleniumテスト
kintoneチームを支えるSeleniumテストkintoneチームを支えるSeleniumテスト
kintoneチームを支えるSeleniumテスト
 
テスト環境まるごとAwsにのっけてみた
テスト環境まるごとAwsにのっけてみたテスト環境まるごとAwsにのっけてみた
テスト環境まるごとAwsにのっけてみた
 
Try_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hackTry_to_writecode_practicaltest #atest_hack
Try_to_writecode_practicaltest #atest_hack
 
EMTEを使って自動化の費用対効果をわかりやすく表現する
EMTEを使って自動化の費用対効果をわかりやすく表現するEMTEを使って自動化の費用対効果をわかりやすく表現する
EMTEを使って自動化の費用対効果をわかりやすく表現する
 

Similaire à 初めての単体テスト

Integration test with Arquillian and JBoss AS 7
Integration test with Arquillian and JBoss AS 7Integration test with Arquillian and JBoss AS 7
Integration test with Arquillian and JBoss AS 7
Takayuki Konishi
 
Asakusa バッチの運用を支える技術
Asakusa バッチの運用を支える技術Asakusa バッチの運用を支える技術
Asakusa バッチの運用を支える技術
KinebuchiTomo
 
Jenkins javascript ci
Jenkins javascript ciJenkins javascript ci
Jenkins javascript ci
hisame64
 
継続的デリバリー読書会 第 7 章 コミットステージ
継続的デリバリー読書会 第 7 章 コミットステージ継続的デリバリー読書会 第 7 章 コミットステージ
継続的デリバリー読書会 第 7 章 コミットステージ
Yasutomo Arai
 
Firefoxの開発プロセス
Firefoxの開発プロセスFirefoxの開発プロセス
Firefoxの開発プロセス
Makoto Kato
 

Similaire à 初めての単体テスト (20)

JavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansaiJavaScriptCore.framework の普通な使い方 #cocoa_kansai
JavaScriptCore.framework の普通な使い方 #cocoa_kansai
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
Xcode 6の新機能
Xcode 6の新機能Xcode 6の新機能
Xcode 6の新機能
 
Integration test with Arquillian and JBoss AS 7
Integration test with Arquillian and JBoss AS 7Integration test with Arquillian and JBoss AS 7
Integration test with Arquillian and JBoss AS 7
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
 
Xcode10での テスト周りの進化をふりかえる
Xcode10での テスト周りの進化をふりかえるXcode10での テスト周りの進化をふりかえる
Xcode10での テスト周りの進化をふりかえる
 
Cobolでもやりたいテスト自動化
Cobolでもやりたいテスト自動化 Cobolでもやりたいテスト自動化
Cobolでもやりたいテスト自動化
 
Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発
 
Ppl
PplPpl
Ppl
 
Asakusa バッチの運用を支える技術
Asakusa バッチの運用を支える技術Asakusa バッチの運用を支える技術
Asakusa バッチの運用を支える技術
 
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
 
AWS Lambdaのテストで役立つ各種ツール
AWS Lambdaのテストで役立つ各種ツールAWS Lambdaのテストで役立つ各種ツール
AWS Lambdaのテストで役立つ各種ツール
 
Hello. Continuous Integration
Hello. Continuous IntegrationHello. Continuous Integration
Hello. Continuous Integration
 
Jenkins + awsで並列テスト
Jenkins + awsで並列テストJenkins + awsで並列テスト
Jenkins + awsで並列テスト
 
Casper js エスキュービズム勉強会0718
Casper js エスキュービズム勉強会0718Casper js エスキュービズム勉強会0718
Casper js エスキュービズム勉強会0718
 
Jenkins javascript ci
Jenkins javascript ciJenkins javascript ci
Jenkins javascript ci
 
継続的デリバリー読書会 第 7 章 コミットステージ
継続的デリバリー読書会 第 7 章 コミットステージ継続的デリバリー読書会 第 7 章 コミットステージ
継続的デリバリー読書会 第 7 章 コミットステージ
 
CLRH_120414_WFTDD
CLRH_120414_WFTDDCLRH_120414_WFTDD
CLRH_120414_WFTDD
 
Firefoxの開発プロセス
Firefoxの開発プロセスFirefoxの開発プロセス
Firefoxの開発プロセス
 
Jubatusでマルウェア分類
Jubatusでマルウェア分類Jubatusでマルウェア分類
Jubatusでマルウェア分類
 

Plus de Basuke Suzuki (7)

CoAP Talk
CoAP TalkCoAP Talk
CoAP Talk
 
Introducing CakeEntity
Introducing CakeEntityIntroducing CakeEntity
Introducing CakeEntity
 
Introducing CakeEntity
Introducing CakeEntityIntroducing CakeEntity
Introducing CakeEntity
 
Kiosk / PHP
Kiosk / PHP Kiosk / PHP
Kiosk / PHP
 
PostgreSQLからMongoDBへ
PostgreSQLからMongoDBへPostgreSQLからMongoDBへ
PostgreSQLからMongoDBへ
 
iOS4時代の位置情報サービスの使い方
iOS4時代の位置情報サービスの使い方iOS4時代の位置情報サービスの使い方
iOS4時代の位置情報サービスの使い方
 
iPhoneのオモチャ箱 - 刊行記念イベント@ジュンク堂新宿 - バスケ
iPhoneのオモチャ箱 - 刊行記念イベント@ジュンク堂新宿 - バスケiPhoneのオモチャ箱 - 刊行記念イベント@ジュンク堂新宿 - バスケ
iPhoneのオモチャ箱 - 刊行記念イベント@ジュンク堂新宿 - バスケ
 

初めての単体テスト

Notes de l'éditeur

  1. \n
  2. \n
  3. 全般 5分\nXcode標準 10分\n実際に触る 10分\n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n