Submit Search
Upload
Spring と TDD
•
Download as PPTX, PDF
•
5 likes
•
10,580 views
T
Takeshi Ogawa
Follow
Spring Fest 2017 株式会社タグバンガーズ 小川岳史・古家優 https://youtu.be/GtUcZgTuDzU
Read less
Read more
Engineering
Report
Share
Report
Share
1 of 45
Download now
Recommended
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
Masatoshi Tada
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
Takeshi Ogawa
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門
Ryosuke Uchitate
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
Recommended
Spring Bootの本当の理解ポイント #jjug
Spring Bootの本当の理解ポイント #jjug
Masatoshi Tada
さくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
Takeshi Ogawa
怖くないSpring Bootのオートコンフィグレーション
怖くないSpring Bootのオートコンフィグレーション
土岐 孝平
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門
Ryosuke Uchitate
Dockerfileを改善するためのBest Practice 2019年版
Dockerfileを改善するためのBest Practice 2019年版
Masahito Zembutsu
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
Taku Miyakawa
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)
Toru Makabe
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
NTT DATA Technology & Innovation
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
Ito Takayuki
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
Go Miyasaka
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Ryosuke Uchitate
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
kazuki kumagai
Mavenの真実とウソ
Mavenの真実とウソ
Yoshitaka Kawashima
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
Masatoshi Tada
イベント・ソーシングを知る
イベント・ソーシングを知る
Shuhei Fujita
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Rakuten Group, Inc.
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
normalian
Selenium webdriver使ってみようず
Selenium webdriver使ってみようず
Oda Shinsuke
More Related Content
What's hot
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
Masatoshi Tada
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
NTT DATA Technology & Innovation
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
Y Watanabe
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
土岐 孝平
半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)
Toru Makabe
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
NTT DATA Technology & Innovation
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
Ito Takayuki
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
Go Miyasaka
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Ryosuke Uchitate
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
kazuki kumagai
Mavenの真実とウソ
Mavenの真実とウソ
Yoshitaka Kawashima
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
Masatoshi Tada
イベント・ソーシングを知る
イベント・ソーシングを知る
Shuhei Fujita
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Rakuten Group, Inc.
What's hot
(20)
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
kubernetes初心者がKnative Lambda Runtime触ってみた(Kubernetes Novice Tokyo #13 発表資料)
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
Mavenの真実とウソ
Mavenの真実とウソ
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
イベント・ソーシングを知る
イベント・ソーシングを知る
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Similar to Spring と TDD
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
normalian
Selenium webdriver使ってみようず
Selenium webdriver使ってみようず
Oda Shinsuke
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~
Fujio Kojima
Google App Engine for Java
Google App Engine for Java
Takuya Tsuchida
Selenium webdriver使ってみようず
Selenium webdriver使ってみようず
Oda Shinsuke
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Akira Inoue
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
Akira Inoue
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
Atsuhiro Kubo
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
Nobuhiro Sue
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
Aya Komuro
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0
Yuta Matsumura
Selenium 触ってみよう
Selenium 触ってみよう
Oda Shinsuke
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
Ayumi Goto
Html5 Web Applications
Html5 Web Applications
totty jp
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
Tomoharu ASAMI
TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介
ao27
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
miso- soup3
CruiseControl.NET設置
CruiseControl.NET設置
Kuniaki Igarashi
テスト駆動開発の進化
テスト駆動開発の進化
Yukei Wachi
Similar to Spring と TDD
(20)
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
Selenium webdriver使ってみようず
Selenium webdriver使ってみようず
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~
Google App Engine for Java
Google App Engine for Java
Selenium webdriver使ってみようず
Selenium webdriver使ってみようず
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
Introduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0
Selenium 触ってみよう
Selenium 触ってみよう
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
Html5 Web Applications
Html5 Web Applications
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
CruiseControl.NET設置
CruiseControl.NET設置
テスト駆動開発の進化
テスト駆動開発の進化
Spring と TDD
1.
Spring と TDD Spring
Fest 2017 2017.11.24 株式会社タグバンガーズ 小川岳史・古家優
2.
2 古家優 小川岳史 自己紹介 Spring Lover (10
years) Spring I/O, Spring One 参加 株式会社タグバンガーズ JSUG スタッフ インターン Springビギナー
3.
3 • TDDについて • Spring
TestContext Framework • Spring Boot のテストサポート • Web のテスト • Security のテスト • HTML のテスト • RestClient のテスト • DB のテスト • Docker • まとめ 目次
4.
4 TDDについて
5.
5 TDDとは テストを書く 実装したい オブジェクト テストが成功する 最低限の実装 テスト 失敗 リファクタリング テスト 成功
6.
6 •Unit Tests •Integration Test •System
Tests •User Acceptance Tests テストの種類
7.
7 Unit Test 対象のBeanを取り出してテストを行う(DIコンテナ使わない) Bean Bean テスト対象 Mock Mock @RunWith(JUnitMockitoRunner.class) public class
ArticleManagerTest extends SampleBaseTestCase { @Mock private ArticleCalculator calculator; @Mock(name = "database") private ArticleDatabase dbMock; @Spy private UserProvider userProvider = new ConsumerUserProvider(); @InjectMocks private ArticleManager manager; @Test public void shouldDoSomething() { manager.initiateArticle(); verify(database).addListener(any(ArticleListener.class)); } } 依存依存
8.
8 Integration Test Tomcat API Browser DB cache テスト対象 TDDにおいてはインテグレーションテストが難しい 先にテストを作るが故に、連携先の対象が存在しない状態になってしまう IoC Container
9.
9 @Test @Before @After @AfterClass @BeforeClass @Ignore @Runwith @Category @Rule @SpyBeans @SpyBean @MockBean @MockBeans @TestConfiguration @TestComponent @SpringBootTest @DataMongoTest @AutoConfigureWebMvc @AutoConfigureRestDocs @AutoConfigureWebFlux @AutoConfigureTestEntityManager @AutoConfigureWebClient @TypeExcludeFilters @JooqTest @PropertyMapping @AutoConfigureJdbc @AutoConfigureTestDatabase @RestClientTest @WebMvcTest @DataNeo4jTest @AutoConfigureWebTestClient @AutoConfigureMockRestService Server @AutoConfigureDataJpa @DataRedisTest @DataJpaTest @AutoConfigureDataRedis @AutoConfigureJson @JsonTest @AutoConfigureMockMvc @AutoConfigureDataMongo @AutoConfigureJooq @AutoConfigureJsonTesters @JdbcTest @WebFluxTest @AutoConfigureDataNeo4j @DataLdapTest @AutoConfigureDataLdap @AutoConfigureCache @OverrideAutoConfiguration @SecurityTestExecutionListeners @WithAnonymousUser.java @WithMockUser.java @WithSecurityContext.java @WithUserDetails.java アノテーション @BootstrapWith @ContextConfiguration @WebAppConfiguration @ContextHierarchy @ActiveProfiles @TestPropertySource @DirtiesContext @TestExecutionListeners @Commit @Rollback @BeforeTransaction @AfterTransaction @Sql @SqlConfig @SqlGroup @IfProfileValue @ProfileValueSourceConfiguration @Timed @Repeat JUnit SpringFramework Spring
Boot Spring Security
10.
10 Spring TestContext Framework IoC
Container App Tomcat Browser DB cache API
11.
11 • Bean 同士の連携テストをするために必要 •
立ち上げた IoC コンテナから テスト対象の Bean をテストコードに対して DI したい • 実行速度が遅くなるため IoC コンテナはテストごとに 立ち上げたくない • テストによっては IoC コンテナ内の Bean を変更したい時がある テストと IoC コンテナ
12.
12 Spring TestContext Framework TestContextManager IoC
Container アプリケーションのBean TestContextを立ち上げ管 理する テストするよ! Bean XXX を使う よ! 必要なBeanをTestContext経由でIoC コン テナからテストコードにDIする TestExecutionListener Ref Ref TestContext IoCコンテナを立ち上げる テストコードと対応するIoCコン テナをセットにして管理 テストするって言ってるから、 Bean XXXをくださいー テストコード @Test xxx xxxxxx @Autowired Xxx xxxxx コンテナは他のテストの時も 同じ Bean を利用する
13.
@RunWith(SpringRunner.class) @ContextConfiguration("repository-config.xml") public class TitleRepositoryTests
{ @Autowired private TitleRepository titleRepository; @Test public void findById() { Title title = titleRepository.findById(10); assertNotNull(title); } } Spring TestContext Framework 13 ApplicationContext (IoC Container) TestContextManager TestContext DI 指定がない場合はTestクラスのパッケージ配下から 定義ファイルを検索してくれる
14.
14 Spring Boot のテストサポート IoC
Container App Tomcat Browser DB cache API
15.
15 • 使いはじめるのが簡単 • AutoConfiguration
による Bean の自動登録 • スライステスト • Bean定義のテスト Spring Boot のテストサポートのポイント
16.
16 https://start.spring.io/ で「Generate Project」するだけ Spring
Initializr を使ってすぐに始められる
17.
17 Spring Initializr で用意してくれるライブラリ群 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> test JSONPath テストでよく使うSpringテスト 3rd
partyのライブラリ依存性を 初めから用意してくれている ダウンロードしたファイルのpom.xml は以下のテスト用の依存性が記載されている test
18.
@RunWith(SpringRunner.class) @SpringBootTest public class TitleRepositoryTests
{ @Autowired private TitleRepository titleRepository; @MockBean private …; @Test public void findById() { Title title = titleRepository.findById(10); assertNotNull(title); } } @SpringBootTest 18 ApplicationContext (IoC Container) TestContextManager TestContext AutoConfigure 自動でテストに便利な Beanを定義 sourceフォルダ配下に自 分で定義したBean コンテナ内のBeanをモックに 差し替えてくれる Bootが用意してくれたよ しなにBean Tomcat立ち上げ
19.
19 スライステスト @WebMvcTest @DataJpaTest @RestClientTest @DataRedisTest @JsonTest @DataLdapTest 余計なBeanを作らない テスト対象の連携に必要なBeanのみ作成
20.
20 Bean 定義のテスト public class
SecurityConfigTest { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner(); @Test public void test() { contextRunner.withUserConfiguration(SecurityConfig.class).run(context -> { Assertions.assertThat(context).hasNotFailed(); Assertions.assertThat(context).hasBean("springSecurityFilterChain"); }); } } 2.0.0.M6 ? Beanが通常通り作成できたか コンテナにBeanが存在するか IoC Container
21.
21 Web のテスト IoC Container App Tomcat Browser DB cache API
22.
22 @WebMvcTest IoC Container (WebApplicationContext)TomcatBrowser Dispatcher Servlet Handler Mapping/hello My Controller MockServletContext mvcValidatorMockMvc sourceフォルダ配下に自 分で定義したBean 余計なBeanを作らない スライス (@WebMvcTest) WebMvc用に便利な よしなにBean BrowserとTomcatの 代替をしてくれる
23.
23 MockMvc @RunWith(SpringRunner.class) @WebMvcTest public class WebLayerTest
{ @Autowired private MockMvc mockMvc; @Test public void shouldReturnDefaultMessage() throws Exception { this.mockMvc.perform(get("/")) .andDo(print()) .andExpect(status().isOk()) .andExpect(content().string(containsString("Hello World"))); } }
24.
24 MockHttpServletRequest: HTTP Method =
GET Request URI = /hello Parameters = {} Headers = {Accept=[text/html]} Body = <no character encoding set> Session Attrs = {} Handler: Type = com.example.demo.HelloController Method = public java.lang.String com.example.demo.HelloController.hello() Async: Async started = false Async result = null Resolved Exception: Type = null ModelAndView: View name = hello View = null Model = null FlashMap: Attributes = null MockHttpServletResponse: Status = 200 Error message = null Headers = {Accept-Language=[en], Content- Type=[text/html;charset=UTF-8]} Content type = text/html;charset=UTF-8 Body = <html> <body> Hello </body> </html> Forwarded URL = null Redirected URL = null Cookies = []
25.
25 Security のテスト IoC Container App Tomcat Browser DB cache API
26.
26 Security 用の記述 <dependencies> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> </dependencies>
27.
27 MockMvcとの相性が良い IoC Container Dispatcher Servlet Handler Mapping My Controller mvcValidator MockMvc @SecurityTestExecutionListeners @WithAnonymousUser.java @WithMockUser.java @WithSecurityContext.java @WithUserDetails.java filterや securityConfigを あらかじめ仕込ん でおける
28.
28 mvc.perform(post("/").with(csrf())) mvc.perform(get("/admin") .with(user("admin").password("pass") .roles("USER","ADMIN"))) @Test @WithMockUser public void requestProtectedUrlWithUser()
throws Exception { mvc.perform(get("/")) ... } mvc.perform(formLogin("/auth").user("admin").password("pass")) 認証リクエスト
29.
29 mvc.perform(formLogin().password(“invalid”)) .andExpect(unauthenticated()); mvc.perform(formLogin() .user(“admin”)) .andExpect(authenticated() .withRoles("USER","ADMIN")); レスポンスの検証
30.
30 HTML のテスト IoC Container App Tomcat Browser DB cache API
31.
31 HTML のテスト 31 App Tomcat Browser Controller HtmlUnit GUI-less Browser ❌ Selenium 操作 クリックや入力など MockMvc WebDriver MockMvc
を介して E2E テストができる JSも実行可能
32.
32 @RunWith(SpringRunner.class) @WebMvcTest public class LoginHtmlTests
{ @Autowired private WebDriver webDriver; @Test public void test() { webDriver.get("http://localhost:8080/hello"); Assertions.assertThat(webDriver.getCurrentUrl()) .isEqualTo("http://localhost:8080/login"); LoginPage loginPage = PageFactory.initElements(webDriver, LoginPage.class); loginPage.getUsername().sendKeys("user"); loginPage.getPassword().sendKeys("password"); loginPage.getSubmit().click(); Assertions.assertThat(webDriver.getCurrentUrl()) .isEqualTo("http://localhost:8080/hello"); } } WebDriver
33.
33 Page Objects public class
LoginPage { @FindBy(css = "input[name=username]") private WebElement username; @FindBy(css = "input[name=password]") private WebElement password; @FindBy(css = "input[type=submit]") private WebElement submit; … }
34.
34 REST Client のテスト IoC
Container App Tomcat Browser DB cache API
35.
35 @RestClientTest App Service RestTemplate MockRestServiceServer 代わり API ❌
36.
36 クライアントサイド @Service public class DetailsService
{ private final RestTemplate restTemplate; public DetailsService(RestTemplateBuilder restTemplateBuilder) { restTemplate = restTemplateBuilder.build(); } public Details getUserDetails(String name) { return restTemplate.getForObject("/{name}/details",Details.class, name); } }
37.
37 @RunWith(SpringRunner.class) @RestClientTest(DetailsService.class) public class DetailsServiceTest
{ @Autowired private DetailsServiceClient client; @Autowired private MockRestServiceServer server; @Autowired private ObjectMapper objectMapper; @Before public void setUp() throws Exception { String details = objectMapper.writeValueAsString(new Details("John Smith", "john")); server.expect(requestTo("/john")).andRespond(withSuccess(details, MediaType.APPLICATION_JSON)); } @Test public void whenCallingGetUserDetails_thenClientMakesCorrectCall() throws Exception { Details details = this.client.getUserDetails("john"); assertThat(details.getLogin()).isEqualTo("john"); assertThat(details.getName()).isEqualTo("John Smith"); } } テストコード
38.
38 DB のテスト IoC Container App Tomcat Browser DB cache API
39.
39 @DataJpaTest IoC Container TestEntityManager DataSource 余計なBeanを作らない スライス (@DataJpaTest) Data
JPAに便利な よしなBean Internal DBと差し替えてく れる DB MyRepository @AutoConfigureTestDatabase イニシャルデータのセットアップ
40.
40 src/test/resources の application.properties
に記載 イニシャルデータのセットアップ spring.datasource.schema=schema.sql spring.datasource.data=data.sql
41.
41 Docker のテスト IoC Container App Tomcat Browser DB cache API
42.
42 docker-compose.yml version: '2.3' services: mysql: image: mysql:5.6 ports: -
"3306:3306" redis: image: redis:3.2.4 command: redis-server --appendonly yes --requirepass 1qazxsw2 ports: - "6379:6379" smtp: image: djfarrelly/maildev ports: - "25:25"
43.
43 fabric8io/docker-maven-plugin を使う pom.xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> </plugin> <plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId> <version>0.23.0</version> <configuration> <images> <image> <external> <type>compose</type> <basedir>./</basedir> </external> </image> </images> </configuration> <executions> … </executions> </plugin>
44.
44 やっぱり Spring は
TDD においても Bootiful だった! JOSH LONG さんによるこちらもデモがおすすめ Spring Tips: Bootiful Testing https://spring.io/blog/2017/11/22/spring-tips-bootiful-testing さいごに
45.
Thank you!
Editor's Notes
TDDをしている方どれくらい Springを使ってTDDしているかた? 話す内容 ✕ TDD自体の凄さ ✕ 他の開発手法との比較 ◯SpringがTDDを行いやすくするためにどんなサポート
さらっとTDDってなんだっけ?どういうメリット? 程度におさらい springがTDDをどうサポートしてくれているのか、 実際にTDDをする時に困りそうなケース別にピックアップして紹介
そもそもTDDって
(サイクルの説明) このサイクルをぐるぐる回すのがTDD. サイクルが早く回せれば回せるほど、TDDをするメリットが活きてくる メリット=プロダクトコードが全部テスタブルで保守性が高い 素晴らしいメリットですが、 例えばこだわるあまり、はじめに手こずってしまって、肝心の開発が進まないなんてことでは元も子もない。 本当にほしいものはプロダクトコード。 TDDしてプロダクトコードが全然進まないようであれば、先にプロダクトコードを書いてしまったほうがいい TDDではスピードがすごく大事で、特に重要なのはテストがいかに早く、簡単に書けるか
テストは主に二種類
まずユニットテストを、なにもない状態で書くことを想像していただきたい 単体のテスト。周りは全部モック。 そう考えると、何もない状態からテストを書くのは結構簡単。 でもユニットテスト十分か?
インテグレーションテ スト もし たい またTDDでインテグレーションテストを書くことを想像していただきたい 先にテストを書きますが、テストしたい連携先が存在しない どうインテグレーションテストかけばいいんじゃ! Springは、 プロダクトコードを何も書いていない状態でも、 あらゆる連携のテスト が書けるようにサポー ト 今日はそのサポートが具体的にどんなものがあってどんな仕組みなのか掘り 下げていきます。
実際Springはなにをしてくれるのか。 一言で表すと、とにかく大量の便利なアノテーショ ン 端的に言えば、これらのアノテーションを上手に使いこなすだけで様々な形 のインテグレーションテストが簡単に早く書ける
ここからが本題 そのテストしたいけど存在しない連携先ごとに、springがどうインテグレーションテストを書きやすくしてくれているのか まずBean同士の連携のインテグレーションテストがしたい!でもIoCコンテナが無い! そんな時に便利なのがSpringTestContextFramework.
まずbeanの連携がテストしたかったらIoCコンテナが必要 じゃあIoCコンテナをインスタンス化すれば? そういうわけにはいかない。 ・中身を変えたいときもでてくるかも ・いちいち立ち上げる? STCFは、キャッシング&中身カスタマイズ
**アニメーション** 使い方を説明する前に、仕組み まず主な登場人物。 具体的な流れを説明すると、
**アニメーション** 仕組みは複雑だが、知っている必要はない。 ただこんな色々なことをしてくれているよと伝えたかった。 肝心の使い方は? 重要なのは、 2つのアノテーションさえつければ テスト対象をAutowiredして依存関係をテストできる。
Spring Boot のテストサポートを活用すれば、IoC コンテナとその外の世界とのインテグレーションテストが容易になります
始め方は本当に簡単で まずInitializer から何も設定せずにプロジェクトを作成します
で、DLしたプロジェクトのpomを見てみると、もう既にtestで活用できるライ ブラリなどが用意され てい るん です ね。 Junitだったり、mockitoだったり、hamcrestだったり。 たったこれだけで、もうspringのテストサポートは受けられます
@ContextConfiguration が @SpringBootTest に置き換わっている プロダクションコードでの Spring Boot の恩恵と同様にテストコードにおいても Spring Boot のオートコンフィグレーションの機能によって自動でよしなに Bean が登録される
ケーキ全体が IoC 全体 TDD なので、まだ完成していない部分もある
最近 Docker の普及の勢いはすごいですね!実際の DB や Redis サーバと E2E テストしたい場合に、Docker を使うという選択肢もあります。
Download now