フリュー株式会社
角田拓己(@chan_kakuz)
FURYU Corp. @Kyoto
ServerSide Engineer
Spring/Vue.js/Architecture/Test
弊社サービス(ピクトリンク)の話
今回の対象者とゴール
モダンって?
今回の話の結論
改善活動とは?
話のきっかけ
どのように改善活動を進めていったのか?
実例
まとめ
(あわよくば、習慣として根付いたら嬉しいです)
dependencies {
testImplementation("org.springframework.boot:spring-boot-starter-test");
}
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ExtendWith(SpringExtension.class)
public class HogeAPITest {
@LocalServerPort
private int port;
private static RestTemplate createTemplate() {
return new TestRestTemplate().getRestTemplate();
}
@Test
public void 正しいクエリを指定したとき_hoge3にクエリで指定した値の10倍で返ってくる() {
int query = 10;
String url = "http://localhost:" + port + "/hoge/fuga";
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("a", query);
ResponseEntity<SampleResponse> result = createTemplate()
.exchange(uriBuilder.toUriString(), HttpMethod.GET, null, SampleResponse.class);
SampleResponse expected = new SampleResponse() {{
setHoge1("ほげ1");
setHoge2("ほげ2");
setHoge3(100);
}};
assertThat(result.getBody()).usingRecursiveComparison().isEqualTo(expected);
}
}
JUnit4の場合は
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ExtendWith(SpringExtension.class)
public class ホゲテストAPITest {
@Resource
private リクエスト リクエストは;
@Test
public void 正しいクエリを指定したとき_hoge3にクエリで指定した値の10倍で返ってくる() {
int query = 10;
レスポンス レスポンスの = リクエストは.次のリクエストメソッドで(HttpMethod.GET)
.次のリクエストクエリで("a", String.valueOf(query))
.以下URLに送信する("/hoge/fuga");
SampleResponse expected = new SampleResponse() {{
setHoge1("ほげ1");
setHoge2("ほげ2");
setHoge3(query * 10);
}};
レスポンスの.ステータスコードは次の値であることを検証する(200);
レスポンスの.ボディは次の型で(SampleResponse.class)
.次の値と一致することを検証する(expected);
}
}
気軽にテストを回せるので、リグレッションテストのように使える
plugins {
id "com.github.ben-manes.versions" version "$version"
}
./gradlew dependencyUpdates
- org.springframework.boot:org.springframework.boot.gradle.plugin [2.1.7.RELEASE -> 2.2.0.RELEASE]
https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-tools/org.springframework.boot.gradle.plugin
- org.springframework.boot:spring-boot-gradle-plugin [2.1.7.RELEASE -> 2.2.0.RELEASE]
https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-tools/spring-boot-gradle-plugin
- org.springframework.boot:spring-boot-properties-migrator [2.1.7.RELEASE -> 2.2.0.RELEASE]
https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-properties-migrator
dependencyUpdates.resolutionStrategy = {
componentSelection { rules ->
rules.all { ComponentSelection selection ->
boolean rejected = ['alpha', 'beta', 'rc', 'cr', 'm', 'preview', 'b', 'ea'].any { qualifier ->
selection.candidate.version =~ /(?i).*[.-]${qualifier}[.\d-]*/
}
if (rejected) {
selection.reject('Release candidate')
}
}
}
}
buildscript {
repositories {
....
maven {
url "https://jitpack.io"
}
}
dependencies {
...
classpath 'com.github.Mindera:gradle-slack-plugin:1.0.7'
}
}
apply plugin: 'com.mindera.gradle.slack'
slack {
url 'your WebHook URL'
// 依存タスク
dependsOnTasks 'dependencyUpdates'
//slack通知のタイトル
title 'my app name'
// 環境変数とか入れてCIツールからしかこのタスクを実行しないとかできる
enabled = isCDMachine()
}
slack
バージョンアップ情報
通知
ライブラリ
アップデート
対応
Unit,
Integration Test回す
テスト環境で
動作確認
リリース
このサイクルが
早くなる
ここにとても
時間がかかる
slack
バージョンアップ情報
通知
チケット作成
バージョンアップ情報
Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築
綿引 琢磨 (著), 須江 信洋 (著), 林 政利 (著), 今井 勝信 (著)
今までは気づいた人がチケット作るという運用