Submit Search
Upload
Spring と TDD
Report
Share
T
Takeshi Ogawa
Follow
•
5 likes
•
10,512 views
1
of
45
Spring と TDD
•
5 likes
•
10,512 views
Report
Share
Download Now
Download to read offline
Engineering
Spring Fest 2017 株式会社タグバンガーズ 小川岳史・古家優 https://youtu.be/GtUcZgTuDzU
Read more
T
Takeshi Ogawa
Follow
Recommended
ドメイン駆動設計 ( DDD ) をやってみよう by
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
50.1K views
•
45 slides
20160526 依存関係逆転の原則 by
20160526 依存関係逆転の原則
bonjin6770 Kurosawa
17K views
•
70 slides
Kotlinアンチパターン by
Kotlinアンチパターン
Recruit Lifestyle Co., Ltd.
53.1K views
•
90 slides
オブジェクト指向の設計と実装の学び方のコツ by
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
95.1K views
•
76 slides
オブジェクト指向エクササイズのススメ by
オブジェクト指向エクササイズのススメ
Yoji Kanno
57.2K views
•
85 slides
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 - by
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
3.2K views
•
30 slides
More Related Content
What's hot
オブジェクト指向プログラミングのためのモデリング入門 by
オブジェクト指向プログラミングのためのモデリング入門
増田 亨
37K views
•
47 slides
ドメイン駆動設計のための Spring の上手な使い方 by
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
138.1K views
•
55 slides
ドメイン駆動設計サンプルコードの徹底解説 by
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
20.3K views
•
41 slides
入社1年目のプログラミング初心者がSpringを学ぶための手引き by
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平
24.8K views
•
60 slides
例外設計における大罪 by
例外設計における大罪
Takuto Wada
68.6K views
•
37 slides
リーンなコードを書こう:実践的なオブジェクト指向設計 by
リーンなコードを書こう:実践的なオブジェクト指向設計
増田 亨
15.7K views
•
51 slides
What's hot
(20)
オブジェクト指向プログラミングのためのモデリング入門 by 増田 亨
オブジェクト指向プログラミングのためのモデリング入門
増田 亨
•
37K views
ドメイン駆動設計のための Spring の上手な使い方 by 増田 亨
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
•
138.1K views
ドメイン駆動設計サンプルコードの徹底解説 by 増田 亨
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
•
20.3K views
入社1年目のプログラミング初心者がSpringを学ぶための手引き by 土岐 孝平
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平
•
24.8K views
例外設計における大罪 by Takuto Wada
例外設計における大罪
Takuto Wada
•
68.6K views
リーンなコードを書こう:実践的なオブジェクト指向設計 by 増田 亨
リーンなコードを書こう:実践的なオブジェクト指向設計
増田 亨
•
15.7K views
Test Yourself - テストを書くと何がどう変わるか by Takuto Wada
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada
•
38.3K views
3週連続DDDその1 ドメイン駆動設計の基本を理解する by 増田 亨
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
•
32.5K views
世界一わかりやすいClean Architecture by Atsushi Nakamura
世界一わかりやすいClean Architecture
Atsushi Nakamura
•
47.2K views
ドメイン駆動設計 基本を理解する by 増田 亨
ドメイン駆動設計 基本を理解する
増田 亨
•
117.5K views
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版) by Takuto Wada
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
•
70.7K views
インセプションデッキ:やらないことリストとトレードオフスライダーをやってる話 by Nobuhiro Yoshitake
インセプションデッキ:やらないことリストとトレードオフスライダーをやってる話
Nobuhiro Yoshitake
•
6.6K views
Cognitive Complexity でコードの複雑さを定量的に計測しよう by Shuto Suzuki
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Shuto Suzuki
•
10.9K views
ドメイン駆動設計 本格入門 by 増田 亨
ドメイン駆動設計 本格入門
増田 亨
•
44.6K views
Spring Boot + Netflix Eureka by 心 谷本
Spring Boot + Netflix Eureka
心 谷本
•
41.2K views
ドメイン駆動設計 の 実践 Part3 DDD by 増田 亨
ドメイン駆動設計 の 実践 Part3 DDD
増田 亨
•
8.8K views
ドメインオブジェクトの見つけ方・作り方・育て方 by 増田 亨
ドメインオブジェクトの見つけ方・作り方・育て方
増田 亨
•
30.6K views
Form認証で学ぶSpring Security入門 by Ryosuke Uchitate
Form認証で学ぶSpring Security入門
Ryosuke Uchitate
•
11.2K views
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか by Koichiro Matsuoka
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
•
48.5K views
組織にテストを書く文化を根付かせる戦略と戦術 by Takuto Wada
組織にテストを書く文化を根付かせる戦略と戦術
Takuto Wada
•
76.4K views
Similar to Spring と TDD
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~ by
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
normalian
10.4K views
•
42 slides
Selenium webdriver使ってみようず by
Selenium webdriver使ってみようず
Oda Shinsuke
12.2K views
•
56 slides
C#勉強会 ~ C#9の新機能 ~ by
C#勉強会 ~ C#9の新機能 ~
Fujio Kojima
517 views
•
54 slides
Google App Engine for Java by
Google App Engine for Java
Takuya Tsuchida
5.5K views
•
67 slides
Selenium webdriver使ってみようず by
Selenium webdriver使ってみようず
Oda Shinsuke
2.6K views
•
20 slides
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~ by
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Akira Inoue
3.2K views
•
55 slides
Similar to Spring と TDD
(20)
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~ by normalian
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
normalian
•
10.4K views
Selenium webdriver使ってみようず by Oda Shinsuke
Selenium webdriver使ってみようず
Oda Shinsuke
•
12.2K views
C#勉強会 ~ C#9の新機能 ~ by Fujio Kojima
C#勉強会 ~ C#9の新機能 ~
Fujio Kojima
•
517 views
Google App Engine for Java by Takuya Tsuchida
Google App Engine for Java
Takuya Tsuchida
•
5.5K views
Selenium webdriver使ってみようず by Oda Shinsuke
Selenium webdriver使ってみようず
Oda Shinsuke
•
2.6K views
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~ by Akira Inoue
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Akira Inoue
•
3.2K views
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc... by Akira Inoue
TypeScript ファースト ステップ (v.0.9 対応版) ~ Any browser. Any host. Any OS. Open Sourc...
Akira Inoue
•
3.6K views
Introduction to Continuous Test Runner MakeGood by Atsuhiro Kubo
Introduction to Continuous Test Runner MakeGood
Atsuhiro Kubo
•
1.2K views
G*workshop 2011/11/22 Geb+Betamax by Nobuhiro Sue
G*workshop 2011/11/22 Geb+Betamax
Nobuhiro Sue
•
2.7K views
PHP 2大 web フレームワークの徹底比較! by Shohei Okada
PHP 2大 web フレームワークの徹底比較!
Shohei Okada
•
13.4K views
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」 by Aya Komuro
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
Aya Komuro
•
1.4K views
復習も兼ねて!C#6.0-7.0 by Yuta Matsumura
復習も兼ねて!C#6.0-7.0
Yuta Matsumura
•
324 views
Selenium 触ってみよう by Oda Shinsuke
Selenium 触ってみよう
Oda Shinsuke
•
1.7K views
エンタープライズ分野での実践AngularJS by Ayumi Goto
エンタープライズ分野での実践AngularJS
Ayumi Goto
•
9.7K views
Html5 Web Applications by totty jp
Html5 Web Applications
totty jp
•
3.4K views
TreeFrog Frameworkの紹介 by ao27
TreeFrog Frameworkの紹介
ao27
•
3.5K views
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825 by miso- soup3
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
miso- soup3
•
10.6K views
CruiseControl.NET設置 by Kuniaki Igarashi
CruiseControl.NET設置
Kuniaki Igarashi
•
1.5K views
テスト駆動開発の進化 by Yukei Wachi
テスト駆動開発の進化
Yukei Wachi
•
20.2K views
CLRH_120414_WFTDD by Tomoyuki Obi
CLRH_120414_WFTDD
Tomoyuki Obi
•
773 views
More from Takeshi Ogawa
今こそ知りたい Spring Data by
今こそ知りたい Spring Data
Takeshi Ogawa
276 views
•
34 slides
Spring Cloud Gateway on Kubernetes by
Spring Cloud Gateway on Kubernetes
Takeshi Ogawa
1.4K views
•
36 slides
Spring I/O 2019 Recap - Moduliths by
Spring I/O 2019 Recap - Moduliths
Takeshi Ogawa
2.1K views
•
38 slides
Spring data-rest-and-spring-cloud-contract by
Spring data-rest-and-spring-cloud-contract
Takeshi Ogawa
8.6K views
•
56 slides
さくっと作るSpring入門 with Google Home by
さくっと作るSpring入門 with Google Home
Takeshi Ogawa
671 views
•
14 slides
さくっと理解するSpring bootの仕組み by
さくっと理解するSpring bootの仕組み
Takeshi Ogawa
65.2K views
•
38 slides
More from Takeshi Ogawa
(6)
今こそ知りたい Spring Data by Takeshi Ogawa
今こそ知りたい Spring Data
Takeshi Ogawa
•
276 views
Spring Cloud Gateway on Kubernetes by Takeshi Ogawa
Spring Cloud Gateway on Kubernetes
Takeshi Ogawa
•
1.4K views
Spring I/O 2019 Recap - Moduliths by Takeshi Ogawa
Spring I/O 2019 Recap - Moduliths
Takeshi Ogawa
•
2.1K views
Spring data-rest-and-spring-cloud-contract by Takeshi Ogawa
Spring data-rest-and-spring-cloud-contract
Takeshi Ogawa
•
8.6K views
さくっと作るSpring入門 with Google Home by Takeshi Ogawa
さくっと作るSpring入門 with Google Home
Takeshi Ogawa
•
671 views
さくっと理解するSpring bootの仕組み by Takeshi Ogawa
さくっと理解するSpring bootの仕組み
Takeshi Ogawa
•
65.2K views
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 を使うという選択肢もあります。