SlideShare a Scribd company logo
1 of 45
Spring と TDD
Spring Fest 2017
2017.11.24
株式会社タグバンガーズ
小川岳史・古家優
2
古家優
小川岳史
自己紹介
Spring Lover (10 years)
Spring I/O, Spring One 参加
株式会社タグバンガーズ JSUG スタッフ
インターン
Springビギナー
3
• TDDについて
• Spring TestContext Framework
• Spring Boot のテストサポート
• Web のテスト
• Security のテスト
• HTML のテスト
• RestClient のテスト
• DB のテスト
• Docker
• まとめ
目次
4
TDDについて
5
TDDとは
テストを書く
実装したい
オブジェクト
テストが成功する
最低限の実装
テスト
失敗
リファクタリング
テスト
成功
6
•Unit Tests
•Integration Test
•System Tests
•User Acceptance Tests
テストの種類
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
Integration Test
Tomcat
API
Browser
DB
cache
テスト対象
TDDにおいてはインテグレーションテストが難しい
先にテストを作るが故に、連携先の対象が存在しない状態になってしまう
IoC Container
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
Spring TestContext Framework
IoC Container
App
Tomcat
Browser
DB
cache
API
11
• Bean 同士の連携テストをするために必要
• 立ち上げた IoC コンテナから
テスト対象の Bean をテストコードに対して DI したい
• 実行速度が遅くなるため IoC コンテナはテストごとに
立ち上げたくない
• テストによっては IoC コンテナ内の Bean を変更したい時がある
テストと IoC コンテナ
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 を利用する
@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
Spring Boot のテストサポート
IoC Container
App
Tomcat
Browser
DB
cache
API
15
• 使いはじめるのが簡単
• AutoConfiguration による Bean の自動登録
• スライステスト
• Bean定義のテスト
Spring Boot のテストサポートのポイント
16
https://start.spring.io/ で「Generate Project」するだけ
Spring Initializr を使ってすぐに始められる
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
@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
スライステスト @WebMvcTest
@DataJpaTest
@RestClientTest
@DataRedisTest
@JsonTest
@DataLdapTest
余計なBeanを作らない
テスト対象の連携に必要なBeanのみ作成
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
Web のテスト
IoC Container
App
Tomcat
Browser
DB
cache
API
22
@WebMvcTest
IoC Container
(WebApplicationContext)TomcatBrowser
Dispatcher
Servlet
Handler
Mapping/hello
My
Controller
MockServletContext
mvcValidatorMockMvc
sourceフォルダ配下に自
分で定義したBean
余計なBeanを作らない
スライス (@WebMvcTest)
WebMvc用に便利な
よしなにBean
BrowserとTomcatの
代替をしてくれる
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
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
Security のテスト
IoC Container
App
Tomcat
Browser
DB
cache
API
26
Security 用の記述
<dependencies>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
27
MockMvcとの相性が良い
IoC Container
Dispatcher
Servlet
Handler
Mapping
My Controller
mvcValidator
MockMvc
@SecurityTestExecutionListeners
@WithAnonymousUser.java
@WithMockUser.java
@WithSecurityContext.java
@WithUserDetails.java
filterや
securityConfigを
あらかじめ仕込ん
でおける
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
mvc.perform(formLogin().password(“invalid”))
.andExpect(unauthenticated());
mvc.perform(formLogin()
.user(“admin”))
.andExpect(authenticated()
.withRoles("USER","ADMIN"));
レスポンスの検証
30
HTML のテスト
IoC Container
App
Tomcat
Browser
DB
cache
API
31
HTML のテスト
31
App
Tomcat
Browser
Controller
HtmlUnit
GUI-less Browser
❌
Selenium
操作
クリックや入力など
MockMvc
WebDriver
MockMvc を介して E2E テストができる
JSも実行可能
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
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
REST Client のテスト
IoC Container
App
Tomcat
Browser
DB
cache
API
35
@RestClientTest
App
Service
RestTemplate
MockRestServiceServer
代わり
API
❌
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
@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
DB のテスト
IoC Container
App
Tomcat
Browser
DB
cache
API
39
@DataJpaTest
IoC Container
TestEntityManager
DataSource
余計なBeanを作らない
スライス (@DataJpaTest)
Data JPAに便利な
よしなBean Internal DBと差し替えてく
れる
DB
MyRepository
@AutoConfigureTestDatabase
イニシャルデータのセットアップ
40
src/test/resources の application.properties に記載
イニシャルデータのセットアップ
spring.datasource.schema=schema.sql
spring.datasource.data=data.sql
41
Docker のテスト
IoC Container
App
Tomcat
Browser
DB
cache
API
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
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
やっぱり Spring は TDD においても Bootiful
だった!
JOSH LONG さんによるこちらもデモがおすすめ
Spring Tips: Bootiful Testing
https://spring.io/blog/2017/11/22/spring-tips-bootiful-testing
さいごに
Thank you!

More Related Content

What's hot

Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き土岐 孝平
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)NTT DATA Technology & Innovation
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -onozaty
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところY Watanabe
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと土岐 孝平
 
半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)Toru Makabe
 
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
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善Ito Takayuki
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドAkihiro Suda
 
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 の上手な使い方増田 亨
 
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!Ryosuke Uchitate
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本kazuki kumagai
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)Takuto Wada
 
初めてでも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
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知るShuhei Fujita
 
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり Rakuten Group, Inc.
 

What's hot (20)

Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 
入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
 
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
モノリスからマイクロサービスへの移行 ~ストラングラーパターンの検証~(Spring Fest 2020講演資料)
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 
これからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきことこれからSpringを使う開発者が知っておくべきこと
これからSpringを使う開発者が知っておくべきこと
 
半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)半日でわかる コンテナー技術 (入門編)
半日でわかる コンテナー技術 (入門編)
 
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 発表資料)
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!Amazon Cognito使って認証したい?それならSpring Security使いましょう!
Amazon Cognito使って認証したい?それならSpring Security使いましょう!
 
ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本ぱぱっと理解するSpring Cloudの基本
ぱぱっと理解するSpring Cloudの基本
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
 
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
初めてでも30分で分かるSpring 5 & Spring Boot 2オーバービュー
 
イベント・ソーシングを知る
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
 
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
Spring Data RESTを利用したAPIの設計と、作り直しまでの道のり
 

Similar to Spring と TDD

基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~Fujio Kojima
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for JavaTakuya Tsuchida
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~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...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 MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGoodAtsuhiro Kubo
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxNobuhiro Sue
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!Shohei Okada
 
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」Aya Komuro
 
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0Yuta Matsumura
 
Selenium 触ってみよう
Selenium 触ってみようSelenium 触ってみよう
Selenium 触ってみようOda Shinsuke
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
Html5 Web Applications
Html5  Web ApplicationsHtml5  Web Applications
Html5 Web Applicationstotty jp
 
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】Tomoharu ASAMI
 
TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介ao27
 
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825 Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825 miso- soup3
 
テスト駆動開発の進化
テスト駆動開発の進化テスト駆動開発の進化
テスト駆動開発の進化Yukei Wachi
 

Similar to Spring と TDD (20)

基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~
 
Google App Engine for Java
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for Java
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~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...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 MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
 
G*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
 
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
 
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0
 
Selenium 触ってみよう
Selenium 触ってみようSelenium 触ってみよう
Selenium 触ってみよう
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
Html5 Web Applications
Html5  Web ApplicationsHtml5  Web Applications
Html5 Web Applications
 
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
実装(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第32回】
 
TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介
 
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825 Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
 
CruiseControl.NET設置
CruiseControl.NET設置CruiseControl.NET設置
CruiseControl.NET設置
 
テスト駆動開発の進化
テスト駆動開発の進化テスト駆動開発の進化
テスト駆動開発の進化
 

Spring と TDD

Editor's Notes

  1. TDDをしている方どれくらい Springを使ってTDDしているかた? 話す内容 ✕ TDD自体の凄さ ✕ 他の開発手法との比較 ◯SpringがTDDを行いやすくするためにどんなサポート
  2. さらっとTDDってなんだっけ?どういうメリット? 程度におさらい springがTDDをどうサポートしてくれているのか、 実際にTDDをする時に困りそうなケース別にピックアップして紹介
  3. そもそもTDDって
  4. (サイクルの説明) このサイクルをぐるぐる回すのがTDD. サイクルが早く回せれば回せるほど、TDDをするメリットが活きてくる メリット=プロダクトコードが全部テスタブルで保守性が高い 素晴らしいメリットですが、 例えばこだわるあまり、はじめに手こずってしまって、肝心の開発が進まないなんてことでは元も子もない。 本当にほしいものはプロダクトコード。 TDDしてプロダクトコードが全然進まないようであれば、先にプロダクトコードを書いてしまったほうがいい TDDではスピードがすごく大事で、特に重要なのはテストがいかに早く、簡単に書けるか
  5. テストは主に二種類
  6. まずユニットテストを、なにもない状態で書くことを想像していただきたい 単体のテスト。周りは全部モック。 そう考えると、何もない状態からテストを書くのは結構簡単。 でもユニットテスト十分か?
  7. インテグレーションテ スト もし たい またTDDでインテグレーションテストを書くことを想像していただきたい 先にテストを書きますが、テストしたい連携先が存在しない どうインテグレーションテストかけばいいんじゃ! Springは、 プロダクトコードを何も書いていない状態でも、 あらゆる連携のテスト が書けるようにサポー ト 今日はそのサポートが具体的にどんなものがあってどんな仕組みなのか掘り 下げていきます。
  8. 実際Springはなにをしてくれるのか。 一言で表すと、とにかく大量の便利なアノテーショ ン 端的に言えば、これらのアノテーションを上手に使いこなすだけで様々な形 のインテグレーションテストが簡単に早く書ける
  9. ここからが本題 そのテストしたいけど存在しない連携先ごとに、springがどうインテグレーションテストを書きやすくしてくれているのか まずBean同士の連携のインテグレーションテストがしたい!でもIoCコンテナが無い! そんな時に便利なのがSpringTestContextFramework.
  10. まずbeanの連携がテストしたかったらIoCコンテナが必要 じゃあIoCコンテナをインスタンス化すれば? そういうわけにはいかない。 ・中身を変えたいときもでてくるかも ・いちいち立ち上げる? STCFは、キャッシング&中身カスタマイズ
  11. **アニメーション** 使い方を説明する前に、仕組み まず主な登場人物。 具体的な流れを説明すると、
  12. **アニメーション** 仕組みは複雑だが、知っている必要はない。 ただこんな色々なことをしてくれているよと伝えたかった。 肝心の使い方は? 重要なのは、 2つのアノテーションさえつければ テスト対象をAutowiredして依存関係をテストできる。
  13. Spring Boot のテストサポートを活用すれば、IoC コンテナとその外の世界とのインテグレーションテストが容易になります
  14. 始め方は本当に簡単で まずInitializer から何も設定せずにプロジェクトを作成します
  15. で、DLしたプロジェクトのpomを見てみると、もう既にtestで活用できるライ ブラリなどが用意され てい るん です ね。 Junitだったり、mockitoだったり、hamcrestだったり。 たったこれだけで、もうspringのテストサポートは受けられます
  16. @ContextConfiguration が @SpringBootTest に置き換わっている プロダクションコードでの Spring Boot の恩恵と同様にテストコードにおいても Spring Boot のオートコンフィグレーションの機能によって自動でよしなに Bean が登録される
  17. ケーキ全体が IoC 全体 TDD なので、まだ完成していない部分もある
  18. 最近 Docker の普及の勢いはすごいですね! 実際の DB や Redis サーバと E2E テストしたい場合に、Docker を使うという選択肢もあります。