SlideShare a Scribd company logo
1 of 176
Download to read offline
© 2018 NTT DATA Corporation
2018/10/31
株式会社NTTデータ 生産技術部 ソフトウェア工学推進センタ
平栗 勇人
Spring 5でSpring Testのここが変わる
© 2018 NTT DATA Corporation 2
平栗 勇人
株式会社NTTデータ
技術革新統括本部
システム技術本部 生産技術部
ソフトウェア工学推進センタ
TERASOLUNA FWチーム
Server FWの開発リーダー
© 2018 NTT DATA Corporation 3
TERASOLUNAフレームワークのコンセプト
Spring
Security
Spring
MVC
JPA
MyBatis
1.OSSを組み合わせ、
独自実装部分を極小化
2.OSSの機能を最大限に
活かして開発するための
ベストプラクティスを提供
開発ガイドライン
http://terasolunaorg.github.io/
基盤としてSpringを採用している
© 2018 NTT DATA Corporation 4
はじめに
© 2018 NTT DATA Corporation 5
そもそも
© 2018 NTT DATA Corporation 6
なぜ、
テストを行うのか?
© 2018 NTT DATA Corporation 7
仕様通りに
動くことを
確認するため
© 2018 NTT DATA Corporation 8
どんなに優秀な
人間でもミスをする。
ミスをしない人間は、何もしない人間だけだ。
(The only man who never makes mistakes is
the man who never does anything.)
-- Theodore Roosevelt
© 2018 NTT DATA Corporation 9
自分の作成した
コードに責任を持ち、
© 2018 NTT DATA Corporation 10
安心して開発を
続けるために
テストは不可欠。
© 2018 NTT DATA Corporation 11
コーディングすれば
もれなく付きまとう
作業なので、
© 2018 NTT DATA Corporation 12
テストの効率性は、
生産性に直結。
© 2018 NTT DATA Corporation 13
Springは
テストしやすいの?
© 2018 NTT DATA Corporation 14
本日は、
それについてお話しします。
© 2018 NTT DATA Corporation 15
 Springとテスト
 クラスやメソッド単位でのテスト
 クラス同士を組み合わせたテスト
 Spring 5での変更点
 JUnit 5のサポート
 テスト並行実行のサポート
 その他の改善
 まとめ
© 2018 NTT DATA Corporation 16
 Springとテスト
 クラスやメソッド単位でのテスト
 クラス同士を組み合わせたテスト
 Spring 5での変更点
 JUnit 5のサポート
 テスト並行実行のサポート
 その他の改善
 まとめ
© 2018 NTT DATA Corporation 17
大規模な
アプリケーションでは、
© 2018 NTT DATA Corporation 18
バグを発見する
タイミングが
遅ければ遅いほど、
© 2018 NTT DATA Corporation 19
影響範囲は
大きくなる。
© 2018 NTT DATA Corporation 20
なので、
© 2018 NTT DATA Corporation 21
いかに早くバグを
発見できるかが重要。
© 2018 NTT DATA Corporation 22
バグを早期発見
するためには、
© 2018 NTT DATA Corporation 23
クラスやメソッドといった小さな
単位でテストすることが大切。
クラス A
依存
依存
クラス B
クラス C
メソッド1
メソッド2
JUnit
テスト
メソッド1
メソッド2
メソッド1
メソッド2
JUnit
テスト
JUnit
テスト
© 2018 NTT DATA Corporation 24
また、作成したらすぐにモックを
使ってテストできるのが理想。
クラス A
依存
依存
モック
クラス B
モック
クラス C
JUnit
テスト
メソッド1
メソッド2
© 2018 NTT DATA Corporation 25
しかし、疎結合を
意識しないと、
© 2018 NTT DATA Corporation 26
クラス単体で
試験すること自体が
難しくなる。
© 2018 NTT DATA Corporation 27
悪い例
© 2018 NTT DATA Corporation 28
public class A {
public String foo() {
B objB = new B();
// objB.doSomething()
// 処理結果に応じてreturn
}
}
A#foo()は、B#doSomething()の
処理結果に応じて”成功”、”失敗”を返す。
© 2018 NTT DATA Corporation 29
public class A {
public String foo() {
B objB = new B();
// objB.doSomething()
// 処理結果に応じてreturn
}
}
いま、クラスA単体の挙動をテストしたい。
© 2018 NTT DATA Corporation 30
A#foo()の戻り値が”失敗”であることを確
認するテストメソッドAを作成する。
class ATest {
@Test
void fooの戻り値が「失敗」であること() {
A objA = new A();
assertEquals(“失敗", objA.foo());
}
}
© 2018 NTT DATA Corporation 31
A#foo()内でBをnewしているため、
テスト実行時にBも実行する必要がある。
class ATest {
@Test
void fooの戻り値が「失敗」であること() {
A objA = new A();
assertEquals(“失敗", objA.foo());
}
}
public String foo() {
B objB = new B();
© 2018 NTT DATA Corporation 32
そして、このテストケースを通すためには、
class ATest {
@Test
void fooの戻り値が「失敗」であること() {
A objA = new A();
assertEquals(“失敗", objA.foo());
}
}
public String foo() {
B objB = new B();
© 2018 NTT DATA Corporation 33
B#doSomething()の処理を失敗させる
必要があり、初期化が煩雑になる。
class ATest {
@Test
void fooの戻り値が「失敗」であること() {
A objA = new A();
assertEquals(“失敗", objA.foo());
}
}
public String foo() {
B objB = new B();
© 2018 NTT DATA Corporation 34
そもそもクラス単体での試験に
なっていない。。。
class ATest {
@Test
void fooの戻り値が「失敗」であること() {
A objA = new A();
assertEquals(“失敗", objA.foo());
}
}
public String foo() {
B objB = new B();
© 2018 NTT DATA Corporation 35
メソッド内でnew
するだけで、疎結合
ではなくなってしまい、
© 2018 NTT DATA Corporation 36
単体テストの実施
そのものが難しくなる。
© 2018 NTT DATA Corporation 37
疎結合にする一つの
デザインパターンとして、
DIがある。
© 2018 NTT DATA Corporation 38
Springは、
フレームワークの
最重要機能として、
© 2018 NTT DATA Corporation 39
DIを自動で行い、
インスタンスを
組み立ててくれる基盤、
© 2018 NTT DATA Corporation 40
DIコンテナ
を
提供している。
© 2018 NTT DATA Corporation 41
クラス A
クラス Bの生成
クラス B
DIコンテナ
クラス A
利用
Bの実装クラス
クラス Aはクラス Bのインスタンスを直接生成している
Bのインタ
フェース
生成
通常のJava
SpringのDI
注入
DIコンテナがクラス Bのインスタンスを生成・注入している
クラス B
B objB = new B();
© 2018 NTT DATA Corporation 42
このように、
© 2018 NTT DATA Corporation 43
クラス間が疎結合
になるので、
© 2018 NTT DATA Corporation 44
クラス A
Bの実装クラス
Bのインタ
フェース
クラス B
モック
クラス B
依存クラスをモックに差し替えること
が可能になる。
差し替え可能
© 2018 NTT DATA Corporation 45
クラス A
Bの実装クラス
Bのインタ
フェース
クラス B
モック
クラス B
よって、クラス単体でのテストが可能
になる!
JUnit
テスト
© 2018 NTT DATA Corporation 46
クラス A
Bの実装クラス
Bのインタ
フェース
クラス B
モック
クラス B
モックテストは、Mockitoなどのモック
ライブラリを使うことが多い。
JUnit
テスト
© 2018 NTT DATA Corporation 47
 Springとテスト
 クラスやメソッド単位でのテスト
 クラス同士を組み合わせたテスト
 Spring 5での変更点
 JUnit 5のサポート
 テスト並行実行のサポート
 その他の改善
 まとめ
© 2018 NTT DATA Corporation 48
次に、単体テストを終えたクラス
同士を組み合わせてテストする
時を考えてみる。
クラス A
依存
依存
クラス B
モック
クラス C
JUnit
テスト
© 2018 NTT DATA Corporation 49
インスタンスの生成や依存性の
解決はDIコンテナが担っている
ので、
DIコンテナ
クラス A
利用
Bの実装クラス
Bのインタ
フェース
生成注入
クラス B
© 2018 NTT DATA Corporation 50
クラスBに依存するクラスAのテ
ストをするには、DIコンテナが必
要となる。しかし…、
DIコンテナ
クラス A
利用
Bの実装クラス
Bのインタ
フェース
生成注入
クラス B
© 2018 NTT DATA Corporation 51
JUnitなどのテスティングフレー
ムワーク上でDIコンテナを動か
すのは難しい…。
DIコンテナ
クラス A
利用
Bの実装クラス
Bのインタ
フェース
生成注入
クラス B
JUnit
テスト
© 2018 NTT DATA Corporation 52
しかし!
© 2018 NTT DATA Corporation 53
Springは、
結合テストを支援
するモジュールとして
© 2018 NTT DATA Corporation 54
Spring Test
を
提供している。
© 2018 NTT DATA Corporation 55
Spring Testに
含まれる
© 2018 NTT DATA Corporation 56
Spring
TestContext
Framework(TCF)
を用いると、
© 2018 NTT DATA Corporation 57
JUnitやTestNG
などのテスティング
フレームワーク上で
© 2018 NTT DATA Corporation 58
DIコンテナ
を動かせる!
© 2018 NTT DATA Corporation 59
クラス A
利用
注入
クラスA, BがDIコンテナ上で正しく動作するか
テストしたい。
生成
DIコンテナ
Bの実装クラス
Bのインタフェース
クラス B
© 2018 NTT DATA Corporation 60
はじめに、pom.xmlにspring-testの
ライブラリを追加する。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
© 2018 NTT DATA Corporation 61
次に、テストクラスでTestContext Framework
(TCF)を使うよう指定する。※詳細はのちほど
TestContext Framework
クラス A
利用
テストクラス A
Bの実装クラス
Bのインタ
フェース
クラス B
1. TCFを使うよ!
© 2018 NTT DATA Corporation 62
また、TCF上にDIコンテナを作成するためのBean
定義ファイルを指定する。
TestContext Framework
DIコンテナ
クラス A
利用
テストクラス A
Bの実装クラス
Bのインタ
フェース
クラス B
1. TCFを使うよ!
2. このBean定義ファ
イルをもとにDIコン
テナを作成して!
© 2018 NTT DATA Corporation 63
注入
以上の簡単な設定で、テスティングフレームワーク上
でDIコンテナと連携したテストが可能になる!
生成
クラス A
利用
テストクラス A
Bの実装クラス
Bのインタ
フェース
クラス B
TestContext Framework
DIコンテナ 注入 生成
1. TCFを使うよ!
2. このBean定義ファ
イルをもとにDIコン
テナを作成して!
© 2018 NTT DATA Corporation 64
では、
© 2018 NTT DATA Corporation 65
Spring 5で何が
変わったのだろうか
© 2018 NTT DATA Corporation 66
 Springとテスト
 クラスやメソッド単位でのテスト
 クラス同士を組み合わせたテスト
 Spring 5での変更点
 JUnit 5のサポート
 テスト並行実行のサポート
 その他の改善
 まとめ
目玉の改善!
© 2018 NTT DATA Corporation 67
Spring 5のSpring Testでは、
これからお話しする
JUnit 5のメリットを
© 2018 NTT DATA Corporation 68
すべて享受すること
ができます!
© 2018 NTT DATA Corporation 69
 Springとテスト
 クラスやメソッド単位でのテスト
 クラス同士を組み合わせたテスト
 Spring 5での変更点
 JUnit 5のサポート
 テスト並行実行のサポート
 その他の改善
 まとめ
・ JUnitの説明
・ JUnit 5の概要
・ JUnit 5のイケてるところ
・ TCFとの連携方法
© 2018 NTT DATA Corporation 70
JUnitは、以下を提供している。
・テストケースのフォーマット
・テストの実行基盤
・テストの期待値と実測値の検証API
JUnitの説明
© 2018 NTT DATA Corporation 71
簡単に言うと、
・テストケースのフォーマット
⇒どのようにテストを書いて、
・テストの実行基盤
⇒どのように実行し、
・テストの期待値と実測値の検証API
⇒どのように検証するか
JUnitの説明
© 2018 NTT DATA Corporation 72
 Springとテスト
 クラスやメソッド単位でのテスト
 クラス同士を組み合わせたテスト
 Spring 5での変更点
 JUnit 5のサポート
 テスト並行実行のサポート
 その他の改善
 まとめ
・ JUnitの説明
・ JUnit 5の概要
・ JUnit 5のイケてるところ
・ TCFとの連携方法
© 2018 NTT DATA Corporation 73
2017年、
JUnit 5の概要
© 2018 NTT DATA Corporation 74
JUnit 5が
リリースされました。
JUnit 5の概要
© 2018 NTT DATA Corporation 75
実に10年ぶりの
メジャーアップデート
JUnit 5の概要
© 2018 NTT DATA Corporation 76
JUnit 5は、
3つのサブプロジェクトで
構成される。
JUnit 5 = Platform + Jupiter + Vintage
JUnit 5の概要
© 2018 NTT DATA Corporation 77
JUnit 5の概要
Eclipse, STS, IntelliJ IDEA, Maven, Gradle etc.
JUnit Platform
JUnit Vintage JUnit Jupiter
3rd party
JUnit 3,4の
テスト
JUnit 5の
テスト
その他の
テスト
共通的な実行エンジン
実行API
JUnit3, 4
実行エンジン
実装
API
JUnit 5
実行エンジン
© 2018 NTT DATA Corporation 78
JUnit 5=
JUnit Platform +
JUnit Jupiter +
JUnit Vintage
用途や環境に合わせて適切な
ライブラリを取り込む。
JUnit 5の概要
© 2018 NTT DATA Corporation 79
サポートされる
Javaのバージョンは、
Java 8 以上
JUnit 5の概要
© 2018 NTT DATA Corporation 80
 Springとテスト
 クラスやメソッド単位でのテスト
 クラス同士を組み合わせたテスト
 Spring 5での変更点
 JUnit 5のサポート
 テスト並行実行のサポート
 その他の改善
 まとめ
・ JUnitの説明
・ JUnit 5の概要
・ JUnit 5のイケてるところ
・ TCFとの連携方法
© 2018 NTT DATA Corporation 81
JUnit 5はどこが
イケてるの?
JUnit 5のイケてるところ
© 2018 NTT DATA Corporation 82
JUnit 5のイケてるところ
・ネストしたテスト
・パラメータ化テスト
・アサーションAPIの強化
・条件付きテスト
JUnit 5のイケてるところ
© 2018 NTT DATA Corporation 83
これからお話しするJUnit 5
のAPIの中には、一部実験
的なものも含まれます。
JUnit 5のイケてるところ
© 2018 NTT DATA Corporation 84
JUnit 5のイケてるところ
・ネストしたテスト
・パラメータ化テスト
・アサーションAPIの強化
・条件付きテスト
JUnit 5のイケてるところ
© 2018 NTT DATA Corporation 85
網羅的にテストしようと
すると、テストメソッドは
増えますよね?
JUnit 5のイケてるところ: ネストしたテスト
© 2018 NTT DATA Corporation 86
大量のテストメソッドが
並列に
実装されていると、
JUnit 5のイケてるところ: ネストしたテスト
© 2018 NTT DATA Corporation 87
テストコードを見たときに
各テストケースの意図を
読み解くのが難しくなる。
JUnit 5のイケてるところ: ネストしたテスト
© 2018 NTT DATA Corporation 88
JUnit 5のイケてるところ: ネストしたテスト
JUnit 4
~並列で書いたとき~
@Before
public void setUp() {
// リストの初期化(0件)
}
@Test
public void sizeメソッドの確認_リストが初期状態() {
// 0が返されることの確認
}
@Test
public void sizeメソッドの確認_リストが1件() {
// リストに1件追加
// 1が返されることの確認
}
@Test
public void isEmptyメソッドの確認_リストが初期状態() {
// trueが返されることの確認
}
@Test
public void isEmptyメソッドの確認_リストが1件() {
// リストに1件追加
// falseが返されることの確認
}
各テストケースの観点が
読み取りずらくなる
同じような初期化処理
が重複する
同じような初期化処理
が重複する
© 2018 NTT DATA Corporation 89
解決するためには、
JUnit 5のイケてるところ: ネストしたテスト
© 2018 NTT DATA Corporation 90
テストメソッドを何らか
の基準でグループ化
する必要がある。
JUnit 5のイケてるところ: ネストしたテスト
© 2018 NTT DATA Corporation 91
JUnit 実践入門
によると、
JUnit 5のイケてるところ: ネストしたテスト
© 2018 NTT DATA Corporation 92
「テストケースは共通の
初期化処理をもつもの
でグループ化すべき」
JUnit 5のイケてるところ: ネストしたテスト
© 2018 NTT DATA Corporation 93
とあります。
JUnit 5のイケてるところ: ネストしたテスト
© 2018 NTT DATA Corporation 94
JUnit 4では、
JUnit 5のイケてるところ: ネストしたテスト
© 2018 NTT DATA Corporation 95
@RunWith(Enclosed.class)
を利用して
次のように書けた。
JUnit 5のイケてるところ: ネストしたテスト
© 2018 NTT DATA Corporation 96
JUnit 5のイケてるところ: ネストしたテスト
JUnit 4
~グループ化~
@RunWith(Enclosed.class)
public class ListTestEnclosedExmaple {
public static class リストが初期状態 {
@Before
public void setUp() {} //リストの初期化(0件)
@Test
public void sizeメソッドの確認() {}
@Test
public void isEmptyメソッドの確認() {}
}
public static class リストが1件 {
@Before
public void setUp() {} //リストの初期化後、1件追加
@Test
public void sizeメソッドの確認() {}
@Test
public void isEmptyメソッドの確認() {}
}
}
アウタークラスに
@RunWith
(Enclosed.class)
を付与する。
© 2018 NTT DATA Corporation 97
JUnit 5のイケてるところ: ネストしたテスト
JUnit 4
~グループ化~
@RunWith(Enclosed.class)
public class ListTestEnclosedExmaple {
public static class リストが初期状態 {
@Before
public void setUp() {} //リストの初期化(0件)
@Test
public void sizeメソッドの確認() {}
@Test
public void isEmptyメソッドの確認() {}
}
public static class リストが1件 {
@Before
public void setUp() {} //リストの初期化後、1件追加
@Test
public void sizeメソッドの確認() {}
@Test
public void isEmptyメソッドの確認() {}
}
}
staticインナークラスで、
同じ初期化処理が必要な
テストケースをグループ化。
staticインナークラスで、
同じ初期化処理が必要な
テストケースをグループ化。
© 2018 NTT DATA Corporation 98
staticなので、
アウタークラスのメンバに
アクセスできない。
JUnit 5のイケてるところ: ネストしたテスト
© 2018 NTT DATA Corporation 99
JUnit 5のイケてるところ: ネストしたテスト
@RunWith(Enclosed.class)
public class ListTestEnclosedExmaple {
@Before
public void setUp() {} //リストの初期化(0件)
public static class リストが初期状態 {
@Test
public void sizeメソッドの確認() {}
@Test
public void isEmptyメソッドの確認() {}
}
public static class リストが1件 {
@Before
public void setUp() {} //リストに1件追加
@Test
public void sizeメソッドの確認() {}
@Test
public void isEmptyメソッドの確認() {}
}
}
このように、全体的な初期
化処理をアウタークラスに
書けばもっとスッキリしそう
だけど、制約上できない。
JUnit 4
~仕様上の制約~
© 2018 NTT DATA Corporation 100
JUnit 5では
そのような実装が
可能になる!
JUnit 5のイケてるところ: ネストしたテスト
© 2018 NTT DATA Corporation 101
JUnit 5の新API
@Nested
を使うと、
※@RunWith(Enclosed.class)は廃止。
JUnit 5のイケてるところ: ネストしたテスト
© 2018 NTT DATA Corporation 102
JUnit 5のイケてるところ: ネストしたテスト
JUnit 5
~ネスト化~
class ListTestNestedExample {
@BeforeEach
void setUp() {} //リストの初期化(0件)
@Nested
class リストが初期状態 {
@Test
void sizeメソッドの確認() {}
@Test
void isEmptyメソッドの確認() {}
}
@Nested
class リストが1件 {
@BeforeEach
void setUp() {} //リストに1件追加
@Test
void sizeメソッドの確認() {}
@Test
void isEmptyメソッドの確認() {}
}
}
非staticインナークラスに
@Nestedアノテーションを付
与し、同じ初期化処理が必
要なテストケースをグループ化
(深さ1でネスト化)。
© 2018 NTT DATA Corporation 103
JUnit 5のイケてるところ: ネストしたテスト
JUnit 5
~ネスト化~
class ListTestNestedExample {
@BeforeEach
void setUp() {} //リストの初期化(0件)
@Nested
class リストが初期状態 {
@Test
void sizeメソッドの確認() {}
@Test
void isEmptyメソッドの確認() {}
}
@Nested
class リストが1件 {
@BeforeEach
void setUp() {} //リストに1件追加
@Test
void sizeメソッドの確認() {}
@Test
void isEmptyメソッドの確認() {}
}
}
Tips: JUnit 5の変更点
①public修飾子が省略可
能
Tips: JUnit 5の変更点①
クラスやメソッドのpublic修飾子
が省略可能になった。
© 2018 NTT DATA Corporation 104
JUnit 5のイケてるところ: ネストしたテスト
JUnit 5
~ネスト化~
class ListTestNestedExample {
@BeforeEach
void setUp() {} //リストの初期化(0件)
@Nested
class リストが初期状態 {
@Test
void sizeメソッドの確認() {}
@Test
void isEmptyメソッドの確認() {}
}
@Nested
class リストが1件 {
@BeforeEach
void setUp() {} //リストに1件追加
@Test
void sizeメソッドの確認() {}
@Test
void isEmptyメソッドの確認() {}
}
}
Tips: JUnit 5の変更点②
前処理/後処理アノテーションが変
わった。
@Before/After
⇒@BeforeEach/AfterEach
@BeforeClass/AfterClass
⇒@BeforeAll/AfterAll
© 2018 NTT DATA Corporation 105
JUnit 5のイケてるところ: ネストしたテスト
@Nested
class A{
@Nested
class B{
@Nested
class C{
}
}
}
JUnit 5
~ネスト化~
ネストはいくらでも深くすることができ、
継承関係を保ったままテストケース
を構造化できる!
© 2018 NTT DATA Corporation 106
JUnit 5のイケてるところ
・ネストしたテスト
・パラメータ化テスト
・アサーションAPIの強化
・条件付きテスト
JUnit 5のイケてるところ
© 2018 NTT DATA Corporation 107
テストケースが
大量になった場合、
JUnit 5のイケてるところ: パラメータ化テスト
© 2018 NTT DATA Corporation 108
初期化処理ごとに
テストメソッドをグループ化
するだけではなく、
JUnit 5のイケてるところ: パラメータ化テスト
© 2018 NTT DATA Corporation 109
引数のバリエーション
テストを一つのテスト
メソッドで書けると、
JUnit 5のイケてるところ: パラメータ化テスト
© 2018 NTT DATA Corporation 110
もっと見通しが良くなる。
JUnit 5のイケてるところ: パラメータ化テスト
© 2018 NTT DATA Corporation 111
JUnit 4では、
JUnit 5のイケてるところ: パラメータ化テスト
© 2018 NTT DATA Corporation 112
@RunWith(Theories.class)
を利用して
それが実現できた。
JUnit 5のイケてるところ: パラメータ化テスト
© 2018 NTT DATA Corporation 113
JUnit 5のイケてるところ: パラメータ化テスト
JUnit 4
~パラメータ化していない例~
public class NonParameterizedExample {
//ageCheckメソッドに未成年の年齢を渡したときのテスト
@Test
public void ageCheckメソッド_0歳() {}
@Test
public void ageCheckメソッドの確認_10歳() {}
@Test
public void ageCheckメソッドの確認_19歳() {}
}
入力値のバリエーションテス
トをメソッドごとに書いている。
© 2018 NTT DATA Corporation 114
JUnit 5のイケてるところ: パラメータ化テスト
JUnit 4
~パラメータ化後~
@RunWith(Theories.class)
public class ParameterizedExample {
@DataPoints("child")
public static int[] VALUES_CHILD = { 0, 10, 19 };
@Theory
public void ageCheckメソッドの確認_未成年(
@FromDataPoints("child") int age) {}
}
アウタークラスに
@RunWith(Theories.class)
を付与する。
© 2018 NTT DATA Corporation 115
JUnit 5のイケてるところ: パラメータ化テスト
JUnit 4
~パラメータ化後~
@RunWith(Theories.class)
public class ParameterizedExample {
@DataPoints("child")
public static int[] VALUES_CHILD = { 0, 10, 19 };
@Theory
public void ageCheckメソッドの確認_未成年(
@FromDataPoints("child") int age) {}
}
テスト対象メソッドの戻り値が同値なテス
トケースをひとまとめにし、引数をもつテス
トメソッドを作成する。(パラメータ化)
メソッドには@Theoryを付与する。
© 2018 NTT DATA Corporation 116
JUnit 5のイケてるところ: パラメータ化テスト
JUnit 4
~パラメータ化後~
@RunWith(Theories.class)
public class ParameterizedExample {
@DataPoints("child")
public static int[] VALUES_CHILD = { 0, 10, 19 };
@Theory
public void ageCheckメソッドの確認_未成年(
@FromDataPoints("child") int age) {}
}
入力パラメータは、staticな変数に
@DataPointsを付与して定義する。
© 2018 NTT DATA Corporation 117
JUnit 5では
さらに簡潔に、
高機能になった!
JUnit 5のイケてるところ: パラメータ化テスト
© 2018 NTT DATA Corporation 118
JUnit 5の新API
@ParameterizedTest
を使うと、
※@RunWith(Theories.class)は廃止。
JUnit 5のイケてるところ: パラメータ化テスト
© 2018 NTT DATA Corporation 119
JUnit 5のイケてるところ: パラメータ化テスト
class ParameterizedExampleJunit5 {
@ParameterizedTest
@ValueSource(ints = { 0, 10, 19 })
void ageCheckメソッドの確認_未成年(int age) {}
}
パラメータ化したいテストメソッドに
@ParameterizedTestを付与する。
JUnit 5
~パラメータ化~
© 2018 NTT DATA Corporation 120
JUnit 5のイケてるところ: パラメータ化テスト
class ParameterizedExampleJunit5 {
@ParameterizedTest
@ValueSource(ints = { 0, 10, 19 })
void ageCheckメソッドの確認_未成年(int age) {}
}
入力パラメータは、テストメソッドに付
与した@ValueSourceで定義する。
JUnit 5
~パラメータ化~
© 2018 NTT DATA Corporation 121
JUnit 5のイケてるところ: パラメータ化テスト
Double, int, long,
String変数を指定
@ValueSource(double[], int[], long[],
String[])
Enum定数を指定 @EnumSource(Enumクラス)
Streamや配列を返
すメソッドを指定
@MethodSource(“メソッド名”)
CSV形式で値を指定 @CsvSource({“x1,y1”, “x2,y2”})
CSVファイルを指定 @CsvFileSource(resources=“CSVファイル名”)
JUnit 5
~パラメータ化~
Tips:
以下のようなパラメータ定義アノテー
ションが提供されている。
© 2018 NTT DATA Corporation 122
パラメータ化テストのAPIは、
2018/10/31現在、実験的
なAPIとして提供されている。
JUnit 5のイケてるところ: パラメータ化テスト
© 2018 NTT DATA Corporation 123
JUnit 5のイケてるところ
・ネストしたテスト
・パラメータ化テスト
・アサーションAPIの強化
・条件付きテスト
JUnit 5のイケてるところ
© 2018 NTT DATA Corporation 124
アサーションに関しても
進化した!
JUnit 5のイケてるところ: アサーションAPIの強化
© 2018 NTT DATA Corporation 125
新しいAPIの追加
・assertAll()
・assertThrows()
・assertTimeout() など
JUnit 5のイケてるところ: アサーションAPIの強化
© 2018 NTT DATA Corporation 126
JUnit 5のイケてるところ: アサーションAPIの強化
JUnit 5
~assertAll()~
バグを仕込んだPersonクラス
public class Person {
public String getFirstName() {
return "";
}
public String getLastName() {
return "Hirakuri";
}
public String getAge() {
return "";
}
}
“Yuto”を返したい。
“29”を返したい。
© 2018 NTT DATA Corporation 127
JUnit 5のイケてるところ: アサーションAPIの強化
@Test
void person情報が正しく取得できているか確認() {
assertEquals("Yuto", person.getFirstName());
assertEquals("Hirakuri", person.getLastName());
assertEquals("29", person.getAge());
}
JUnit 5
~assertAll()~
今まで
© 2018 NTT DATA Corporation 128
JUnit 5のイケてるところ: アサーションAPIの強化
一番最初のアサーションで失敗すると、
以後のアサーションが実行されない。
JUnit 5
~assertAll()~
© 2018 NTT DATA Corporation 129
JUnit 5のイケてるところ: アサーションAPIの強化
JUnit 5
~assertAll()~
assertAll()使用
@Test
void person情報が正しく取得できているか確認_All() {
assertAll(
() -> assertEquals(“Yuto”, person.getFirstName()),
() -> assertEquals(“Hirakuri”, person.getLastName()),
() -> assertEquals("29", person.getAge())
);
}
© 2018 NTT DATA Corporation 130
JUnit 5のイケてるところ: アサーションAPIの強化
JUnit 5
~assertAll()~
一番最初のアサーションで失敗しても、
最後のアサーションまで実行される!
© 2018 NTT DATA Corporation 131
JUnit 5のイケてるところ: アサーションAPIの強化
public class Calculator {
public String divide(String a, String b) {
return String.valueOf(Integer.parseInt(a)
/ Integer.parseInt(b));
}
}
JUnit 5
~assertThrows()~
割り算をするdivideメソッド
© 2018 NTT DATA Corporation 132
JUnit 5のイケてるところ: アサーションAPIの強化
今まで
@Test(expected = ArithmeticException.class)
public void ゼロ除算時に算術例外の発生確認() {
calc.divide("5", "0");
}
@Testのexpected
属性に例外クラスを指
定して確認していた。
JUnit 5
~assertThrows()~
© 2018 NTT DATA Corporation 133
JUnit 5のイケてるところ: アサーションAPIの強化
assertThrows()使用
@Test
void ゼロ除算時に算術例外の発生確認() {
assertThrows(ArithmeticException.class,
() -> calc.divide("5", "0"));
}
メソッド内で自然なスタ
イルで書ける。
JUnit 5
~assertThrows()~
© 2018 NTT DATA Corporation 134
JUnit 5のイケてるところ: アサーションAPIの強化
今まで
JUnit 5
~assertThrows()~
@Test
public void ゼロ除算時の算術例外メッセージ確認() {
try {
calc.divide("5", "0");
fail();
} catch (ArithmeticException e) {
assertEquals("/ by zero", e.getMessage());
}
}
例外メッセージを確認す
るときは、try-catchを
使って書いていた。
© 2018 NTT DATA Corporation 135
JUnit 5のイケてるところ: アサーションAPIの強化
assertThrows()使用
JUnit 5
~assertThrows()~
@Test
void ゼロ除算時の算術例外メッセージ確認() {
Throwable e = assertThrows(
ArithmeticException.class,
() -> calc.divide("5", "0"));
assertEquals("/ by zero", e.getMessage());
}
Throwableオブジェクト
を返すので、try-catch
を使わずに書ける!
© 2018 NTT DATA Corporation 136
assertThat()がJUnitライブラリから
削除されました。
背景: JUnit 5から「Matcherは、ユーザが自由に選んでね」
というスタンスをとっているため、HamcrestのMatcher依存
であったassertThat()も切り離された。
https://github.com/junit-team/junit5/wiki/OLD-Assertion-API#reasons-not-to-introduce-yet-another-assertion-apilibrary
⇒JUnit 5でassertThat()を使いたい場合は、
Hamcrestライブラリを使えばOK!
JUnit 5のイケてるところ: アサーションAPIの強化
補足
© 2018 NTT DATA Corporation 137
JUnit 5のイケてるところ
・ネストしたテスト
・パラメータ化テスト
・アサーションAPIの強化
・条件付きテスト
JUnit 5のイケてるところ
© 2018 NTT DATA Corporation 138
あるテストケースを
一時的に無効にしたい時、
JUnit 5のイケてるところ: 条件付きテスト
© 2018 NTT DATA Corporation 139
JUnit 4
@Ignore
JUnit 5のイケてるところ: 条件付きテスト
JUnit 5
@Disabled
© 2018 NTT DATA Corporation 140
JUnit 5は
それだけではない。
JUnit 5のイケてるところ: 条件付きテスト
© 2018 NTT DATA Corporation 141
条件に応じて
有効/無効にできる!
JUnit 5のイケてるところ: 条件付きテスト
© 2018 NTT DATA Corporation 142
JUnit 5のイケてるところ: 条件付きテスト
JUnit 5
~条件付きテスト実行~
class OSExmaple {
@Test
@EnabledOnOs({ OS.WINDOWS })
@EnabledOnJre({ JRE.JAVA_8, JRE.JAVA_9 })
void windowsかつJREバージョンが8か9でのみ実行() {}
}
実行環境ごとにテストケースを
有効/無効にできる!
© 2018 NTT DATA Corporation 143
JUnit 5のイケてるところ: 条件付きテスト
OSを条件に有効/無効 @EnabledOnOs(OS.WINDOWS)
@DisabledOnOs({OS.LINUX, OS.MAC})
Java実行環境を条件に
有効/無効
@EnabledOnJre(JRE.JAVA_8)
@DisabledOnJre({JRE.JAVA_9, JRE.JAVA_10})
JVMシステムプロパティを条
件に有効/無効
@EnabledIfSystemProperty(named = "os.arch",
matches = ".*64.*")
@DisabledIfSystemProperty(named = "ci-server",
matches = "true")
環境変数を条件に有効/
無効
@EnabledIfEnvironmentVariable(named = "ENV",
matches = "staging-server")
@DisabledIfEnvironmentVariable(named = "ENV",
matches = ".*development.*")
JUnit 5
~条件付きテスト実行~
© 2018 NTT DATA Corporation 144
JUnit 5のイケてるところ
・ネストしたテスト
・パラメータ化テスト
・アサーションAPIの強化
・条件付きテスト
JUnit 5のイケてるところ
© 2018 NTT DATA Corporation 145
そんなイケてる
JUnit 5ですが、
© 2018 NTT DATA Corporation 146
Spring TestContext
Framework
と連携するにあたっては
© 2018 NTT DATA Corporation 147
ドラスティックな
仕様変更がありました。
© 2018 NTT DATA Corporation 148
JUnitの拡張方法が一本化
Runner
(@RunWith)
Rule
(@Rule)
ClassRule
(@ClassRule)
Extension
(@ExtendWith)
JUnit 4 JUnit 5
© 2018 NTT DATA Corporation 149
今までは、JUnit上でSpring TestContext
Frameworkを動作させるために、Runnerを使
用していた。
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class ABIntegrationTestJUnit4 {
}
Spring Testから提供されている
SpringJUnit4ClassRunnerを
@RunWithで指定。
© 2018 NTT DATA Corporation 150
JUnit 5からは同様の
手段が取れなくなって
しまいましたが、
© 2018 NTT DATA Corporation 151
Spring 5の
Spring Testでは、
仕様変更に追従!
© 2018 NTT DATA Corporation 152
JUnit 5が提供している
Extensionを利用して、
© 2018 NTT DATA Corporation 153
JUnit 5上で
TCFを動かすための
サポートクラスを提供!
© 2018 NTT DATA Corporation 154
 Springとテスト
 クラスやメソッド単位でのテスト
 クラス同士を組み合わせたテスト
 Spring 5での変更点
 JUnit 5のサポート
 テスト並行実行のサポート
 その他の改善
 まとめ
・ JUnitの説明
・ JUnit 5の概要
・ JUnit 5のイケてるところ
・ TCFとの連携方法
© 2018 NTT DATA Corporation 155
JUnit 5上でSpring TestContext Framework
を動かすための設定方法(ベーシックな方法)
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = AppConfig.class)
class ABIntegrationTest {
}
@ExtendWithのvalue属性
に、JUnit 5上でTCFを動かす
ためのExtensionクラスを指定
する。
© 2018 NTT DATA Corporation 156
JUnit 5上でSpring TestContext Framework
を動かすための設定方法(ベーシックな方法)
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = AppConfig.class)
class ABIntegrationTest {
}
@ContextConfigurationの
classes属性に、DIコンテナを
作成する際のBean定義ファイ
ルを指定する。
© 2018 NTT DATA Corporation 157
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
@SpringJUnitConfig(classes = AppConfig.class)
class ABIntegrationTest {
} @SpringJUnitConfig =
@ExtendWith(SpringExtension.class)+
@ContextConfiguration
Tip:
Webアプリ向けのDIコンテナを作成する、@SpringJUnitWebConfigも提供されている。
(@SpringJUnitWebConfig=@SpringJUnitConfig + @WebApplicationConfig)
JUnit 5上でSpring TestContext Framework
を動かすための設定方法(@SpringJUnitConfig)
© 2018 NTT DATA Corporation 158
JUnit 5には実験的なAPI
が数多く存在するので、
使用の際は注意。
https://junit.org/junit5/docs/current/user-guide/#api-evolution-experimental-apis
© 2018 NTT DATA Corporation 159
 Springとテスト
 クラスやメソッド単位でのテスト
 クラス同士を組み合わせたテスト
 Spring 5での変更点
 JUnit 5のサポート
 テスト並行実行のサポート
 その他の改善
 まとめ
© 2018 NTT DATA Corporation 160
JUnit 4.7/5.3以降、
テストの並行実行が
可能になったが、
Spring 5変更点:テスト並行実行のサポート
© 2018 NTT DATA Corporation 161
Spring 4では、
TCFを使用したテストは
並行実行できなかった。
Spring 5変更点:テスト並行実行のサポート
© 2018 NTT DATA Corporation 162
Spring 5からは、
TCFを使用したテストも
並行実行が可能になった!
Spring 5変更点:テスト並行実行のサポート
© 2018 NTT DATA Corporation 163
MavenでJUnit 5テストの並行実行をする設定例
Spring 5変更点:テスト並行実行のサポート
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<properties>
<configurationParameters>
junit.jupiter.execution.parallel.enabled=true
junit.jupiter.execution.parallel.config.strategy=fixed
junit.jupiter.execution.parallel.config.fixed.parallelism=20
</configurationParameters>
</properties>
<reportFormat>plain</reportFormat>
</configuration>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.3.1</version>
</dependency>
</dependencies>
</plugin>
maven-surefire-pluginの
configurationParametersに以下を設定
・enabled=true (有効)
・parallelism=20 (同時スレッド数)
・strategy=fixed (スレッド数固定)
© 2018 NTT DATA Corporation 164
MavenでJUnit 5テストの並行実行をする設定例
Spring 5変更点:テスト並行実行のサポート
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.0</version>
<configuration>
<properties>
<configurationParameters>
junit.jupiter.execution.parallel.enabled=true
junit.jupiter.execution.parallel.config.strategy=fixed
junit.jupiter.execution.parallel.config.fixed.parallelism=20
</configurationParameters>
</properties>
<reportFormat>plain</reportFormat>
</configuration>
<dependencies>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-surefire-provider</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.3.1</version>
</dependency>
</dependencies>
</plugin>
JUnit 5.3から試験的に並行実行をサポー
トしている。
© 2018 NTT DATA Corporation 165
Spring 5変更点:テスト並行実行のサポート
実行してみる。
@SpringJUnitConfig(classes = AppConfig.class)
class TestingTimeTest {
@Test
void テスト001() throws InterruptedException {
Thread.sleep(1000);
}
@Test
void テスト002() throws InterruptedException {}
・・・
@Test
void テスト020() throws InterruptedException {}
実行に1秒かかる
テストケースを20個用意
Spring TestContext Frameworkを
使用する。
© 2018 NTT DATA Corporation 166
Spring 5変更点:テスト並行実行のサポート
20スレッドで並行実行した結果
並行実行通常実行
20.8秒 1.7秒
12倍の高速化!
© 2018 NTT DATA Corporation 167
以下の場合は、並行実行NG!
・@DirtiesContextでテストメソッド実
行後にApplicationContextのキャッ
シュを破棄している場合
・@FixMethodOrderでテストメソッドの
実行順序を指定している場合
・テストケースがDBやファイルシステムの状
態に依存する場合
Spring 5変更点:テスト並行実行のサポート
© 2018 NTT DATA Corporation 168
 Springとテスト
 クラスやメソッド単位でのテスト
 クラス同士を組み合わせたテスト
 Spring 5での変更点
 JUnit 5のサポート
 テスト並行実行のサポート
 その他の改善
 まとめ
© 2018 NTT DATA Corporation 169
JUnitの前処理の直後、後処
理の直前で呼び出されるコール
バックメソッドが追加された
MockMVCを利用したテスト
の結果にリクエストBODYが出
力できるようになった
MockMVC利用時に「リダイレ
クト先URL」と「フォワード先
URL」を検証する際に、期待値
にURIテンプレートを指定でき
るようになった
XMLUnit 2.3のサポート
Spring 5変更点: その他の改善
https://github.com/spring-projects/spring-framework/wiki/What's-New-in-Spring-Framework-5.x#testing-improvements
© 2018 NTT DATA Corporation 170
 Springとテスト
 クラスやメソッド単位でのテスト
 クラス同士を組み合わせたテスト
 Spring 5での変更点
 JUnit 5のサポート
 テスト並行実行のサポート
 その他の改善
 まとめ
© 2018 NTT DATA Corporation 171
Springは
テストがしやすい!
© 2018 NTT DATA Corporation 172
Spring 5で
さらにテスト
しやすくなった!
© 2018 NTT DATA Corporation 173
Springはテストでも、
最先端技術に
追従している!
© 2018 NTT DATA Corporation 174
アプリケーション開発
をするならSpring!
© 2018 NTT DATA
Corporation
© 2018 NTT DATA Corporation 176
* https://qiita.com/kazuki43zoo/items/4a9ead225a9a9897af4a
* http://www.atmarkit.co.jp/ait/articles/0504/29/news022_3.html
* https://qiita.com/hshimo/items/1136087e1c6e5c5b0d9f
* https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-5.x
* https://www.infoq.com/jp/news/2017/10/junit5-released
* https://speakerdeck.com/rshindo/jjug-ccc-2018-spring
* https://oohira.github.io/junit5-doc-jp/user-guide/
* https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-5.x
* https://dev.classmethod.jp/testing/unittesting/junit-dynamic-test-case-using-runner/
* https://developer.ibm.com/dwblog/2017/best-new-features-junit-5/
* https://mike-neck.hatenadiary.com/entry/2017/01/01/160244
* https://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-MJ16-JUnit5.pdf
* https://www.slideshare.net/OgawaTakeshi/spring-tdd?ref=http://springfest2017.springframework.jp/
* https://gihyo.jp/dev/serial/01/tdd/0012
* https://www.slideshare.net/uesaka/build-insider-moqfakes
* https://qiita.com/1000k/items/aef6aed46b0fc34cc15e
* http://acro-engineer.hatenablog.com/entry/2017/12/07/120000
* https://speakerdeck.com/irof/dousiyoujunit5
* https://dev.classmethod.jp/testing/unittesting/where-is-junit5-aheaded/
* https://www.youtube.com/watch?v=h0Idcz71Aog
* http://www.ne.jp/asahi/hishidama/home/tech/java/junit/5/assertion.html
* Spring徹底入門
* JUnit実践入門
参考文献

More Related Content

What's hot

Knative Eventing 入門(Kubernetes Novice Tokyo #11 発表資料)
Knative Eventing 入門(Kubernetes Novice Tokyo #11 発表資料)Knative Eventing 入門(Kubernetes Novice Tokyo #11 発表資料)
Knative Eventing 入門(Kubernetes Novice Tokyo #11 発表資料)NTT DATA Technology & Innovation
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
これから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーションこれから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーション土岐 孝平
 
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)NTT DATA Technology & Innovation
 
Unified JVM Logging
Unified JVM LoggingUnified JVM Logging
Unified JVM LoggingYuji Kubota
 
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)NTT DATA Technology & Innovation
 
DockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐるDockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐるKohei Tokunaga
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
インフラCICDの勘所
インフラCICDの勘所インフラCICDの勘所
インフラCICDの勘所Toru Makabe
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話JustSystems Corporation
 
基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装Masatoshi Tada
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション土岐 孝平
 
他社製品と比較した際のAuth0のいいところ
他社製品と比較した際のAuth0のいいところ他社製品と比較した際のAuth0のいいところ
他社製品と比較した際のAuth0のいいところSatoshi Takayanagi
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るGo Miyasaka
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと土岐 孝平
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き土岐 孝平
 

What's hot (20)

Knative Eventing 入門(Kubernetes Novice Tokyo #11 発表資料)
Knative Eventing 入門(Kubernetes Novice Tokyo #11 発表資料)Knative Eventing 入門(Kubernetes Novice Tokyo #11 発表資料)
Knative Eventing 入門(Kubernetes Novice Tokyo #11 発表資料)
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 
これから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーションこれから始めるSpringのwebアプリケーション
これから始めるSpringのwebアプリケーション
 
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
 
Unified JVM Logging
Unified JVM LoggingUnified JVM Logging
Unified JVM Logging
 
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
Kubernetes環境に対する性能試験(Kubernetes Novice Tokyo #2 発表資料)
 
DockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐるDockerとKubernetesをかけめぐる
DockerとKubernetesをかけめぐる
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
インフラCICDの勘所
インフラCICDの勘所インフラCICDの勘所
インフラCICDの勘所
 
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
 
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装基礎からのOAuth 2.0とSpring Security 5.1による実装
基礎からのOAuth 2.0とSpring Security 5.1による実装
 
Helidon 概要
Helidon 概要Helidon 概要
Helidon 概要
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
 
他社製品と比較した際のAuth0のいいところ
他社製品と比較した際のAuth0のいいところ他社製品と比較した際のAuth0のいいところ
他社製品と比較した際のAuth0のいいところ
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
 

Similar to Spring 5でSpring Testのここが変わる_公開版

Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)NTT DATA Technology & Innovation
 
Optuna on Kubeflow Pipeline 分散ハイパラチューニング
Optuna on Kubeflow Pipeline 分散ハイパラチューニングOptuna on Kubeflow Pipeline 分散ハイパラチューニング
Optuna on Kubeflow Pipeline 分散ハイパラチューニングTakashi Suzuki
 
大規模・長期保守を見据えたエンタープライズ システム開発へのSpring Frameworkの適用
大規模・長期保守を見据えたエンタープライズシステム開発へのSpring Frameworkの適用大規模・長期保守を見据えたエンタープライズシステム開発へのSpring Frameworkの適用
大規模・長期保守を見据えたエンタープライズ システム開発へのSpring Frameworkの適用apkiban
 
Eclipse PDT + MakeGoodによるPHPコードのテスト
Eclipse PDT + MakeGoodによるPHPコードのテストEclipse PDT + MakeGoodによるPHPコードのテスト
Eclipse PDT + MakeGoodによるPHPコードのテストAtsuhiro Kubo
 
2018年度新入社員研修実績紹介
2018年度新入社員研修実績紹介2018年度新入社員研修実績紹介
2018年度新入社員研修実績紹介CASAREAL, Inc.
 
de:code2018 登壇資料
de:code2018 登壇資料de:code2018 登壇資料
de:code2018 登壇資料Hiroshi Senga
 
MakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をMakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をAtsuhiro Kubo
 
Androidテスティング実践3 ユニットテスト・CI編
Androidテスティング実践3 ユニットテスト・CI編Androidテスティング実践3 ユニットテスト・CI編
Androidテスティング実践3 ユニットテスト・CI編株式会社 NTTテクノクロス
 
Eclipse PDT + MakeGood による PHP コードのテスト
Eclipse PDT + MakeGood による PHP コードのテストEclipse PDT + MakeGood による PHP コードのテスト
Eclipse PDT + MakeGood による PHP コードのテストAtsuhiro Kubo
 
.NET アプリを改善して実践する継続的インテグレーション
.NET アプリを改善して実践する継続的インテグレーション.NET アプリを改善して実践する継続的インテグレーション
.NET アプリを改善して実践する継続的インテグレーションYuta Matsumura
 
UIテストの実行時間の短縮の方法
UIテストの実行時間の短縮の方法UIテストの実行時間の短縮の方法
UIテストの実行時間の短縮の方法Toshiyuki Hirata
 
初めてでも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
 
AnsibleおよびDockerで始めるInfrastructure as a Code
AnsibleおよびDockerで始めるInfrastructure as a CodeAnsibleおよびDockerで始めるInfrastructure as a Code
AnsibleおよびDockerで始めるInfrastructure as a CodeSatoru Yoshida
 
Azure Functions あれこれ
Azure Functions あれこれAzure Functions あれこれ
Azure Functions あれこれYasuaki Matsuda
 
Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報Takuya Iwatsuka
 
fastlane x iOSアプリのCI
fastlane x iOSアプリのCIfastlane x iOSアプリのCI
fastlane x iOSアプリのCIToshiyuki Hirata
 
チーム×ツール Team Foundation Server & Service 共感しActionできる開発基盤 アルティメイタム【デブサミ 2013 ...
チーム×ツール Team Foundation Server & Service 共感しActionできる開発基盤 アルティメイタム【デブサミ 2013 ...チーム×ツール Team Foundation Server & Service 共感しActionできる開発基盤 アルティメイタム【デブサミ 2013 ...
チーム×ツール Team Foundation Server & Service 共感しActionできる開発基盤 アルティメイタム【デブサミ 2013 ...智治 長沢
 
Agileツール適合化分科会(テスト自動化ツール)
Agileツール適合化分科会(テスト自動化ツール)Agileツール適合化分科会(テスト自動化ツール)
Agileツール適合化分科会(テスト自動化ツール)masanori kataoka
 

Similar to Spring 5でSpring Testのここが変わる_公開版 (20)

Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
 
Optuna on Kubeflow Pipeline 分散ハイパラチューニング
Optuna on Kubeflow Pipeline 分散ハイパラチューニングOptuna on Kubeflow Pipeline 分散ハイパラチューニング
Optuna on Kubeflow Pipeline 分散ハイパラチューニング
 
大規模・長期保守を見据えたエンタープライズ システム開発へのSpring Frameworkの適用
大規模・長期保守を見据えたエンタープライズシステム開発へのSpring Frameworkの適用大規模・長期保守を見据えたエンタープライズシステム開発へのSpring Frameworkの適用
大規模・長期保守を見据えたエンタープライズ システム開発へのSpring Frameworkの適用
 
Eclipse PDT + MakeGoodによるPHPコードのテスト
Eclipse PDT + MakeGoodによるPHPコードのテストEclipse PDT + MakeGoodによるPHPコードのテスト
Eclipse PDT + MakeGoodによるPHPコードのテスト
 
2018年度新入社員研修実績紹介
2018年度新入社員研修実績紹介2018年度新入社員研修実績紹介
2018年度新入社員研修実績紹介
 
10大ニュースで振り返るPGCon2015
10大ニュースで振り返るPGCon201510大ニュースで振り返るPGCon2015
10大ニュースで振り返るPGCon2015
 
de:code2018 登壇資料
de:code2018 登壇資料de:code2018 登壇資料
de:code2018 登壇資料
 
MakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発をMakeGoodで快適なテスト駆動開発を
MakeGoodで快適なテスト駆動開発を
 
Androidテスティング実践3 ユニットテスト・CI編
Androidテスティング実践3 ユニットテスト・CI編Androidテスティング実践3 ユニットテスト・CI編
Androidテスティング実践3 ユニットテスト・CI編
 
Eclipse PDT + MakeGood による PHP コードのテスト
Eclipse PDT + MakeGood による PHP コードのテストEclipse PDT + MakeGood による PHP コードのテスト
Eclipse PDT + MakeGood による PHP コードのテスト
 
快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017
快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017
快適・簡単・安心なアプリE2Eテストの実行環境 #stac2017
 
.NET アプリを改善して実践する継続的インテグレーション
.NET アプリを改善して実践する継続的インテグレーション.NET アプリを改善して実践する継続的インテグレーション
.NET アプリを改善して実践する継続的インテグレーション
 
UIテストの実行時間の短縮の方法
UIテストの実行時間の短縮の方法UIテストの実行時間の短縮の方法
UIテストの実行時間の短縮の方法
 
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
 
AnsibleおよびDockerで始めるInfrastructure as a Code
AnsibleおよびDockerで始めるInfrastructure as a CodeAnsibleおよびDockerで始めるInfrastructure as a Code
AnsibleおよびDockerで始めるInfrastructure as a Code
 
Azure Functions あれこれ
Azure Functions あれこれAzure Functions あれこれ
Azure Functions あれこれ
 
Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報Spring Security 5.0 解剖速報
Spring Security 5.0 解剖速報
 
fastlane x iOSアプリのCI
fastlane x iOSアプリのCIfastlane x iOSアプリのCI
fastlane x iOSアプリのCI
 
チーム×ツール Team Foundation Server & Service 共感しActionできる開発基盤 アルティメイタム【デブサミ 2013 ...
チーム×ツール Team Foundation Server & Service 共感しActionできる開発基盤 アルティメイタム【デブサミ 2013 ...チーム×ツール Team Foundation Server & Service 共感しActionできる開発基盤 アルティメイタム【デブサミ 2013 ...
チーム×ツール Team Foundation Server & Service 共感しActionできる開発基盤 アルティメイタム【デブサミ 2013 ...
 
Agileツール適合化分科会(テスト自動化ツール)
Agileツール適合化分科会(テスト自動化ツール)Agileツール適合化分科会(テスト自動化ツール)
Agileツール適合化分科会(テスト自動化ツール)
 

More from Yuichi Hasegawa

thymeleafさいしょの一歩
thymeleafさいしょの一歩thymeleafさいしょの一歩
thymeleafさいしょの一歩Yuichi Hasegawa
 
マイクロサービス入門(Spring fest 2017)
マイクロサービス入門(Spring fest 2017)マイクロサービス入門(Spring fest 2017)
マイクロサービス入門(Spring fest 2017)Yuichi Hasegawa
 
20170525 jsug バッチは地味だが役に立つ
20170525 jsug バッチは地味だが役に立つ20170525 jsug バッチは地味だが役に立つ
20170525 jsug バッチは地味だが役に立つYuichi Hasegawa
 
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~Yuichi Hasegawa
 
Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来Yuichi Hasegawa
 
こどもの絵本 ヒトラーとナチ
 こどもの絵本 ヒトラーとナチ こどもの絵本 ヒトラーとナチ
こどもの絵本 ヒトラーとナチYuichi Hasegawa
 
Spring知っておきたい
Spring知っておきたいSpring知っておきたい
Spring知っておきたいYuichi Hasegawa
 
Spring4-DevLove発表資料
Spring4-DevLove発表資料Spring4-DevLove発表資料
Spring4-DevLove発表資料Yuichi Hasegawa
 
[Jjug]java small object programming
[Jjug]java small object programming[Jjug]java small object programming
[Jjug]java small object programmingYuichi Hasegawa
 
[豆ナイト]Java small object programming
[豆ナイト]Java small object programming[豆ナイト]Java small object programming
[豆ナイト]Java small object programmingYuichi Hasegawa
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッションYuichi Hasegawa
 
Spring3.1概要 AOP & MVC
Spring3.1概要 AOP & MVCSpring3.1概要 AOP & MVC
Spring3.1概要 AOP & MVCYuichi Hasegawa
 

More from Yuichi Hasegawa (17)

Spring 18年の歴史
Spring 18年の歴史Spring 18年の歴史
Spring 18年の歴史
 
Enterprise Microservice
Enterprise MicroserviceEnterprise Microservice
Enterprise Microservice
 
thymeleafさいしょの一歩
thymeleafさいしょの一歩thymeleafさいしょの一歩
thymeleafさいしょの一歩
 
マイクロサービス入門(Spring fest 2017)
マイクロサービス入門(Spring fest 2017)マイクロサービス入門(Spring fest 2017)
マイクロサービス入門(Spring fest 2017)
 
20170525 jsug バッチは地味だが役に立つ
20170525 jsug バッチは地味だが役に立つ20170525 jsug バッチは地味だが役に立つ
20170525 jsug バッチは地味だが役に立つ
 
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
Application Re-Architecture Technology ~ StrutsからSpring MVCへ ~
 
Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来Spring Day 2016 springの現在過去未来
Spring Day 2016 springの現在過去未来
 
こどもの絵本 ヒトラーとナチ
 こどもの絵本 ヒトラーとナチ こどもの絵本 ヒトラーとナチ
こどもの絵本 ヒトラーとナチ
 
Jsug 20160422 slides
Jsug 20160422 slidesJsug 20160422 slides
Jsug 20160422 slides
 
Spring知っておきたい
Spring知っておきたいSpring知っておきたい
Spring知っておきたい
 
Spring4-DevLove発表資料
Spring4-DevLove発表資料Spring4-DevLove発表資料
Spring4-DevLove発表資料
 
[Jjug]java small object programming
[Jjug]java small object programming[Jjug]java small object programming
[Jjug]java small object programming
 
[豆ナイト]Java small object programming
[豆ナイト]Java small object programming[豆ナイト]Java small object programming
[豆ナイト]Java small object programming
 
Jjug springセッション
Jjug springセッションJjug springセッション
Jjug springセッション
 
Spring3.1概要x di
Spring3.1概要x diSpring3.1概要x di
Spring3.1概要x di
 
Spring3.1 aop-mvc
Spring3.1 aop-mvcSpring3.1 aop-mvc
Spring3.1 aop-mvc
 
Spring3.1概要 AOP & MVC
Spring3.1概要 AOP & MVCSpring3.1概要 AOP & MVC
Spring3.1概要 AOP & MVC
 

Spring 5でSpring Testのここが変わる_公開版

  • 1. © 2018 NTT DATA Corporation 2018/10/31 株式会社NTTデータ 生産技術部 ソフトウェア工学推進センタ 平栗 勇人 Spring 5でSpring Testのここが変わる
  • 2. © 2018 NTT DATA Corporation 2 平栗 勇人 株式会社NTTデータ 技術革新統括本部 システム技術本部 生産技術部 ソフトウェア工学推進センタ TERASOLUNA FWチーム Server FWの開発リーダー
  • 3. © 2018 NTT DATA Corporation 3 TERASOLUNAフレームワークのコンセプト Spring Security Spring MVC JPA MyBatis 1.OSSを組み合わせ、 独自実装部分を極小化 2.OSSの機能を最大限に 活かして開発するための ベストプラクティスを提供 開発ガイドライン http://terasolunaorg.github.io/ 基盤としてSpringを採用している
  • 4. © 2018 NTT DATA Corporation 4 はじめに
  • 5. © 2018 NTT DATA Corporation 5 そもそも
  • 6. © 2018 NTT DATA Corporation 6 なぜ、 テストを行うのか?
  • 7. © 2018 NTT DATA Corporation 7 仕様通りに 動くことを 確認するため
  • 8. © 2018 NTT DATA Corporation 8 どんなに優秀な 人間でもミスをする。 ミスをしない人間は、何もしない人間だけだ。 (The only man who never makes mistakes is the man who never does anything.) -- Theodore Roosevelt
  • 9. © 2018 NTT DATA Corporation 9 自分の作成した コードに責任を持ち、
  • 10. © 2018 NTT DATA Corporation 10 安心して開発を 続けるために テストは不可欠。
  • 11. © 2018 NTT DATA Corporation 11 コーディングすれば もれなく付きまとう 作業なので、
  • 12. © 2018 NTT DATA Corporation 12 テストの効率性は、 生産性に直結。
  • 13. © 2018 NTT DATA Corporation 13 Springは テストしやすいの?
  • 14. © 2018 NTT DATA Corporation 14 本日は、 それについてお話しします。
  • 15. © 2018 NTT DATA Corporation 15  Springとテスト  クラスやメソッド単位でのテスト  クラス同士を組み合わせたテスト  Spring 5での変更点  JUnit 5のサポート  テスト並行実行のサポート  その他の改善  まとめ
  • 16. © 2018 NTT DATA Corporation 16  Springとテスト  クラスやメソッド単位でのテスト  クラス同士を組み合わせたテスト  Spring 5での変更点  JUnit 5のサポート  テスト並行実行のサポート  その他の改善  まとめ
  • 17. © 2018 NTT DATA Corporation 17 大規模な アプリケーションでは、
  • 18. © 2018 NTT DATA Corporation 18 バグを発見する タイミングが 遅ければ遅いほど、
  • 19. © 2018 NTT DATA Corporation 19 影響範囲は 大きくなる。
  • 20. © 2018 NTT DATA Corporation 20 なので、
  • 21. © 2018 NTT DATA Corporation 21 いかに早くバグを 発見できるかが重要。
  • 22. © 2018 NTT DATA Corporation 22 バグを早期発見 するためには、
  • 23. © 2018 NTT DATA Corporation 23 クラスやメソッドといった小さな 単位でテストすることが大切。 クラス A 依存 依存 クラス B クラス C メソッド1 メソッド2 JUnit テスト メソッド1 メソッド2 メソッド1 メソッド2 JUnit テスト JUnit テスト
  • 24. © 2018 NTT DATA Corporation 24 また、作成したらすぐにモックを 使ってテストできるのが理想。 クラス A 依存 依存 モック クラス B モック クラス C JUnit テスト メソッド1 メソッド2
  • 25. © 2018 NTT DATA Corporation 25 しかし、疎結合を 意識しないと、
  • 26. © 2018 NTT DATA Corporation 26 クラス単体で 試験すること自体が 難しくなる。
  • 27. © 2018 NTT DATA Corporation 27 悪い例
  • 28. © 2018 NTT DATA Corporation 28 public class A { public String foo() { B objB = new B(); // objB.doSomething() // 処理結果に応じてreturn } } A#foo()は、B#doSomething()の 処理結果に応じて”成功”、”失敗”を返す。
  • 29. © 2018 NTT DATA Corporation 29 public class A { public String foo() { B objB = new B(); // objB.doSomething() // 処理結果に応じてreturn } } いま、クラスA単体の挙動をテストしたい。
  • 30. © 2018 NTT DATA Corporation 30 A#foo()の戻り値が”失敗”であることを確 認するテストメソッドAを作成する。 class ATest { @Test void fooの戻り値が「失敗」であること() { A objA = new A(); assertEquals(“失敗", objA.foo()); } }
  • 31. © 2018 NTT DATA Corporation 31 A#foo()内でBをnewしているため、 テスト実行時にBも実行する必要がある。 class ATest { @Test void fooの戻り値が「失敗」であること() { A objA = new A(); assertEquals(“失敗", objA.foo()); } } public String foo() { B objB = new B();
  • 32. © 2018 NTT DATA Corporation 32 そして、このテストケースを通すためには、 class ATest { @Test void fooの戻り値が「失敗」であること() { A objA = new A(); assertEquals(“失敗", objA.foo()); } } public String foo() { B objB = new B();
  • 33. © 2018 NTT DATA Corporation 33 B#doSomething()の処理を失敗させる 必要があり、初期化が煩雑になる。 class ATest { @Test void fooの戻り値が「失敗」であること() { A objA = new A(); assertEquals(“失敗", objA.foo()); } } public String foo() { B objB = new B();
  • 34. © 2018 NTT DATA Corporation 34 そもそもクラス単体での試験に なっていない。。。 class ATest { @Test void fooの戻り値が「失敗」であること() { A objA = new A(); assertEquals(“失敗", objA.foo()); } } public String foo() { B objB = new B();
  • 35. © 2018 NTT DATA Corporation 35 メソッド内でnew するだけで、疎結合 ではなくなってしまい、
  • 36. © 2018 NTT DATA Corporation 36 単体テストの実施 そのものが難しくなる。
  • 37. © 2018 NTT DATA Corporation 37 疎結合にする一つの デザインパターンとして、 DIがある。
  • 38. © 2018 NTT DATA Corporation 38 Springは、 フレームワークの 最重要機能として、
  • 39. © 2018 NTT DATA Corporation 39 DIを自動で行い、 インスタンスを 組み立ててくれる基盤、
  • 40. © 2018 NTT DATA Corporation 40 DIコンテナ を 提供している。
  • 41. © 2018 NTT DATA Corporation 41 クラス A クラス Bの生成 クラス B DIコンテナ クラス A 利用 Bの実装クラス クラス Aはクラス Bのインスタンスを直接生成している Bのインタ フェース 生成 通常のJava SpringのDI 注入 DIコンテナがクラス Bのインスタンスを生成・注入している クラス B B objB = new B();
  • 42. © 2018 NTT DATA Corporation 42 このように、
  • 43. © 2018 NTT DATA Corporation 43 クラス間が疎結合 になるので、
  • 44. © 2018 NTT DATA Corporation 44 クラス A Bの実装クラス Bのインタ フェース クラス B モック クラス B 依存クラスをモックに差し替えること が可能になる。 差し替え可能
  • 45. © 2018 NTT DATA Corporation 45 クラス A Bの実装クラス Bのインタ フェース クラス B モック クラス B よって、クラス単体でのテストが可能 になる! JUnit テスト
  • 46. © 2018 NTT DATA Corporation 46 クラス A Bの実装クラス Bのインタ フェース クラス B モック クラス B モックテストは、Mockitoなどのモック ライブラリを使うことが多い。 JUnit テスト
  • 47. © 2018 NTT DATA Corporation 47  Springとテスト  クラスやメソッド単位でのテスト  クラス同士を組み合わせたテスト  Spring 5での変更点  JUnit 5のサポート  テスト並行実行のサポート  その他の改善  まとめ
  • 48. © 2018 NTT DATA Corporation 48 次に、単体テストを終えたクラス 同士を組み合わせてテストする 時を考えてみる。 クラス A 依存 依存 クラス B モック クラス C JUnit テスト
  • 49. © 2018 NTT DATA Corporation 49 インスタンスの生成や依存性の 解決はDIコンテナが担っている ので、 DIコンテナ クラス A 利用 Bの実装クラス Bのインタ フェース 生成注入 クラス B
  • 50. © 2018 NTT DATA Corporation 50 クラスBに依存するクラスAのテ ストをするには、DIコンテナが必 要となる。しかし…、 DIコンテナ クラス A 利用 Bの実装クラス Bのインタ フェース 生成注入 クラス B
  • 51. © 2018 NTT DATA Corporation 51 JUnitなどのテスティングフレー ムワーク上でDIコンテナを動か すのは難しい…。 DIコンテナ クラス A 利用 Bの実装クラス Bのインタ フェース 生成注入 クラス B JUnit テスト
  • 52. © 2018 NTT DATA Corporation 52 しかし!
  • 53. © 2018 NTT DATA Corporation 53 Springは、 結合テストを支援 するモジュールとして
  • 54. © 2018 NTT DATA Corporation 54 Spring Test を 提供している。
  • 55. © 2018 NTT DATA Corporation 55 Spring Testに 含まれる
  • 56. © 2018 NTT DATA Corporation 56 Spring TestContext Framework(TCF) を用いると、
  • 57. © 2018 NTT DATA Corporation 57 JUnitやTestNG などのテスティング フレームワーク上で
  • 58. © 2018 NTT DATA Corporation 58 DIコンテナ を動かせる!
  • 59. © 2018 NTT DATA Corporation 59 クラス A 利用 注入 クラスA, BがDIコンテナ上で正しく動作するか テストしたい。 生成 DIコンテナ Bの実装クラス Bのインタフェース クラス B
  • 60. © 2018 NTT DATA Corporation 60 はじめに、pom.xmlにspring-testの ライブラリを追加する。 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <scope>test</scope> </dependency>
  • 61. © 2018 NTT DATA Corporation 61 次に、テストクラスでTestContext Framework (TCF)を使うよう指定する。※詳細はのちほど TestContext Framework クラス A 利用 テストクラス A Bの実装クラス Bのインタ フェース クラス B 1. TCFを使うよ!
  • 62. © 2018 NTT DATA Corporation 62 また、TCF上にDIコンテナを作成するためのBean 定義ファイルを指定する。 TestContext Framework DIコンテナ クラス A 利用 テストクラス A Bの実装クラス Bのインタ フェース クラス B 1. TCFを使うよ! 2. このBean定義ファ イルをもとにDIコン テナを作成して!
  • 63. © 2018 NTT DATA Corporation 63 注入 以上の簡単な設定で、テスティングフレームワーク上 でDIコンテナと連携したテストが可能になる! 生成 クラス A 利用 テストクラス A Bの実装クラス Bのインタ フェース クラス B TestContext Framework DIコンテナ 注入 生成 1. TCFを使うよ! 2. このBean定義ファ イルをもとにDIコン テナを作成して!
  • 64. © 2018 NTT DATA Corporation 64 では、
  • 65. © 2018 NTT DATA Corporation 65 Spring 5で何が 変わったのだろうか
  • 66. © 2018 NTT DATA Corporation 66  Springとテスト  クラスやメソッド単位でのテスト  クラス同士を組み合わせたテスト  Spring 5での変更点  JUnit 5のサポート  テスト並行実行のサポート  その他の改善  まとめ 目玉の改善!
  • 67. © 2018 NTT DATA Corporation 67 Spring 5のSpring Testでは、 これからお話しする JUnit 5のメリットを
  • 68. © 2018 NTT DATA Corporation 68 すべて享受すること ができます!
  • 69. © 2018 NTT DATA Corporation 69  Springとテスト  クラスやメソッド単位でのテスト  クラス同士を組み合わせたテスト  Spring 5での変更点  JUnit 5のサポート  テスト並行実行のサポート  その他の改善  まとめ ・ JUnitの説明 ・ JUnit 5の概要 ・ JUnit 5のイケてるところ ・ TCFとの連携方法
  • 70. © 2018 NTT DATA Corporation 70 JUnitは、以下を提供している。 ・テストケースのフォーマット ・テストの実行基盤 ・テストの期待値と実測値の検証API JUnitの説明
  • 71. © 2018 NTT DATA Corporation 71 簡単に言うと、 ・テストケースのフォーマット ⇒どのようにテストを書いて、 ・テストの実行基盤 ⇒どのように実行し、 ・テストの期待値と実測値の検証API ⇒どのように検証するか JUnitの説明
  • 72. © 2018 NTT DATA Corporation 72  Springとテスト  クラスやメソッド単位でのテスト  クラス同士を組み合わせたテスト  Spring 5での変更点  JUnit 5のサポート  テスト並行実行のサポート  その他の改善  まとめ ・ JUnitの説明 ・ JUnit 5の概要 ・ JUnit 5のイケてるところ ・ TCFとの連携方法
  • 73. © 2018 NTT DATA Corporation 73 2017年、 JUnit 5の概要
  • 74. © 2018 NTT DATA Corporation 74 JUnit 5が リリースされました。 JUnit 5の概要
  • 75. © 2018 NTT DATA Corporation 75 実に10年ぶりの メジャーアップデート JUnit 5の概要
  • 76. © 2018 NTT DATA Corporation 76 JUnit 5は、 3つのサブプロジェクトで 構成される。 JUnit 5 = Platform + Jupiter + Vintage JUnit 5の概要
  • 77. © 2018 NTT DATA Corporation 77 JUnit 5の概要 Eclipse, STS, IntelliJ IDEA, Maven, Gradle etc. JUnit Platform JUnit Vintage JUnit Jupiter 3rd party JUnit 3,4の テスト JUnit 5の テスト その他の テスト 共通的な実行エンジン 実行API JUnit3, 4 実行エンジン 実装 API JUnit 5 実行エンジン
  • 78. © 2018 NTT DATA Corporation 78 JUnit 5= JUnit Platform + JUnit Jupiter + JUnit Vintage 用途や環境に合わせて適切な ライブラリを取り込む。 JUnit 5の概要
  • 79. © 2018 NTT DATA Corporation 79 サポートされる Javaのバージョンは、 Java 8 以上 JUnit 5の概要
  • 80. © 2018 NTT DATA Corporation 80  Springとテスト  クラスやメソッド単位でのテスト  クラス同士を組み合わせたテスト  Spring 5での変更点  JUnit 5のサポート  テスト並行実行のサポート  その他の改善  まとめ ・ JUnitの説明 ・ JUnit 5の概要 ・ JUnit 5のイケてるところ ・ TCFとの連携方法
  • 81. © 2018 NTT DATA Corporation 81 JUnit 5はどこが イケてるの? JUnit 5のイケてるところ
  • 82. © 2018 NTT DATA Corporation 82 JUnit 5のイケてるところ ・ネストしたテスト ・パラメータ化テスト ・アサーションAPIの強化 ・条件付きテスト JUnit 5のイケてるところ
  • 83. © 2018 NTT DATA Corporation 83 これからお話しするJUnit 5 のAPIの中には、一部実験 的なものも含まれます。 JUnit 5のイケてるところ
  • 84. © 2018 NTT DATA Corporation 84 JUnit 5のイケてるところ ・ネストしたテスト ・パラメータ化テスト ・アサーションAPIの強化 ・条件付きテスト JUnit 5のイケてるところ
  • 85. © 2018 NTT DATA Corporation 85 網羅的にテストしようと すると、テストメソッドは 増えますよね? JUnit 5のイケてるところ: ネストしたテスト
  • 86. © 2018 NTT DATA Corporation 86 大量のテストメソッドが 並列に 実装されていると、 JUnit 5のイケてるところ: ネストしたテスト
  • 87. © 2018 NTT DATA Corporation 87 テストコードを見たときに 各テストケースの意図を 読み解くのが難しくなる。 JUnit 5のイケてるところ: ネストしたテスト
  • 88. © 2018 NTT DATA Corporation 88 JUnit 5のイケてるところ: ネストしたテスト JUnit 4 ~並列で書いたとき~ @Before public void setUp() { // リストの初期化(0件) } @Test public void sizeメソッドの確認_リストが初期状態() { // 0が返されることの確認 } @Test public void sizeメソッドの確認_リストが1件() { // リストに1件追加 // 1が返されることの確認 } @Test public void isEmptyメソッドの確認_リストが初期状態() { // trueが返されることの確認 } @Test public void isEmptyメソッドの確認_リストが1件() { // リストに1件追加 // falseが返されることの確認 } 各テストケースの観点が 読み取りずらくなる 同じような初期化処理 が重複する 同じような初期化処理 が重複する
  • 89. © 2018 NTT DATA Corporation 89 解決するためには、 JUnit 5のイケてるところ: ネストしたテスト
  • 90. © 2018 NTT DATA Corporation 90 テストメソッドを何らか の基準でグループ化 する必要がある。 JUnit 5のイケてるところ: ネストしたテスト
  • 91. © 2018 NTT DATA Corporation 91 JUnit 実践入門 によると、 JUnit 5のイケてるところ: ネストしたテスト
  • 92. © 2018 NTT DATA Corporation 92 「テストケースは共通の 初期化処理をもつもの でグループ化すべき」 JUnit 5のイケてるところ: ネストしたテスト
  • 93. © 2018 NTT DATA Corporation 93 とあります。 JUnit 5のイケてるところ: ネストしたテスト
  • 94. © 2018 NTT DATA Corporation 94 JUnit 4では、 JUnit 5のイケてるところ: ネストしたテスト
  • 95. © 2018 NTT DATA Corporation 95 @RunWith(Enclosed.class) を利用して 次のように書けた。 JUnit 5のイケてるところ: ネストしたテスト
  • 96. © 2018 NTT DATA Corporation 96 JUnit 5のイケてるところ: ネストしたテスト JUnit 4 ~グループ化~ @RunWith(Enclosed.class) public class ListTestEnclosedExmaple { public static class リストが初期状態 { @Before public void setUp() {} //リストの初期化(0件) @Test public void sizeメソッドの確認() {} @Test public void isEmptyメソッドの確認() {} } public static class リストが1件 { @Before public void setUp() {} //リストの初期化後、1件追加 @Test public void sizeメソッドの確認() {} @Test public void isEmptyメソッドの確認() {} } } アウタークラスに @RunWith (Enclosed.class) を付与する。
  • 97. © 2018 NTT DATA Corporation 97 JUnit 5のイケてるところ: ネストしたテスト JUnit 4 ~グループ化~ @RunWith(Enclosed.class) public class ListTestEnclosedExmaple { public static class リストが初期状態 { @Before public void setUp() {} //リストの初期化(0件) @Test public void sizeメソッドの確認() {} @Test public void isEmptyメソッドの確認() {} } public static class リストが1件 { @Before public void setUp() {} //リストの初期化後、1件追加 @Test public void sizeメソッドの確認() {} @Test public void isEmptyメソッドの確認() {} } } staticインナークラスで、 同じ初期化処理が必要な テストケースをグループ化。 staticインナークラスで、 同じ初期化処理が必要な テストケースをグループ化。
  • 98. © 2018 NTT DATA Corporation 98 staticなので、 アウタークラスのメンバに アクセスできない。 JUnit 5のイケてるところ: ネストしたテスト
  • 99. © 2018 NTT DATA Corporation 99 JUnit 5のイケてるところ: ネストしたテスト @RunWith(Enclosed.class) public class ListTestEnclosedExmaple { @Before public void setUp() {} //リストの初期化(0件) public static class リストが初期状態 { @Test public void sizeメソッドの確認() {} @Test public void isEmptyメソッドの確認() {} } public static class リストが1件 { @Before public void setUp() {} //リストに1件追加 @Test public void sizeメソッドの確認() {} @Test public void isEmptyメソッドの確認() {} } } このように、全体的な初期 化処理をアウタークラスに 書けばもっとスッキリしそう だけど、制約上できない。 JUnit 4 ~仕様上の制約~
  • 100. © 2018 NTT DATA Corporation 100 JUnit 5では そのような実装が 可能になる! JUnit 5のイケてるところ: ネストしたテスト
  • 101. © 2018 NTT DATA Corporation 101 JUnit 5の新API @Nested を使うと、 ※@RunWith(Enclosed.class)は廃止。 JUnit 5のイケてるところ: ネストしたテスト
  • 102. © 2018 NTT DATA Corporation 102 JUnit 5のイケてるところ: ネストしたテスト JUnit 5 ~ネスト化~ class ListTestNestedExample { @BeforeEach void setUp() {} //リストの初期化(0件) @Nested class リストが初期状態 { @Test void sizeメソッドの確認() {} @Test void isEmptyメソッドの確認() {} } @Nested class リストが1件 { @BeforeEach void setUp() {} //リストに1件追加 @Test void sizeメソッドの確認() {} @Test void isEmptyメソッドの確認() {} } } 非staticインナークラスに @Nestedアノテーションを付 与し、同じ初期化処理が必 要なテストケースをグループ化 (深さ1でネスト化)。
  • 103. © 2018 NTT DATA Corporation 103 JUnit 5のイケてるところ: ネストしたテスト JUnit 5 ~ネスト化~ class ListTestNestedExample { @BeforeEach void setUp() {} //リストの初期化(0件) @Nested class リストが初期状態 { @Test void sizeメソッドの確認() {} @Test void isEmptyメソッドの確認() {} } @Nested class リストが1件 { @BeforeEach void setUp() {} //リストに1件追加 @Test void sizeメソッドの確認() {} @Test void isEmptyメソッドの確認() {} } } Tips: JUnit 5の変更点 ①public修飾子が省略可 能 Tips: JUnit 5の変更点① クラスやメソッドのpublic修飾子 が省略可能になった。
  • 104. © 2018 NTT DATA Corporation 104 JUnit 5のイケてるところ: ネストしたテスト JUnit 5 ~ネスト化~ class ListTestNestedExample { @BeforeEach void setUp() {} //リストの初期化(0件) @Nested class リストが初期状態 { @Test void sizeメソッドの確認() {} @Test void isEmptyメソッドの確認() {} } @Nested class リストが1件 { @BeforeEach void setUp() {} //リストに1件追加 @Test void sizeメソッドの確認() {} @Test void isEmptyメソッドの確認() {} } } Tips: JUnit 5の変更点② 前処理/後処理アノテーションが変 わった。 @Before/After ⇒@BeforeEach/AfterEach @BeforeClass/AfterClass ⇒@BeforeAll/AfterAll
  • 105. © 2018 NTT DATA Corporation 105 JUnit 5のイケてるところ: ネストしたテスト @Nested class A{ @Nested class B{ @Nested class C{ } } } JUnit 5 ~ネスト化~ ネストはいくらでも深くすることができ、 継承関係を保ったままテストケース を構造化できる!
  • 106. © 2018 NTT DATA Corporation 106 JUnit 5のイケてるところ ・ネストしたテスト ・パラメータ化テスト ・アサーションAPIの強化 ・条件付きテスト JUnit 5のイケてるところ
  • 107. © 2018 NTT DATA Corporation 107 テストケースが 大量になった場合、 JUnit 5のイケてるところ: パラメータ化テスト
  • 108. © 2018 NTT DATA Corporation 108 初期化処理ごとに テストメソッドをグループ化 するだけではなく、 JUnit 5のイケてるところ: パラメータ化テスト
  • 109. © 2018 NTT DATA Corporation 109 引数のバリエーション テストを一つのテスト メソッドで書けると、 JUnit 5のイケてるところ: パラメータ化テスト
  • 110. © 2018 NTT DATA Corporation 110 もっと見通しが良くなる。 JUnit 5のイケてるところ: パラメータ化テスト
  • 111. © 2018 NTT DATA Corporation 111 JUnit 4では、 JUnit 5のイケてるところ: パラメータ化テスト
  • 112. © 2018 NTT DATA Corporation 112 @RunWith(Theories.class) を利用して それが実現できた。 JUnit 5のイケてるところ: パラメータ化テスト
  • 113. © 2018 NTT DATA Corporation 113 JUnit 5のイケてるところ: パラメータ化テスト JUnit 4 ~パラメータ化していない例~ public class NonParameterizedExample { //ageCheckメソッドに未成年の年齢を渡したときのテスト @Test public void ageCheckメソッド_0歳() {} @Test public void ageCheckメソッドの確認_10歳() {} @Test public void ageCheckメソッドの確認_19歳() {} } 入力値のバリエーションテス トをメソッドごとに書いている。
  • 114. © 2018 NTT DATA Corporation 114 JUnit 5のイケてるところ: パラメータ化テスト JUnit 4 ~パラメータ化後~ @RunWith(Theories.class) public class ParameterizedExample { @DataPoints("child") public static int[] VALUES_CHILD = { 0, 10, 19 }; @Theory public void ageCheckメソッドの確認_未成年( @FromDataPoints("child") int age) {} } アウタークラスに @RunWith(Theories.class) を付与する。
  • 115. © 2018 NTT DATA Corporation 115 JUnit 5のイケてるところ: パラメータ化テスト JUnit 4 ~パラメータ化後~ @RunWith(Theories.class) public class ParameterizedExample { @DataPoints("child") public static int[] VALUES_CHILD = { 0, 10, 19 }; @Theory public void ageCheckメソッドの確認_未成年( @FromDataPoints("child") int age) {} } テスト対象メソッドの戻り値が同値なテス トケースをひとまとめにし、引数をもつテス トメソッドを作成する。(パラメータ化) メソッドには@Theoryを付与する。
  • 116. © 2018 NTT DATA Corporation 116 JUnit 5のイケてるところ: パラメータ化テスト JUnit 4 ~パラメータ化後~ @RunWith(Theories.class) public class ParameterizedExample { @DataPoints("child") public static int[] VALUES_CHILD = { 0, 10, 19 }; @Theory public void ageCheckメソッドの確認_未成年( @FromDataPoints("child") int age) {} } 入力パラメータは、staticな変数に @DataPointsを付与して定義する。
  • 117. © 2018 NTT DATA Corporation 117 JUnit 5では さらに簡潔に、 高機能になった! JUnit 5のイケてるところ: パラメータ化テスト
  • 118. © 2018 NTT DATA Corporation 118 JUnit 5の新API @ParameterizedTest を使うと、 ※@RunWith(Theories.class)は廃止。 JUnit 5のイケてるところ: パラメータ化テスト
  • 119. © 2018 NTT DATA Corporation 119 JUnit 5のイケてるところ: パラメータ化テスト class ParameterizedExampleJunit5 { @ParameterizedTest @ValueSource(ints = { 0, 10, 19 }) void ageCheckメソッドの確認_未成年(int age) {} } パラメータ化したいテストメソッドに @ParameterizedTestを付与する。 JUnit 5 ~パラメータ化~
  • 120. © 2018 NTT DATA Corporation 120 JUnit 5のイケてるところ: パラメータ化テスト class ParameterizedExampleJunit5 { @ParameterizedTest @ValueSource(ints = { 0, 10, 19 }) void ageCheckメソッドの確認_未成年(int age) {} } 入力パラメータは、テストメソッドに付 与した@ValueSourceで定義する。 JUnit 5 ~パラメータ化~
  • 121. © 2018 NTT DATA Corporation 121 JUnit 5のイケてるところ: パラメータ化テスト Double, int, long, String変数を指定 @ValueSource(double[], int[], long[], String[]) Enum定数を指定 @EnumSource(Enumクラス) Streamや配列を返 すメソッドを指定 @MethodSource(“メソッド名”) CSV形式で値を指定 @CsvSource({“x1,y1”, “x2,y2”}) CSVファイルを指定 @CsvFileSource(resources=“CSVファイル名”) JUnit 5 ~パラメータ化~ Tips: 以下のようなパラメータ定義アノテー ションが提供されている。
  • 122. © 2018 NTT DATA Corporation 122 パラメータ化テストのAPIは、 2018/10/31現在、実験的 なAPIとして提供されている。 JUnit 5のイケてるところ: パラメータ化テスト
  • 123. © 2018 NTT DATA Corporation 123 JUnit 5のイケてるところ ・ネストしたテスト ・パラメータ化テスト ・アサーションAPIの強化 ・条件付きテスト JUnit 5のイケてるところ
  • 124. © 2018 NTT DATA Corporation 124 アサーションに関しても 進化した! JUnit 5のイケてるところ: アサーションAPIの強化
  • 125. © 2018 NTT DATA Corporation 125 新しいAPIの追加 ・assertAll() ・assertThrows() ・assertTimeout() など JUnit 5のイケてるところ: アサーションAPIの強化
  • 126. © 2018 NTT DATA Corporation 126 JUnit 5のイケてるところ: アサーションAPIの強化 JUnit 5 ~assertAll()~ バグを仕込んだPersonクラス public class Person { public String getFirstName() { return ""; } public String getLastName() { return "Hirakuri"; } public String getAge() { return ""; } } “Yuto”を返したい。 “29”を返したい。
  • 127. © 2018 NTT DATA Corporation 127 JUnit 5のイケてるところ: アサーションAPIの強化 @Test void person情報が正しく取得できているか確認() { assertEquals("Yuto", person.getFirstName()); assertEquals("Hirakuri", person.getLastName()); assertEquals("29", person.getAge()); } JUnit 5 ~assertAll()~ 今まで
  • 128. © 2018 NTT DATA Corporation 128 JUnit 5のイケてるところ: アサーションAPIの強化 一番最初のアサーションで失敗すると、 以後のアサーションが実行されない。 JUnit 5 ~assertAll()~
  • 129. © 2018 NTT DATA Corporation 129 JUnit 5のイケてるところ: アサーションAPIの強化 JUnit 5 ~assertAll()~ assertAll()使用 @Test void person情報が正しく取得できているか確認_All() { assertAll( () -> assertEquals(“Yuto”, person.getFirstName()), () -> assertEquals(“Hirakuri”, person.getLastName()), () -> assertEquals("29", person.getAge()) ); }
  • 130. © 2018 NTT DATA Corporation 130 JUnit 5のイケてるところ: アサーションAPIの強化 JUnit 5 ~assertAll()~ 一番最初のアサーションで失敗しても、 最後のアサーションまで実行される!
  • 131. © 2018 NTT DATA Corporation 131 JUnit 5のイケてるところ: アサーションAPIの強化 public class Calculator { public String divide(String a, String b) { return String.valueOf(Integer.parseInt(a) / Integer.parseInt(b)); } } JUnit 5 ~assertThrows()~ 割り算をするdivideメソッド
  • 132. © 2018 NTT DATA Corporation 132 JUnit 5のイケてるところ: アサーションAPIの強化 今まで @Test(expected = ArithmeticException.class) public void ゼロ除算時に算術例外の発生確認() { calc.divide("5", "0"); } @Testのexpected 属性に例外クラスを指 定して確認していた。 JUnit 5 ~assertThrows()~
  • 133. © 2018 NTT DATA Corporation 133 JUnit 5のイケてるところ: アサーションAPIの強化 assertThrows()使用 @Test void ゼロ除算時に算術例外の発生確認() { assertThrows(ArithmeticException.class, () -> calc.divide("5", "0")); } メソッド内で自然なスタ イルで書ける。 JUnit 5 ~assertThrows()~
  • 134. © 2018 NTT DATA Corporation 134 JUnit 5のイケてるところ: アサーションAPIの強化 今まで JUnit 5 ~assertThrows()~ @Test public void ゼロ除算時の算術例外メッセージ確認() { try { calc.divide("5", "0"); fail(); } catch (ArithmeticException e) { assertEquals("/ by zero", e.getMessage()); } } 例外メッセージを確認す るときは、try-catchを 使って書いていた。
  • 135. © 2018 NTT DATA Corporation 135 JUnit 5のイケてるところ: アサーションAPIの強化 assertThrows()使用 JUnit 5 ~assertThrows()~ @Test void ゼロ除算時の算術例外メッセージ確認() { Throwable e = assertThrows( ArithmeticException.class, () -> calc.divide("5", "0")); assertEquals("/ by zero", e.getMessage()); } Throwableオブジェクト を返すので、try-catch を使わずに書ける!
  • 136. © 2018 NTT DATA Corporation 136 assertThat()がJUnitライブラリから 削除されました。 背景: JUnit 5から「Matcherは、ユーザが自由に選んでね」 というスタンスをとっているため、HamcrestのMatcher依存 であったassertThat()も切り離された。 https://github.com/junit-team/junit5/wiki/OLD-Assertion-API#reasons-not-to-introduce-yet-another-assertion-apilibrary ⇒JUnit 5でassertThat()を使いたい場合は、 Hamcrestライブラリを使えばOK! JUnit 5のイケてるところ: アサーションAPIの強化 補足
  • 137. © 2018 NTT DATA Corporation 137 JUnit 5のイケてるところ ・ネストしたテスト ・パラメータ化テスト ・アサーションAPIの強化 ・条件付きテスト JUnit 5のイケてるところ
  • 138. © 2018 NTT DATA Corporation 138 あるテストケースを 一時的に無効にしたい時、 JUnit 5のイケてるところ: 条件付きテスト
  • 139. © 2018 NTT DATA Corporation 139 JUnit 4 @Ignore JUnit 5のイケてるところ: 条件付きテスト JUnit 5 @Disabled
  • 140. © 2018 NTT DATA Corporation 140 JUnit 5は それだけではない。 JUnit 5のイケてるところ: 条件付きテスト
  • 141. © 2018 NTT DATA Corporation 141 条件に応じて 有効/無効にできる! JUnit 5のイケてるところ: 条件付きテスト
  • 142. © 2018 NTT DATA Corporation 142 JUnit 5のイケてるところ: 条件付きテスト JUnit 5 ~条件付きテスト実行~ class OSExmaple { @Test @EnabledOnOs({ OS.WINDOWS }) @EnabledOnJre({ JRE.JAVA_8, JRE.JAVA_9 }) void windowsかつJREバージョンが8か9でのみ実行() {} } 実行環境ごとにテストケースを 有効/無効にできる!
  • 143. © 2018 NTT DATA Corporation 143 JUnit 5のイケてるところ: 条件付きテスト OSを条件に有効/無効 @EnabledOnOs(OS.WINDOWS) @DisabledOnOs({OS.LINUX, OS.MAC}) Java実行環境を条件に 有効/無効 @EnabledOnJre(JRE.JAVA_8) @DisabledOnJre({JRE.JAVA_9, JRE.JAVA_10}) JVMシステムプロパティを条 件に有効/無効 @EnabledIfSystemProperty(named = "os.arch", matches = ".*64.*") @DisabledIfSystemProperty(named = "ci-server", matches = "true") 環境変数を条件に有効/ 無効 @EnabledIfEnvironmentVariable(named = "ENV", matches = "staging-server") @DisabledIfEnvironmentVariable(named = "ENV", matches = ".*development.*") JUnit 5 ~条件付きテスト実行~
  • 144. © 2018 NTT DATA Corporation 144 JUnit 5のイケてるところ ・ネストしたテスト ・パラメータ化テスト ・アサーションAPIの強化 ・条件付きテスト JUnit 5のイケてるところ
  • 145. © 2018 NTT DATA Corporation 145 そんなイケてる JUnit 5ですが、
  • 146. © 2018 NTT DATA Corporation 146 Spring TestContext Framework と連携するにあたっては
  • 147. © 2018 NTT DATA Corporation 147 ドラスティックな 仕様変更がありました。
  • 148. © 2018 NTT DATA Corporation 148 JUnitの拡張方法が一本化 Runner (@RunWith) Rule (@Rule) ClassRule (@ClassRule) Extension (@ExtendWith) JUnit 4 JUnit 5
  • 149. © 2018 NTT DATA Corporation 149 今までは、JUnit上でSpring TestContext Frameworkを動作させるために、Runnerを使 用していた。 import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = AppConfig.class) public class ABIntegrationTestJUnit4 { } Spring Testから提供されている SpringJUnit4ClassRunnerを @RunWithで指定。
  • 150. © 2018 NTT DATA Corporation 150 JUnit 5からは同様の 手段が取れなくなって しまいましたが、
  • 151. © 2018 NTT DATA Corporation 151 Spring 5の Spring Testでは、 仕様変更に追従!
  • 152. © 2018 NTT DATA Corporation 152 JUnit 5が提供している Extensionを利用して、
  • 153. © 2018 NTT DATA Corporation 153 JUnit 5上で TCFを動かすための サポートクラスを提供!
  • 154. © 2018 NTT DATA Corporation 154  Springとテスト  クラスやメソッド単位でのテスト  クラス同士を組み合わせたテスト  Spring 5での変更点  JUnit 5のサポート  テスト並行実行のサポート  その他の改善  まとめ ・ JUnitの説明 ・ JUnit 5の概要 ・ JUnit 5のイケてるところ ・ TCFとの連携方法
  • 155. © 2018 NTT DATA Corporation 155 JUnit 5上でSpring TestContext Framework を動かすための設定方法(ベーシックな方法) import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = AppConfig.class) class ABIntegrationTest { } @ExtendWithのvalue属性 に、JUnit 5上でTCFを動かす ためのExtensionクラスを指定 する。
  • 156. © 2018 NTT DATA Corporation 156 JUnit 5上でSpring TestContext Framework を動かすための設定方法(ベーシックな方法) import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = AppConfig.class) class ABIntegrationTest { } @ContextConfigurationの classes属性に、DIコンテナを 作成する際のBean定義ファイ ルを指定する。
  • 157. © 2018 NTT DATA Corporation 157 import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; @SpringJUnitConfig(classes = AppConfig.class) class ABIntegrationTest { } @SpringJUnitConfig = @ExtendWith(SpringExtension.class)+ @ContextConfiguration Tip: Webアプリ向けのDIコンテナを作成する、@SpringJUnitWebConfigも提供されている。 (@SpringJUnitWebConfig=@SpringJUnitConfig + @WebApplicationConfig) JUnit 5上でSpring TestContext Framework を動かすための設定方法(@SpringJUnitConfig)
  • 158. © 2018 NTT DATA Corporation 158 JUnit 5には実験的なAPI が数多く存在するので、 使用の際は注意。 https://junit.org/junit5/docs/current/user-guide/#api-evolution-experimental-apis
  • 159. © 2018 NTT DATA Corporation 159  Springとテスト  クラスやメソッド単位でのテスト  クラス同士を組み合わせたテスト  Spring 5での変更点  JUnit 5のサポート  テスト並行実行のサポート  その他の改善  まとめ
  • 160. © 2018 NTT DATA Corporation 160 JUnit 4.7/5.3以降、 テストの並行実行が 可能になったが、 Spring 5変更点:テスト並行実行のサポート
  • 161. © 2018 NTT DATA Corporation 161 Spring 4では、 TCFを使用したテストは 並行実行できなかった。 Spring 5変更点:テスト並行実行のサポート
  • 162. © 2018 NTT DATA Corporation 162 Spring 5からは、 TCFを使用したテストも 並行実行が可能になった! Spring 5変更点:テスト並行実行のサポート
  • 163. © 2018 NTT DATA Corporation 163 MavenでJUnit 5テストの並行実行をする設定例 Spring 5変更点:テスト並行実行のサポート <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.0</version> <configuration> <properties> <configurationParameters> junit.jupiter.execution.parallel.enabled=true junit.jupiter.execution.parallel.config.strategy=fixed junit.jupiter.execution.parallel.config.fixed.parallelism=20 </configurationParameters> </properties> <reportFormat>plain</reportFormat> </configuration> <dependencies> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-surefire-provider</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.3.1</version> </dependency> </dependencies> </plugin> maven-surefire-pluginの configurationParametersに以下を設定 ・enabled=true (有効) ・parallelism=20 (同時スレッド数) ・strategy=fixed (スレッド数固定)
  • 164. © 2018 NTT DATA Corporation 164 MavenでJUnit 5テストの並行実行をする設定例 Spring 5変更点:テスト並行実行のサポート <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.0</version> <configuration> <properties> <configurationParameters> junit.jupiter.execution.parallel.enabled=true junit.jupiter.execution.parallel.config.strategy=fixed junit.jupiter.execution.parallel.config.fixed.parallelism=20 </configurationParameters> </properties> <reportFormat>plain</reportFormat> </configuration> <dependencies> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-surefire-provider</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.3.1</version> </dependency> </dependencies> </plugin> JUnit 5.3から試験的に並行実行をサポー トしている。
  • 165. © 2018 NTT DATA Corporation 165 Spring 5変更点:テスト並行実行のサポート 実行してみる。 @SpringJUnitConfig(classes = AppConfig.class) class TestingTimeTest { @Test void テスト001() throws InterruptedException { Thread.sleep(1000); } @Test void テスト002() throws InterruptedException {} ・・・ @Test void テスト020() throws InterruptedException {} 実行に1秒かかる テストケースを20個用意 Spring TestContext Frameworkを 使用する。
  • 166. © 2018 NTT DATA Corporation 166 Spring 5変更点:テスト並行実行のサポート 20スレッドで並行実行した結果 並行実行通常実行 20.8秒 1.7秒 12倍の高速化!
  • 167. © 2018 NTT DATA Corporation 167 以下の場合は、並行実行NG! ・@DirtiesContextでテストメソッド実 行後にApplicationContextのキャッ シュを破棄している場合 ・@FixMethodOrderでテストメソッドの 実行順序を指定している場合 ・テストケースがDBやファイルシステムの状 態に依存する場合 Spring 5変更点:テスト並行実行のサポート
  • 168. © 2018 NTT DATA Corporation 168  Springとテスト  クラスやメソッド単位でのテスト  クラス同士を組み合わせたテスト  Spring 5での変更点  JUnit 5のサポート  テスト並行実行のサポート  その他の改善  まとめ
  • 169. © 2018 NTT DATA Corporation 169 JUnitの前処理の直後、後処 理の直前で呼び出されるコール バックメソッドが追加された MockMVCを利用したテスト の結果にリクエストBODYが出 力できるようになった MockMVC利用時に「リダイレ クト先URL」と「フォワード先 URL」を検証する際に、期待値 にURIテンプレートを指定でき るようになった XMLUnit 2.3のサポート Spring 5変更点: その他の改善 https://github.com/spring-projects/spring-framework/wiki/What's-New-in-Spring-Framework-5.x#testing-improvements
  • 170. © 2018 NTT DATA Corporation 170  Springとテスト  クラスやメソッド単位でのテスト  クラス同士を組み合わせたテスト  Spring 5での変更点  JUnit 5のサポート  テスト並行実行のサポート  その他の改善  まとめ
  • 171. © 2018 NTT DATA Corporation 171 Springは テストがしやすい!
  • 172. © 2018 NTT DATA Corporation 172 Spring 5で さらにテスト しやすくなった!
  • 173. © 2018 NTT DATA Corporation 173 Springはテストでも、 最先端技術に 追従している!
  • 174. © 2018 NTT DATA Corporation 174 アプリケーション開発 をするならSpring!
  • 175. © 2018 NTT DATA Corporation
  • 176. © 2018 NTT DATA Corporation 176 * https://qiita.com/kazuki43zoo/items/4a9ead225a9a9897af4a * http://www.atmarkit.co.jp/ait/articles/0504/29/news022_3.html * https://qiita.com/hshimo/items/1136087e1c6e5c5b0d9f * https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-5.x * https://www.infoq.com/jp/news/2017/10/junit5-released * https://speakerdeck.com/rshindo/jjug-ccc-2018-spring * https://oohira.github.io/junit5-doc-jp/user-guide/ * https://github.com/spring-projects/spring-framework/wiki/What%27s-New-in-Spring-Framework-5.x * https://dev.classmethod.jp/testing/unittesting/junit-dynamic-test-case-using-runner/ * https://developer.ibm.com/dwblog/2017/best-new-features-junit-5/ * https://mike-neck.hatenadiary.com/entry/2017/01/01/160244 * https://www.oracle.com/webfolder/technetwork/jp/javamagazine/Java-MJ16-JUnit5.pdf * https://www.slideshare.net/OgawaTakeshi/spring-tdd?ref=http://springfest2017.springframework.jp/ * https://gihyo.jp/dev/serial/01/tdd/0012 * https://www.slideshare.net/uesaka/build-insider-moqfakes * https://qiita.com/1000k/items/aef6aed46b0fc34cc15e * http://acro-engineer.hatenablog.com/entry/2017/12/07/120000 * https://speakerdeck.com/irof/dousiyoujunit5 * https://dev.classmethod.jp/testing/unittesting/where-is-junit5-aheaded/ * https://www.youtube.com/watch?v=h0Idcz71Aog * http://www.ne.jp/asahi/hishidama/home/tech/java/junit/5/assertion.html * Spring徹底入門 * JUnit実践入門 参考文献