Spring と TDD

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!
1 of 45

Recommended

ドメイン駆動設計 ( DDD ) をやってみよう by
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう増田 亨
50.1K views45 slides
20160526 依存関係逆転の原則 by
20160526 依存関係逆転の原則20160526 依存関係逆転の原則
20160526 依存関係逆転の原則bonjin6770 Kurosawa
17K views70 slides
Kotlinアンチパターン by
KotlinアンチパターンKotlinアンチパターン
KotlinアンチパターンRecruit Lifestyle Co., Ltd.
53.1K views90 slides
オブジェクト指向の設計と実装の学び方のコツ by
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ増田 亨
95.1K views76 slides
オブジェクト指向エクササイズのススメ by
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメYoji Kanno
57.2K views85 slides
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 - by
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -onozaty
3.2K views30 slides

More Related Content

What's hot

オブジェクト指向プログラミングのためのモデリング入門 by
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門増田 亨
37K views47 slides
ドメイン駆動設計のための Spring の上手な使い方 by
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方増田 亨
138.1K views55 slides
ドメイン駆動設計サンプルコードの徹底解説 by
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説増田 亨
20.3K views41 slides
入社1年目のプログラミング初心者がSpringを学ぶための手引き by
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き土岐 孝平
24.8K views60 slides
例外設計における大罪 by
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
68.6K views37 slides
リーンなコードを書こう:実践的なオブジェクト指向設計 by
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計増田 亨
15.7K views51 slides

What's hot(20)

オブジェクト指向プログラミングのためのモデリング入門 by 増田 亨
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
増田 亨37K views
ドメイン駆動設計のための Spring の上手な使い方 by 増田 亨
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨138.1K views
ドメイン駆動設計サンプルコードの徹底解説 by 増田 亨
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨20.3K views
入社1年目のプログラミング初心者がSpringを学ぶための手引き by 土岐 孝平
入社1年目のプログラミング初心者がSpringを学ぶための手引き入社1年目のプログラミング初心者がSpringを学ぶための手引き
入社1年目のプログラミング初心者がSpringを学ぶための手引き
土岐 孝平24.8K views
例外設計における大罪 by Takuto Wada
例外設計における大罪例外設計における大罪
例外設計における大罪
Takuto Wada68.6K views
リーンなコードを書こう:実践的なオブジェクト指向設計 by 増田 亨
リーンなコードを書こう:実践的なオブジェクト指向設計リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計
増田 亨15.7K views
Test Yourself - テストを書くと何がどう変わるか by Takuto Wada
Test Yourself - テストを書くと何がどう変わるかTest Yourself - テストを書くと何がどう変わるか
Test Yourself - テストを書くと何がどう変わるか
Takuto Wada38.3K views
3週連続DDDその1 ドメイン駆動設計の基本を理解する by 増田 亨
3週連続DDDその1  ドメイン駆動設計の基本を理解する3週連続DDDその1  ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨32.5K views
世界一わかりやすいClean Architecture by Atsushi Nakamura
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura47.2K views
ドメイン駆動設計 基本を理解する by 増田 亨
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨117.5K views
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版) by Takuto Wada
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada70.7K views
インセプションデッキ: やらないことリストと トレードオフスライダーをやってる話 by Nobuhiro Yoshitake
インセプションデッキ:やらないことリストとトレードオフスライダーをやってる話インセプションデッキ:やらないことリストとトレードオフスライダーをやってる話
インセプションデッキ: やらないことリストと トレードオフスライダーをやってる話
Nobuhiro Yoshitake6.6K views
Cognitive Complexity でコードの複雑さを定量的に計測しよう by Shuto Suzuki
Cognitive Complexity でコードの複雑さを定量的に計測しようCognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Shuto Suzuki10.9K views
ドメイン駆動設計 本格入門 by 増田 亨
ドメイン駆動設計 本格入門ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
増田 亨44.6K views
Spring Boot + Netflix Eureka by 心 谷本
Spring Boot + Netflix EurekaSpring Boot + Netflix Eureka
Spring Boot + Netflix Eureka
心 谷本41.2K views
ドメイン駆動設計 の 実践 Part3 DDD by 増田 亨
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD
増田 亨8.8K views
ドメインオブジェクトの見つけ方・作り方・育て方 by 増田 亨
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
増田 亨30.6K views
Form認証で学ぶSpring Security入門 by Ryosuke Uchitate
Form認証で学ぶSpring Security入門Form認証で学ぶSpring Security入門
Form認証で学ぶSpring Security入門
Ryosuke Uchitate11.2K views
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか by Koichiro Matsuoka
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka48.5K views
組織にテストを書く文化を根付かせる戦略と戦術 by Takuto Wada
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
Takuto Wada76.4K views

Similar to Spring と TDD

基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~ by
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
10.4K views42 slides
Selenium webdriver使ってみようず by
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
12.2K views56 slides
C#勉強会 ~ C#9の新機能 ~ by
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~Fujio Kojima
517 views54 slides
Google App Engine for Java by
Google App Engine for JavaGoogle App Engine for Java
Google App Engine for JavaTakuya Tsuchida
5.5K views67 slides
Selenium webdriver使ってみようず by
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
2.6K views20 slides
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~ by
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
3.2K views55 slides

Similar to Spring と TDD(20)

基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~ by normalian
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
normalian10.4K views
Selenium webdriver使ってみようず by Oda Shinsuke
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
Oda Shinsuke12.2K views
C#勉強会 ~ C#9の新機能 ~ by Fujio Kojima
C#勉強会 ~ C#9の新機能 ~C#勉強会 ~ C#9の新機能 ~
C#勉強会 ~ C#9の新機能 ~
Fujio Kojima517 views
Selenium webdriver使ってみようず by Oda Shinsuke
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
Oda Shinsuke2.6K views
Visual Studio 2012 Web 開発 ~ One ASP.NET から TypeScript まで ~ by Akira Inoue
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 Inoue3.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...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 Inoue3.6K views
Introduction to Continuous Test Runner MakeGood by Atsuhiro Kubo
Introduction to Continuous Test Runner MakeGoodIntroduction to Continuous Test Runner MakeGood
Introduction to Continuous Test Runner MakeGood
Atsuhiro Kubo1.2K views
G*workshop 2011/11/22 Geb+Betamax by Nobuhiro Sue
G*workshop 2011/11/22 Geb+BetamaxG*workshop 2011/11/22 Geb+Betamax
G*workshop 2011/11/22 Geb+Betamax
Nobuhiro Sue2.7K views
PHP 2大 web フレームワークの徹底比較! by Shohei Okada
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
Shohei Okada13.4K views
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」 by Aya Komuro
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
hktstudy 201206 「私だってやれば出来る子!♥Multi-Mechanize♥」
Aya Komuro1.4K views
復習も兼ねて!C#6.0-7.0 by Yuta Matsumura
復習も兼ねて!C#6.0-7.0復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0
Yuta Matsumura324 views
Selenium 触ってみよう by Oda Shinsuke
Selenium 触ってみようSelenium 触ってみよう
Selenium 触ってみよう
Oda Shinsuke1.7K views
エンタープライズ分野での実践AngularJS by Ayumi Goto
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
Ayumi Goto9.7K views
Html5 Web Applications by totty jp
Html5  Web ApplicationsHtml5  Web Applications
Html5 Web Applications
totty jp3.4K views
TreeFrog Frameworkの紹介 by ao27
TreeFrog Frameworkの紹介TreeFrog Frameworkの紹介
TreeFrog Frameworkの紹介
ao273.5K views
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825 by miso- soup3
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825 Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
Hokuriku.NET ASP.NET MVC入門 「実践」 20120825
miso- soup310.6K views
テスト駆動開発の進化 by Yukei Wachi
テスト駆動開発の進化テスト駆動開発の進化
テスト駆動開発の進化
Yukei Wachi20.2K views

More from Takeshi Ogawa

今こそ知りたい Spring Data by
今こそ知りたい Spring Data今こそ知りたい Spring Data
今こそ知りたい Spring DataTakeshi Ogawa
276 views34 slides
Spring Cloud Gateway on Kubernetes by
Spring Cloud Gateway on KubernetesSpring Cloud Gateway on Kubernetes
Spring Cloud Gateway on KubernetesTakeshi Ogawa
1.4K views36 slides
Spring I/O 2019 Recap - Moduliths by
Spring I/O 2019 Recap - ModulithsSpring I/O 2019 Recap - Moduliths
Spring I/O 2019 Recap - ModulithsTakeshi Ogawa
2.1K views38 slides
Spring data-rest-and-spring-cloud-contract by
Spring data-rest-and-spring-cloud-contractSpring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contractTakeshi Ogawa
8.6K views56 slides
さくっと作るSpring入門 with Google Home by
さくっと作るSpring入門 with Google Homeさくっと作るSpring入門 with Google Home
さくっと作るSpring入門 with Google HomeTakeshi Ogawa
671 views14 slides
さくっと理解するSpring bootの仕組み by
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組みTakeshi Ogawa
65.2K views38 slides

More from Takeshi Ogawa(6)

今こそ知りたい Spring Data by Takeshi Ogawa
今こそ知りたい Spring Data今こそ知りたい Spring Data
今こそ知りたい Spring Data
Takeshi Ogawa276 views
Spring Cloud Gateway on Kubernetes by Takeshi Ogawa
Spring Cloud Gateway on KubernetesSpring Cloud Gateway on Kubernetes
Spring Cloud Gateway on Kubernetes
Takeshi Ogawa1.4K views
Spring I/O 2019 Recap - Moduliths by Takeshi Ogawa
Spring I/O 2019 Recap - ModulithsSpring I/O 2019 Recap - Moduliths
Spring I/O 2019 Recap - Moduliths
Takeshi Ogawa2.1K views
Spring data-rest-and-spring-cloud-contract by Takeshi Ogawa
Spring data-rest-and-spring-cloud-contractSpring data-rest-and-spring-cloud-contract
Spring data-rest-and-spring-cloud-contract
Takeshi Ogawa8.6K views
さくっと作るSpring入門 with Google Home by Takeshi Ogawa
さくっと作るSpring入門 with Google Homeさくっと作るSpring入門 with Google Home
さくっと作るSpring入門 with Google Home
Takeshi Ogawa671 views
さくっと理解するSpring bootの仕組み by Takeshi Ogawa
さくっと理解するSpring bootの仕組みさくっと理解するSpring bootの仕組み
さくっと理解するSpring bootの仕組み
Takeshi Ogawa65.2K views

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 を使うという選択肢もあります。