SlideShare uma empresa Scribd logo
1 de 57
Baixar para ler offline
Spring 歴約1年初⼼者の
Test 奮闘記
タグバンガーズ 内藤
• 内藤 千静
所属:株式会社タグバンガーズ
• Spring 歴 1年弱くらい
• Java 歴4,5年くらい
⾃⼰紹介
奮闘⼀覧
1.JUnit奮闘記
2.Mockito奮闘記
3.SpringRunner奮闘記
1.springRunnerでControllerのテスト
2.springRunnerでrepositoryのテスト
4.まとめ
JUnit奮闘記
研修も終わり、実務を始めてから数⽇
そろそろ、Unit Testも実装していきたいよね。
testのプログラムを書くんだよ。
まあとりあえず、やりながら説明するよ。
Unit Test?(って単体テストだよな…?実装っ
て?)
え?(書くって何だ。)
よくわかんないけどわかりました。
Unit Testを書くにあたってJUnitを使ってくね。
はい?(またよくわからん英語出てきた。)
くそだる…
そして私がどれくらいTestの知識がなかったかというと…
こいつ
Unit Testと仲良くなる為には彼を知るところから
始めなければいけない(ついでにJUnitも)🧐
Unit Testについて調べてみたらこんなことがわかりました
• 作成したコードが要件を満たしているか確認するもの
• プロダクションコードに書かれた処理がユニットテストに提⽰され
るため、プロダクションコードの理解を助けてくれる
• ⼀度書いてしまえば、⼿軽に何度でもテストを⾏うことができます。
そしてJUnitではこんなことができるらしい…!!
⼀度書いてしまえば、
何度でも使いまわせる、、、だと!?
しかも⾃動化される、、、!??
このクラスのtestコードを書け!!
• getWordメソッドが呼ばれた際に想
定している値が返ってくるか
• getWord()の引数1を指定した場合
に”いえーい”が返ってくる
• getWord()の引数2を指定した場合
に”元気ー??”が返ってくる
• 上記以外の引数を渡した場合
に”1or2を⼊⼒して下さい”が返っ
てくるか
実際に⾊々調べながら書いた結果がこちら
assertThat()を使⽤して想定した値が
返ってくるか確認
あれ?割と余裕じゃね…?
👏👏👏
Mockitoテストでの奮闘記
UnitTestを知り、余裕をこいていたある⽇
この修正のテスト書ける?
ほいじゃよろしく👍
それ依存されてるクラスを
mockしなきゃテスト難しいかも
書けます(余裕だわ)
承知です!!
……??なんかエラーがでまくってて上⼿くテ
ストが動かないです。。
mock?
mockito使ってやればいけるよ(^ω^)
mockitoって?
MockitoJUnitRunner
※mockを簡単に使えるように⼿助けしてくれるライブラリの⼀つです。
JUnit単体ではmock Testを⾏うことが不可能なため、
mockライブラリーを使⽤する必要があります。
使⽤する際はいい感じに何かしてくれる
おまじないの@RunWithに
MockitoJunitRunnner.classを指定すると使える
※テストを⾏う際に依存しているクラスを装ってそれっぽく動いてくれる便利な機能
mockを使わなきゃいけない場⾯って?
1. 検証したいクラスは完成済みでテストしたいんだけど、クラスの中で
利⽤している別クラスが未完成の場合
2. 異常系の動作確認を⾏う場合
3. ⻑々と依存しているクラスのnewをおこなうのが⾯倒な場合
4. 外部との連携を⾏うクラスの依存がある場合
この機能を使って実装してみよー
今回は未完成のクラスがあった場合のtest
Constructorを少し変更
テスト
プルリクダメ出し
@InjectMocksを使⽤して書き直してください。
@InjectMocks?わかりました。
(分かったとは⾔っていない)
過去の作成されたTestを⾒漁ってみたらあった
@injectMocks使⽤例画像春
名前はsampleに変更してます。
とりあえず、
⾒つけたTestを⾒ながら作ってみる…
テストもできて、無事プルリク通った
テストを⾏いたい対象のクラス
テスト対象のクラスに
依存しているクラス
SpringRunner奮闘記 ‒Controller編
SpringRunnner?知らんけどいけるっしょ
この修正のテストお願いします。
SpringRunner使ってDIされてるのmockして
みて
承知です!
…。
依存している⼦をmockにしたいのですが、な
んかうまくいきません…。
SpringRunnner?
SpringRunnner使ってやればいけるよ
(^ω^)
これ
SpringRunnnerってそもそもなに?
過去に書かれまくっていたtestから⾒つけ出しました
SpringRunnerは?
Bean同⼠の連携テストを⾏いたい…
テスト上でDIの機能を活⽤したい…
そんな時にSpringRunnerは使うみたいです。
1. JUnit上でSpringのDIコンテナを動かす機能
2. アプリケーションサーバ上にデプロイせずに、Spring MVCの動作を再現する機能
テスト上で@Autowiredが使えるようになるよ。
とりあえず、先輩⽅の作成した過去のテストを⾒てみよう 🙃
?????
SpringRunnerでは@MockBeanで
Mockitoでは@Mock?
@Mockと@MockBeanの違い
@Mock
@MockBean
SpringRunnerから提供されているアノテーションで、mockオブジェクト
が⽣成されると同時にアプリケーションコンテキストに追加される。
mockitoから提供されているアノテーションでmockオブジェクトの⽣成
をしてくれる。
噂のDIコンテナかぁって思って下さい
あ、そうだ、このtestではリクエストを⾏なっ
た際に返ってくるステータスの検証を
⾏なって下さい
?わかりました(分かったとは⾔ってない)
今までみたいにただメソッドを呼び出して返り値をチェックする
感じではなさげな匂いを察知
このクラスに対してリクエストを⾶ばしてステータスをみる的な
いい感じに何かしてくれる
おまじない達
DIしてるspringのやつが貼ってあるていで
返ってくるステータスが
200番かどうか 確認してます。
怒られました。
何で怒られているか
Beanが⾜りずに依存関係が組めていないのでエラーが起こっていました。
SpringでunitTestを実装してみよー!
DIされているビーンのモックを
ここで作る
いい感じ
プルリクを送るとーーー
な、なんだってー!?
最初から⾔ってくれい!!
承知です…。
あと、⼊⼒エラーだった場合に表⽰される
messageの検証もお願いします。
Bodyの中⾝を⾒るので,,,
Content()を⽐較でいいのか,,,?
エラーメッセージはjson形式でresponse bodyの中に
格納されて渡されることになってます。
{ ”errorMessage“: ”⼊⼒エラーです。" }
どうassertしようか 🧐
ライブラリーからjsonの部分抜粋してきました
Jsonpathを使⽤してアサートし無事解決
最終的にできたtestがこちら
springRunner奮闘記 ‒repository編
SpringRunnner?そんなんなれましたわww
Repository.classのテストしてね
承知です!!
データベースとのIntegration Test🤔
データベースへのIntegration Testになると思
うので使うアノテーション気をつけて
習うより慣れろ感覚でとりあえずやってみよー!
ちょっと待って、データのtestってことはsql流さなきゃいけないんじゃないか。。。?
とりあえず過去に作成されたテストを⾒返して、
このアノテーションを使わなきゃいけないのが分かった。
んえええ,テスト環境で
どうやってデータ作ればいいんだよ
実際にデータを登録できる⽅法があることを発⾒
初期データはここにInsertを書けばできる!!
INSERT INT book(code, name) VALUES (ʼ001ʼ, ʻ源⽒物語ʼ);
本を探すrepository
Entity
H2にある初期データを取得し、
アサートを⾏う
まとめ
• SpringRunnerを使⽤することによりテストの幅が広がる
• SpringでのUnitTestは描きやすい
• ⼀年初⼼者でもそれっぽくテストが書けるようになる
終わり

Mais conteúdo relacionado

Mais procurados

Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発Kenjiro Kubota
 
TDD のこころ @ OSH2014
TDD のこころ @ OSH2014TDD のこころ @ OSH2014
TDD のこころ @ OSH2014Takuto Wada
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みTakeshi Ogawa
 
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようShuto Suzuki
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
JIRA / Confluence の 必須プラグインはこれだ
JIRA / Confluence の必須プラグインはこれだJIRA / Confluence の必須プラグインはこれだ
JIRA / Confluence の 必須プラグインはこれだNarichika Kajihara
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -onozaty
 
分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方Recruit Lifestyle Co., Ltd.
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているKoichi Tanaka
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめpospome
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean ArchitectureAtsushi Nakamura
 
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところY Watanabe
 
ワタシはSingletonがキライだ
ワタシはSingletonがキライだワタシはSingletonがキライだ
ワタシはSingletonがキライだTetsuya Kaneuchi
 
TDD のこころ
TDD のこころTDD のこころ
TDD のこころTakuto Wada
 
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~Yuki Hirano
 
こわくない Git
こわくない Gitこわくない Git
こわくない GitKota Saito
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知るShuhei Fujita
 

Mais procurados (20)

Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発Laravelでfacadeを使わない開発
Laravelでfacadeを使わない開発
 
TDD のこころ @ OSH2014
TDD のこころ @ OSH2014TDD のこころ @ OSH2014
TDD のこころ @ OSH2014
 
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
 
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
JIRA / Confluence の 必須プラグインはこれだ
JIRA / Confluence の必須プラグインはこれだJIRA / Confluence の必須プラグインはこれだ
JIRA / Confluence の 必須プラグインはこれだ
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方分散トレーシングAWS:X-Rayとの上手い付き合い方
分散トレーシングAWS:X-Rayとの上手い付き合い方
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
トランザクションスクリプトのすすめ
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
 
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)今こそ知りたいSpring Web(Spring Fest 2020講演資料)
今こそ知りたいSpring Web(Spring Fest 2020講演資料)
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 
ワタシはSingletonがキライだ
ワタシはSingletonがキライだワタシはSingletonがキライだ
ワタシはSingletonがキライだ
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
TDD のこころ
TDD のこころTDD のこころ
TDD のこころ
 
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
JavaScriptの仕組みと未来のJavaScript ~ESNextとは~
 
こわくない Git
こわくない Gitこわくない Git
こわくない Git
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 

Spring 歴約1年初心者の Test 奮闘記