SlideShare une entreprise Scribd logo
1  sur  32
Télécharger pour lire hors ligne
Androidで使える
モックフレームワーク
Android Test Casual Talks #1 LT資料
2013.12.13 長谷川 孝二 @nowsprinting
自己紹介
長谷川 孝二

•
•
•

@nowsprinting (twitter, github, etc...)	


テスト自動化研究会	

Androidテスト部	

iOS/Androidアプリ開発者	


•
•

受託開発(フリーランス)	

自社開発
アジェンダ
• モックとは	

• Dalvik上で動作するモックFWの変遷	

• モックフレームワークの使用例	

• EasyMock	

• Mockito
モックとは
xUnit Test Patternsでの定義
#11 Using Test Doubles	

#23 Test Double Patterns
xUnit Test Patternsでの定義

• Test Double == 身代わり、影武者の意	

• Test Stub(間接入力を操作する)	

• Test Spy(間接出力を記録する)	

• Mock Object(間接出力の検証もする)	

• Fake Object(偽の間接入力を返す)	

• Dummy Object(nullじゃない程度)
テストの基本	

SUTへの入力に対する	

出力を検証する
依存オブジェクトが
あると難しくなる
依存オブジェクト
• Aさん担当クラス(進

どうですか?


これバグじゃありませんか?)	


• Date, Calendar, Random(再現性)	

• HttpClient(例外、通信エラー、正常系
でも再現性の確保)
Test Stub/Fake Objectで	

間接入力を固定化
Test Spy/Mock Objectで	

間接出力を検証する
詳しくは…
• xUnit Test Patterns(洋書)

http://xunitpatterns.com/
http://www.fieldnotes.jp/xutp/ ( 読書会の記録)	


• 井芹さんのエントリ

xUnit Test PatternsのTest Doubleパターン(Mock,Stub,Fake,Dummy等の定義)
http://goyoki.hatenablog.com/entry/20120301/1330608789

モックフレームワークとは
•

Test Double == 身代わり、影武者の意	


•

Test Stub(間接入力を操作する)	


•

Test Spy(間接出力を記録する)	


•

Mock Object(間接出力の検証もする)	


•

Fake Object(偽の間接入力を返す)	


•

Dummy Object(nullじゃない程度)

全部できる!	

しかも動的に
Dalvik上で動く
モックフレームワークの変遷
Android Mock
• 2009年、Dalvikチームが4週間で作った	

• EasyMockベース	

• 設定めんどくさい	

• @IT記事

Android Mockを利用してHTTP通信をテストするには
http://www.atmarkit.co.jp/ait/articles/1204/13/news144.html
その半年後…
Android Mock

• 2012年11月、開発・サポート終了
• https://code.google.com/p/mockito/	

• MIT License	

• 1.9.5rc-1(03-06-2012)でDalvikサポート
(動作にはdexmakerが必要)	


• Strict Mockは無く、間接出力の厳密な 
検証はInOrderを使って行なう
• http://easymock.org/	

• Apache License 2.0	

• 3.2(2013-07-11)でDalvikサポート
(動作にはdexmakerが必要)	


• Nice Mock, Mock, Strict Mockの三種類で 
検証の厳密さが異なる
モックフレームワークの使用例
EasyMock編
EasyMockの設定
• easymock-3.2.jarを入手、libs/に格納
http://easymock.org/Downloads.html	


• dexmaker-1.0.jarを入手、libs/に格納
http://code.google.com/p/dexmaker/	


• Build Pathにeasymock-3.2.jarを追加
モックの使用例 1/2
// HTTPステータス500を返すStatusLineモック	
StatusLine mockStatusLine	
= EasyMock.createMock(StatusLine.class);	
EasyMock.expect(mockStatusLine.getStatusCode())	
.andReturn(500);	
EasyMock.replay(mockStatusLine);	
!
(snip)	
!
// テスト対象のインスタンスフィールドにある	
// HttpClientをモックに差し替える	
mFxRateLoader.mHttpclient = mockHttpClient;
モックの使用例 2/2
// テスト実行	
try {	
mFxRateLoader.requestFeed();	
fail();	
!
} catch (InvalidHttpStatusCodeException e) {	
// 例外がスローされるのが正しい振る舞い	
// ステータスコードが正しいか検証	
assertEquals(500, e.getStatusCode());	
}
例外発生のテスト 1/2
// 通信できない状態の例外をスローするHttpClientモック	
Exception expected = new UnknownHostException();	
HttpClient mockHttpClient =
EasyMock.createMock(HttpClient.class);	
EasyMock.expect(mockHttpClient	
.execute((HttpUriRequest)EasyMock.notNull()))	
.andThrow(expected);	
EasyMock.replay(mockHttpClient);	
!
// テスト対象のインスタンスフィールドにある	
// HttpClientをモックに差し替える	
mFxRateLoader.mHttpclient = mockHttpClient;
例外発生のテスト 2/2
// テスト実行	
try {	
mFxRateLoader.requestFeed();	
fail("UnknownHostExceptionがthrowされていない");	

!
} catch (UnknownHostException e) {	
// 例外がスローされるのが正しい振る舞い	
}
StrictMockの例 1/2
// ダミーのパース結果を返すXmlPullParserモック	
XmlPullParser mockParser = EasyMock.createStrictMock(XmlPullParser.class);	
mockParser.setInput((InputStream)EasyMock.notNull(), (String)EasyMock.notNull());	
EasyMock.expect(mockParser.getEventType()).andReturn(XmlPullParser.START_TAG);	
EasyMock.expect(mockParser.getName()).andReturn("gesmes:Envelope");// 無視される	
EasyMock.expect(mockParser.next()).andReturn(XmlPullParser.START_TAG);	
(snip)	
EasyMock.expect(mockParser.getName()).andReturn("Cube");// USD	
EasyMock.expect(mockParser.getAttributeValue(null, "currency")).andReturn("USD");	
EasyMock.expect(mockParser.getAttributeValue(null, "rate")).andReturn(SEED_EURUSD);	
EasyMock.expect(mockParser.next()).andReturn(XmlPullParser.START_TAG);	
(snip)	
EasyMock.expect(mockParser.next()).andReturn(XmlPullParser.END_TAG); // </gesmes:Envelope>	
EasyMock.expect(mockParser.next()).andReturn(XmlPullParser.END_DOCUMENT);	
EasyMock.replay(mockParser);	

!

// テスト対象のインスタンスフィールドにあるHttpClientをモックに差し替える	
mFxRateLoader.mParser = mockParser;
StrictMockの例 2/2
// テスト実行	
InputStream dummyResponseBody	
= createDummyInputStream();	
FxRate actual	
= mFxRateLoader.parseFeed(dummyResponseBody);	
assertEquals("EUR/USDは正しくパースされている",
expectedEurusd, actual.eurusd);	
assertEquals("EUR/JPYは正しくパースされている",
expectedEurjpy, actual.eurjpy);
StrictMockの例 2/2
// テスト実行	
InputStream dummyResponseBody	
= createDummyInputStream();	
FxRate actual	
= mFxRateLoader.parseFeed(dummyResponseBody);	
assertEquals("EUR/USDは正しくパースされている",

parseFeed()内でStrictMockに	
expectedEurusd, actual.eurusd);	
assertEquals("EUR/JPYは正しくパースされている",
定義した順にメソッドを呼ばれて	
expectedEurjpy, actual.eurjpy);
いないと、その場で例外発生
Mockの乱用は危険
• 実装のテストになりがち
→何をテストしているのか?	


• 実装の変更に弱い
→壊れやすいテスト(Fragile Test)
→保守の放棄
モックフレームワークの使用例
Mockito編
買って 買って 買って 買って

買って 買って 買って 買って

買って 買って 買って 買って

買って 買って 買って 買って

買って 買って 買って 買って
ご清聴ありがとう
ございました

Contenu connexe

En vedette

User Scenario based UI testing with KIF
User Scenario based UI testing with KIFUser Scenario based UI testing with KIF
User Scenario based UI testing with KIF
Yusuke Kita
 

En vedette (12)

20131227_appium+rspec
20131227_appium+rspec20131227_appium+rspec
20131227_appium+rspec
 
iOSアプリ開発でもTravis CI #eytokyo
iOSアプリ開発でもTravis CI #eytokyoiOSアプリ開発でもTravis CI #eytokyo
iOSアプリ開発でもTravis CI #eytokyo
 
第3回Ques ここからはじめる!Androidアプリのテスト自動化
第3回Ques ここからはじめる!Androidアプリのテスト自動化第3回Ques ここからはじめる!Androidアプリのテスト自動化
第3回Ques ここからはじめる!Androidアプリのテスト自動化
 
Jasst15 webjasst
Jasst15 webjasstJasst15 webjasst
Jasst15 webjasst
 
テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜テストがあればなんとかなる〜効率化までの道程〜
テストがあればなんとかなる〜効率化までの道程〜
 
Unity testtool
Unity testtoolUnity testtool
Unity testtool
 
テストの種類とBDD #33testing
テストの種類とBDD #33testingテストの種類とBDD #33testing
テストの種類とBDD #33testing
 
自動テストとJenkinsの活用 公開版
自動テストとJenkinsの活用 公開版自動テストとJenkinsの活用 公開版
自動テストとJenkinsの活用 公開版
 
初めての単体テスト
初めての単体テスト初めての単体テスト
初めての単体テスト
 
Robotium を使った UI テストとレイアウト確認の効率化
Robotium を使った UI テストとレイアウト確認の効率化Robotium を使った UI テストとレイアウト確認の効率化
Robotium を使った UI テストとレイアウト確認の効率化
 
User Scenario based UI testing with KIF
User Scenario based UI testing with KIFUser Scenario based UI testing with KIF
User Scenario based UI testing with KIF
 
スマートフォンアプリの テスト自動化をはじめよう
スマートフォンアプリの テスト自動化をはじめようスマートフォンアプリの テスト自動化をはじめよう
スマートフォンアプリの テスト自動化をはじめよう
 

Similaire à Androidで使えるモックフレームワーク

福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介
Mori Shingo
 
SeasarCon 2009 White TDD
SeasarCon 2009 White TDDSeasarCon 2009 White TDD
SeasarCon 2009 White TDD
Takuto Wada
 
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
Koji Hasegawa
 
ユニットテスト_2日目
ユニットテスト_2日目ユニットテスト_2日目
ユニットテスト_2日目
Yoshiki Shibukawa
 
スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編
スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編
スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編
Koji Hasegawa
 

Similaire à Androidで使えるモックフレームワーク (20)

世界をすこしだけ前に進めるということ
世界をすこしだけ前に進めるということ世界をすこしだけ前に進めるということ
世界をすこしだけ前に進めるということ
 
JaSST'16 Tokyo モバイルセッション
JaSST'16 Tokyo モバイルセッションJaSST'16 Tokyo モバイルセッション
JaSST'16 Tokyo モバイルセッション
 
わんくま名古屋#33(20141115) TDD道場#21
わんくま名古屋#33(20141115) TDD道場#21わんくま名古屋#33(20141115) TDD道場#21
わんくま名古屋#33(20141115) TDD道場#21
 
Creators'night#3今井
Creators'night#3今井 Creators'night#3今井
Creators'night#3今井
 
Visual Studio App Centerの始め方
Visual Studio App Centerの始め方Visual Studio App Centerの始め方
Visual Studio App Centerの始め方
 
福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介福井スマートフォンハッカソン Titanium Mobileの紹介
福井スマートフォンハッカソン Titanium Mobileの紹介
 
java-ja TDD 2nd
java-ja TDD 2ndjava-ja TDD 2nd
java-ja TDD 2nd
 
SeasarCon 2009 White TDD
SeasarCon 2009 White TDDSeasarCon 2009 White TDD
SeasarCon 2009 White TDD
 
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
Xcode 7におけるUIテストとカバレジ計測 #yidev 第20回勉強会
 
『JUnit実践入門』写経・実践会 in 横浜 #3
『JUnit実践入門』写経・実践会 in 横浜 #3『JUnit実践入門』写経・実践会 in 横浜 #3
『JUnit実践入門』写経・実践会 in 横浜 #3
 
ユニットテスト_2日目
ユニットテスト_2日目ユニットテスト_2日目
ユニットテスト_2日目
 
GroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hackGroovyなAndroidテスト #atest_hack
GroovyなAndroidテスト #atest_hack
 
かわいいKotlinでAndroidアプリをつくろう
かわいいKotlinでAndroidアプリをつくろうかわいいKotlinでAndroidアプリをつくろう
かわいいKotlinでAndroidアプリをつくろう
 
ML system design_pattern
ML system design_patternML system design_pattern
ML system design_pattern
 
LogicFlow 実践編~LogicFlowでいろいろつくってみた ~
LogicFlow 実践編~LogicFlowでいろいろつくってみた ~LogicFlow 実践編~LogicFlowでいろいろつくってみた ~
LogicFlow 実践編~LogicFlowでいろいろつくってみた ~
 
スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編
スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編
スマートフォンアプリの色々自動化をはじめよう - at SonyDNA Meisters Salon 特別編
 
WebサイトもモバイルアプリもMagic Podで自動化
WebサイトもモバイルアプリもMagic Podで自動化WebサイトもモバイルアプリもMagic Podで自動化
WebサイトもモバイルアプリもMagic Podで自動化
 
CodeZineAcademy TDD実践講座PR資料
CodeZineAcademy TDD実践講座PR資料CodeZineAcademy TDD実践講座PR資料
CodeZineAcademy TDD実践講座PR資料
 
[potatotips #18] Android M Developer Preview & Wear 最新トピック
[potatotips #18] Android M Developer Preview & Wear 最新トピック[potatotips #18] Android M Developer Preview & Wear 最新トピック
[potatotips #18] Android M Developer Preview & Wear 最新トピック
 
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsiderMoq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
 

Plus de Koji Hasegawa

スマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAA
スマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAAスマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAA
スマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAA
Koji Hasegawa
 
Testterチーム2011年まとめ
Testterチーム2011年まとめTestterチーム2011年まとめ
Testterチーム2011年まとめ
Koji Hasegawa
 

Plus de Koji Hasegawa (13)

Blender-like SceneView Hotkeys Unity extensions
Blender-like SceneView Hotkeys Unity extensionsBlender-like SceneView Hotkeys Unity extensions
Blender-like SceneView Hotkeys Unity extensions
 
IntelliJ plugin の作りかた
IntelliJ plugin の作りかたIntelliJ plugin の作りかた
IntelliJ plugin の作りかた
 
AltUnityTesterを試してみた #gotandaunity
AltUnityTesterを試してみた #gotandaunityAltUnityTesterを試してみた #gotandaunity
AltUnityTesterを試してみた #gotandaunity
 
ビルドプロセスとCI #STAC2014
ビルドプロセスとCI #STAC2014ビルドプロセスとCI #STAC2014
ビルドプロセスとCI #STAC2014
 
VRの入力デバイス #JAGVR
VRの入力デバイス #JAGVRVRの入力デバイス #JAGVR
VRの入力デバイス #JAGVR
 
スマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAA
スマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAAスマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAA
スマートフォンアプリ開発と自動化 〜なじむ。実に!なじむぞ!〜 #AsianAA
 
テストフィクスチャTips(主にCoreData) #potatotips
テストフィクスチャTips(主にCoreData) #potatotipsテストフィクスチャTips(主にCoreData) #potatotips
テストフィクスチャTips(主にCoreData) #potatotips
 
Androidとの同時開発だけどモデルをC++で書けば問題ないよねっ
Androidとの同時開発だけどモデルをC++で書けば問題ないよねっAndroidとの同時開発だけどモデルをC++で書けば問題ないよねっ
Androidとの同時開発だけどモデルをC++で書けば問題ないよねっ
 
Testterチーム2011年まとめ
Testterチーム2011年まとめTestterチーム2011年まとめ
Testterチーム2011年まとめ
 
Testter単体テストのビアレビュー報告
Testter単体テストのビアレビュー報告Testter単体テストのビアレビュー報告
Testter単体テストのビアレビュー報告
 
山吹色の茸疾走におけるテストの実例
山吹色の茸疾走におけるテストの実例山吹色の茸疾走におけるテストの実例
山吹色の茸疾走におけるテストの実例
 
Testterを叩け!
Testterを叩け!Testterを叩け!
Testterを叩け!
 
Atec mtg7 unittest
Atec mtg7 unittestAtec mtg7 unittest
Atec mtg7 unittest
 

Dernier

Dernier (11)

業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

Androidで使えるモックフレームワーク