SlideShare ist ein Scribd-Unternehmen logo
1 von 57
Downloaden Sie, um offline zu lesen
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は描きやすい
• ⼀年初⼼者でもそれっぽくテストが書けるようになる
終わり

Weitere ähnliche Inhalte

Was ist angesagt?

Spring 5でSpring Testのここが変わる_公開版
Spring 5でSpring Testのここが変わる_公開版Spring 5でSpring Testのここが変わる_公開版
Spring 5でSpring Testのここが変わる_公開版Yuichi Hasegawa
 
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービューMasatoshi Tada
 
失敗事例で学ぶ負荷試験
失敗事例で学ぶ負荷試験失敗事例で学ぶ負荷試験
失敗事例で学ぶ負荷試験樽八 仲川
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと土岐 孝平
 
テスト分析入門 -「ゆもつよメソッド」を例に- #wacate
テスト分析入門 -「ゆもつよメソッド」を例に- #wacateテスト分析入門 -「ゆもつよメソッド」を例に- #wacate
テスト分析入門 -「ゆもつよメソッド」を例に- #wacateKinji Akemine
 
ペアプロするならgit-duetを使おう
ペアプロするならgit-duetを使おうペアプロするならgit-duetを使おう
ペアプロするならgit-duetを使おうShinya Nakajima
 
Junitを使ったjavaのテスト入門
Junitを使ったjavaのテスト入門Junitを使ったjavaのテスト入門
Junitを使ったjavaのテスト入門Satoshi Kubo
 
今さら聞けないDiとspring
今さら聞けないDiとspring今さら聞けないDiとspring
今さら聞けないDiとspring土岐 孝平
 
設計をする上で役にたった制約について
設計をする上で役にたった制約について設計をする上で役にたった制約について
設計をする上で役にたった制約についてIkki Takahashi
 
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)NTT DATA Technology & Innovation
 
C#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかC#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかYoshifumi Kawai
 
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢apkiban
 
スキトラ Spring + mybatis
スキトラ Spring + mybatisスキトラ Spring + mybatis
スキトラ Spring + mybatis小川 昌吾
 
Selenium WebDriver + python で E2Eテスト自動化
Selenium WebDriver + python で E2Eテスト自動化Selenium WebDriver + python で E2Eテスト自動化
Selenium WebDriver + python で E2Eテスト自動化JustSystems Corporation
 
What's new in Spring Batch 5
What's new in Spring Batch 5What's new in Spring Batch 5
What's new in Spring Batch 5ikeyat
 
これから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーションこれから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーション土岐 孝平
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −JustSystems Corporation
 

Was ist angesagt? (20)

Spring 5でSpring Testのここが変わる_公開版
Spring 5でSpring Testのここが変わる_公開版Spring 5でSpring Testのここが変わる_公開版
Spring 5でSpring Testのここが変わる_公開版
 
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
 
失敗事例で学ぶ負荷試験
失敗事例で学ぶ負荷試験失敗事例で学ぶ負荷試験
失敗事例で学ぶ負荷試験
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
テスト分析入門 -「ゆもつよメソッド」を例に- #wacate
テスト分析入門 -「ゆもつよメソッド」を例に- #wacateテスト分析入門 -「ゆもつよメソッド」を例に- #wacate
テスト分析入門 -「ゆもつよメソッド」を例に- #wacate
 
ペアプロするならgit-duetを使おう
ペアプロするならgit-duetを使おうペアプロするならgit-duetを使おう
ペアプロするならgit-duetを使おう
 
Junitを使ったjavaのテスト入門
Junitを使ったjavaのテスト入門Junitを使ったjavaのテスト入門
Junitを使ったjavaのテスト入門
 
今さら聞けないDiとspring
今さら聞けないDiとspring今さら聞けないDiとspring
今さら聞けないDiとspring
 
Spring と TDD
Spring と TDDSpring と TDD
Spring と TDD
 
SpringBootTest入門
SpringBootTest入門SpringBootTest入門
SpringBootTest入門
 
設計をする上で役にたった制約について
設計をする上で役にたった制約について設計をする上で役にたった制約について
設計をする上で役にたった制約について
 
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)
今から始めるWebClient(JSUG勉強会 2020年その6 LT大会)
 
C#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのかC#の強み、或いは何故PHPから乗り換えるのか
C#の強み、或いは何故PHPから乗り換えるのか
 
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
GraalVM の概要と、Native Image 化によるSpring Boot 爆速化の夢
 
スキトラ Spring + mybatis
スキトラ Spring + mybatisスキトラ Spring + mybatis
スキトラ Spring + mybatis
 
Selenium WebDriver + python で E2Eテスト自動化
Selenium WebDriver + python で E2Eテスト自動化Selenium WebDriver + python で E2Eテスト自動化
Selenium WebDriver + python で E2Eテスト自動化
 
What's new in Spring Batch 5
What's new in Spring Batch 5What's new in Spring Batch 5
What's new in Spring Batch 5
 
これから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーションこれから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーション
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −
メンバーのスキルアップ、どうしてる? − Java 100本ノックで新加入メンバーを鍛えてみた −
 

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