SlideShare a Scribd company logo
1 of 53
Download to read offline
JSUG
Springのプログラムモデルと動く仕様
~テスト編~
株式会社ビッグツリーテクノロジー&コンサルティング
SI事業部 アーキテクチャG
寺島 秀樹
#jsug
2Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
• 設計?
• 仕様?
• ドキュメント?
はじめに
筆者は「設計とは“考えること”であり、アウト
プットはその一側面である」と考えている
3Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
1. 物事をする方法。しかた。やりかた。
「まだほかに仕様があるだろう」
2. 機械類や建築物などの構造や内容。
「仕様の一部を変更する」
仕様とは?
https://dictionary.goo.ne.jp/jn/107319/meaning/m0u/
デジタル大辞泉の解説
4Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
「ユーザの要求を満たすために
サービスやシステム、機能などが
どのように振る舞うかを
定めたもの」と定義する
この場での「仕様」の定義
5Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
寺島 秀樹(@terahide27)
(株)ビッグツリーテクノロジ&コ
ンサルティング 所属
SIerを中心に
アーキテクト・アジャイルコンサ
ルタントとして就業
システムの保守運用から営業支援
まで手広くいろいろやってます
CSP/CSPO/CSM
TOCfE国際認定ファシリテータ/
アニメ/酒/ラーメン/
自己紹介
6Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
• テスト駆動開発の話
• アジャイルの話
• すごい話
今日しない話
7Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
• 実際の事例
• テストと仕様とプログラムの話
• 現場で試してみようと思ってる話
(ちょっとだけ)
今日する話
8Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
出来事
9Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
• 某サービスを運用している現場
• 5週程度のイテレーションでリリースを繰
り返している
• 保守を行うチームメンバは12人程度(ほと
んどが経験3年目までの若いメンバ)
• 自分はインフラのおもりや障害などの調査
を中心にしていて、開発のイテレーション
にはあまり関わってなかった
背景
10Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
「手が足りないからステージング環境
でテストしてください」
「かしこま〜」
ある日
11Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
テスト仕様書「ユーザの区分がxxで商材のなんたらフラグ
となんたらフラグが立っている時になんたら画面でなんた
らするとほにゃららがほにゃららで...」
「?」
ユーザの区分がxxなのはわかった。(それ以外のユーザで
はどうなるか書いてないけど一旦おいておこう)
「商材のなんたらフラグってどうやって立てるんですか?
DB書き換えてええのん?」
「ステージング環境でそんなことしないでください」
「だったらどうやってその状態にするんですか?」(結構
マニアックな機能だった)
12Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
Untestable Test Case
13Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
• テストしたい観点は書かれていた
• それをテストするための状態にする
にはどうすればいいかが書かれてい
なかった
なにが問題だったか?
14Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
• 操作やその結果に対してはみなさん
よく気づく
• その操作を行う事前の条件や状態を
忘れがち
• e.g. エアコンの設定温度を20度に
すると冷たい風がでる。本当?
事前条件を表す?
15Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
• given 事前条件・状態
• when 対象に対する操作をした時
• then どうなるか
テンプレート
[given]の状態で[when]をすると[then]
given - when – then
16Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
まさに仕様
17Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
この人ご存知?
http://www.startrek.com/database_article/spock
18Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
• JUnitみたいなもん
• given - when - then でテストが書ける素晴らし
いもの
e.g.
Spock
def test(){
given: "カートにアイテムがある"
商品一覧を開く()
カートにいれるby商品ID(1)
when: "カートを開く"
商品一覧でカートリンクをクリックする()
then:
カート画面が表示されている()
and:
購入ボタンがクリッカブルである()
}
19Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
プログラマはプログラムを書くのが仕事
我々はプログラマである
https://www.lifehacker.jp/2014/12/141210programmer_signs.html
20Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
プログラムで表現することができれば
ドキュメントと違い動かして検証をすることが容易
自動テストを書けば繰り返しの検証もできる
自動テストもまたプログラム
自動テストのプログラムは、もはやテストが目的で
はなく、「動く仕様」としての位置づけを求められ
る
自動テストは動く仕様である
21Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
出来事
22Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
@Test
public void test_success1(){…}
@Test
public void test_success2(){…}
延々と続く・・・
前みたJUnit
23Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
@Test
public void test(){
load(“xxxData.xls”);
actual = sut();
assertWithExcel(actual,
“expected.xlsx”);
}
前みたJUnit
24Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
仕様?
25Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
まずはテストメソッドの名前を given - when -
then で書くことをしてみよう
JUnitでは?
@Test
public void カートにアイテムがある状態でカートを開くと購入可能である(){
//given
商品一覧でカートにいれるby商品ID(1);
//when
商品一覧でカートリンクをクリックする();
//then
カート画面が表示されている();
購入ボタンがクリッカブルである();
}
26Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
もう少しUnit Testみたいな例
@Test
public void 商品がある状態でカートに追加すると購入可能である(){
//given
assertThat(itemService.findAll().size(), graterThan(0));
//when
Item item = itemService.findById(1);
cartService.add(item);
//then
assertThat(cartService.isPurchasable(), is(true));
}
27Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
テストで確認したい部分が仕様レベルの話
それをどう実現するか(指定がないならば)の話は隠蔽しても構わない
むしろプログラムレベルの話(前述の例ならばDOMの操作など)は積極
的に隠蔽した方がいい
仕様レベルとそれ以外のレベル
@Test
public void カートにアイテムがある状態でカートを開くと購入可能である(){
//given
// 商品一覧ページを開きIDが商品IDの親のtrタグの中の
// classがaddCartのリンクをクリックする(プログラムレベルの話)
商品一覧でカートにいれるby商品ID(1);
//when
// 「カートを開く」とあるが、開き方の指定はなし(操作レベルの話)
商品一覧でカートリンクをクリックする();
//then
カート画面が表示されている();
購入ボタンがクリッカブルである();
}
28Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
仕様レベルの話を残しそれ以外は他所に委譲する
結果テストのしやすさにつながってくる
e.g.
プロダクションコードにおける仕様と構造
public CartService{
//購入可能な状態で購入するとカートからアイテムがなくなり購入処理を行う
public void purchase(){
if( ! this.isPurchasable()){
throw new IllegalStateException("is not purchasable");
}
List<Item> items = this.findAll();
items.stream()
.map(i -> toPurchased(i))
.forEach(p -> purchaseService.purchase(p)));
this.deleteAll(items);
}
・・・
29Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
つづき
// カートにアイテムがあるならば購買処理の購買可能判定を行う
public boolean isPurchasable(){
if( this.findAll().isEmpty() ){
return false;
}
return purchaseService.isPurchasable();
}
public List<Item> findAll(){
return cartRepository.findAll();
}
public void deleteAll(List<Item> items){
cartRepository.deleteAll(items);
}
private PurchasedItem toPurchased(Item item){
//snip 商品の特性によってなにやら難しい処理
}
30Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
Spring
31Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
Spring Ecosystem
http://springtutorials.com/
32Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
DI
Container
33Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
自動テストの際にテスト観点以外の依存した部分をMock
やStubなどに差し替えることがやりやすくなった
• Frameworkなどの親クラスみたいな縛りから解放され
た
• 依存関係があった場合でも依存性の注入という形で解決
される
DI Container がもたらしたもの
34Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
前述の例
ホワイトボックステスト
//購入可能な状態で購入するとカートからアイテムがなくなり購入処理を行う
if( ! this.isPurchasable()){ //モックにしてtrue or false を返す
throw new IllegalStateException("is not purchasable");
}
List<Item> items = this.findAll(); //モックにしてアイテムを2個返す
items.stream()
.map(i -> toPurchased(i)) // 複雑なことをしていてテストしづらいなら
// モックに変えてシンプルにする
.forEach(p -> purchaseService.purchase(p))); //モックにして
// 2度呼ばれたことを検証する
this.deleteAll(items); //モックにして呼ばれたことを検証する
35Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
状態中心のテスト
テストしたい対象の処理前後での状態の変化を検証すること
でテストを行う
相互作用中心のテスト
テストしたい対象のオブジェクトの相互作用(メッセージの
やりとり)を検証することでテストを行う
平たく言うとどのメソッドがどのように何回呼び出されるか
状態中心のテストと相互作用中心のテスト
36Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
依存部分はモックに変えていくことでテスト観点(仕様)に
フォーカスしたテストになる
モックに変えた部分はそれぞれ「仕様」があるはずなのでそ
れは個別にテストを行う
最終的には依存しないテスト対象はモックに変えずにテスト
を行うのでホワイトボックステストとしては充分となる
(前述の例だと repository や toPurchased() がその例)
相互作用中心のテスト(私見)
37Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
前述の例
再掲:ホワイトボックステスト
//購入可能な状態で購入するとカートからアイテムがなくなり購入処理を行う
if( ! this.isPurchasable()){ //モックにしてtrue or false を返す
throw new IllegalStateException("is not purchasable");
}
List<Item> items = this.findAll(); //モックにしてアイテムを2個返す
items.stream()
.map(i -> toPurchased(i)) // 複雑なことをしていてテストしづらいなら
// モックに変えてシンプルにする
.forEach(p -> purchaseService.purchase(p))); //モックにして
// 2度呼ばれたことを検証する
this.deleteAll(items); //モックにして呼ばれたことを検証する
38Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
E2Eのテストやもっと広いシナリオテストのように粒度の
大きい話しから1つのメソッドに対しての粒度の小さい話
しのいずれでも今日の話しは適用できる
ただし、仕様の粒度を間違えるとぐちゃぐちゃになるので
要注意(特に粒度の小さい部分)
今日の仕様の話は
・・・
39Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
粒度の大小に関係なく、テスト対象の使い方をテ
ストする
(仕様をテストする)
使い方をテストする
・・・
40Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
e.g.
• 北緯なん度、経度なん度の場所に向かい
エレベータで何階に行き鍵を取り出しド
アを開け靴を脱ぎ冷蔵庫から缶ビールを
取り出してベッドに横になる
粒度の違い
41Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
• プログラマはプログラム書くときの言葉に慣れすぎてい
る
• 最初に話したテスト仕様書の話しはすごくビジネスから
遠い用語で書かれていた
• 特に粒度の小さいテストの場合は要注意
XXフラグみたいなもの
42Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
• ビジネスで使っている言葉で表現しましょう
• 難しかったらせめて対象となるものの操作方法(画面と
か)で表現しましょう
• ただ抽象度の低いホワイトボックステストだとこれも難
しい
コツ
43Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
課題と今後
44Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
テスト仕様書はgiven-when-thenのテストで書くように
した
結果
• トータルコストは下がった(手戻りが減った)
• プログラマの心理的安全が高まった
課題
• メンバによって理解度のバラツキが大きい
• 品質は大差ない
• テスト工数があがった
実際にやってみた(自プロジェクト)
45Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
Sound only
自動テストに対する取り組み
46Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
テスト仕様としていろいろなところに
散らばった仕様を一元管理してトレー
ス可能に
今考えてること
47Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
• spockを使って自動テストを記載するプロ
ジェクトがちらほらと増えてきた
• E2Eの自動テストをうまく活用しているプ
ロジェクト
• 今後は社内外で今日のような話を通して増
やしていく予定
会社としての取り組み
48Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
まとめ
49Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
• given - when - then
• 仕様はビジネスで使う用語で表わそう
• 粒度に気をつけて表わそう
• プログラムは構造に気をつけよう
• 積極的に自動テストに落とそう
まとめ
50Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
最後に
51Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
• ドキュメンテーションや口伝だとうまく伝わらないもの
をどう伝えるかは永遠にテーマだと思う
• BDD,ATDDのように検証の方向からのアプローチした
りDDDのように設計・実装からアプローチしたりいろい
ろな方向から取り組んでいくべき課題と捉えている
• なにはともあれプログラムはリーダブルであることが
大前提だと自分は思う
• アプローチの一環として今までにはないサービスや開発
形態が今後どんどんでてくるだろうからそういう面でも
注目したいと思っている
所感
52Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
ってことで
API編へ
53Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved.
の前に
10分休憩

More Related Content

What's hot

リクルートにおけるマルチモーダル Deep Learning Web API 開発事例
リクルートにおけるマルチモーダル Deep Learning Web API 開発事例リクルートにおけるマルチモーダル Deep Learning Web API 開発事例
リクルートにおけるマルチモーダル Deep Learning Web API 開発事例Recruit Technologies
 
リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介Recruit Technologies
 
ユーザー企業内製CSIRTにおける対応のポイント
ユーザー企業内製CSIRTにおける対応のポイントユーザー企業内製CSIRTにおける対応のポイント
ユーザー企業内製CSIRTにおける対応のポイントRecruit Technologies
 
3万人が利用するリクルートのワイヤレス環境 ~リアクティブからプロアクティブへ~
3万人が利用するリクルートのワイヤレス環境 ~リアクティブからプロアクティブへ~3万人が利用するリクルートのワイヤレス環境 ~リアクティブからプロアクティブへ~
3万人が利用するリクルートのワイヤレス環境 ~リアクティブからプロアクティブへ~Recruit Technologies
 
リクルートにおけるデータのインフラ化への取組
リクルートにおけるデータのインフラ化への取組リクルートにおけるデータのインフラ化への取組
リクルートにおけるデータのインフラ化への取組Recruit Technologies
 
[Track4-3] AI・ディープラーニングを駆使して、「G検定合格者アンケートのフリーコメント欄」を分析してみた
[Track4-3] AI・ディープラーニングを駆使して、「G検定合格者アンケートのフリーコメント欄」を分析してみた[Track4-3] AI・ディープラーニングを駆使して、「G検定合格者アンケートのフリーコメント欄」を分析してみた
[Track4-3] AI・ディープラーニングを駆使して、「G検定合格者アンケートのフリーコメント欄」を分析してみたDeep Learning Lab(ディープラーニング・ラボ)
 
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアルリクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアルRecruit Technologies
 
機械学習品質管理・保証の動向と取り組み
機械学習品質管理・保証の動向と取り組み機械学習品質管理・保証の動向と取り組み
機械学習品質管理・保証の動向と取り組みShintaro Fukushima
 
Case study of DevOps for Hadoop in Recruit.
Case study of DevOps for Hadoop in Recruit.Case study of DevOps for Hadoop in Recruit.
Case study of DevOps for Hadoop in Recruit.Recruit Technologies
 
機械学習システムの品質保証に向けた課題とコンソーシアム活動
機械学習システムの品質保証に向けた課題とコンソーシアム活動機械学習システムの品質保証に向けた課題とコンソーシアム活動
機械学習システムの品質保証に向けた課題とコンソーシアム活動Hideto Ogawa
 
長田武徳, アジャイル開発と品質 ~ アジャイル品質パターンの利用事例
長田武徳, アジャイル開発と品質 ~ アジャイル品質パターンの利用事例長田武徳, アジャイル開発と品質 ~ アジャイル品質パターンの利用事例
長田武徳, アジャイル開発と品質 ~ アジャイル品質パターンの利用事例Hironori Washizaki
 
求職サービスの検索ログを用いたクエリのカテゴリ推定とその活用事例の紹介
求職サービスの検索ログを用いたクエリのカテゴリ推定とその活用事例の紹介求職サービスの検索ログを用いたクエリのカテゴリ推定とその活用事例の紹介
求職サービスの検索ログを用いたクエリのカテゴリ推定とその活用事例の紹介Recruit Technologies
 
オーバーエンジニアリングって何? #devsumi #devsumiA
オーバーエンジニアリングって何? #devsumi #devsumiAオーバーエンジニアリングって何? #devsumi #devsumiA
オーバーエンジニアリングって何? #devsumi #devsumiAOre Product
 
UXDの職能要件とキャリアパスについて
UXDの職能要件とキャリアパスについてUXDの職能要件とキャリアパスについて
UXDの職能要件とキャリアパスについてRecruit Technologies
 
リクルートにおけるセキュリティ施策方針とCSIRT組織運営のポイント
リクルートにおけるセキュリティ施策方針とCSIRT組織運営のポイントリクルートにおけるセキュリティ施策方針とCSIRT組織運営のポイント
リクルートにおけるセキュリティ施策方針とCSIRT組織運営のポイントRecruit Technologies
 
リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介Recruit Technologies
 
レコメンドエンジン作成コンテストの勝ち方
レコメンドエンジン作成コンテストの勝ち方レコメンドエンジン作成コンテストの勝ち方
レコメンドエンジン作成コンテストの勝ち方Shun Nukui
 
[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料
[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料
[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料Ridge-i
 

What's hot (20)

リクルートにおけるマルチモーダル Deep Learning Web API 開発事例
リクルートにおけるマルチモーダル Deep Learning Web API 開発事例リクルートにおけるマルチモーダル Deep Learning Web API 開発事例
リクルートにおけるマルチモーダル Deep Learning Web API 開発事例
 
リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介リクルート式 自然言語処理技術の適応事例紹介
リクルート式 自然言語処理技術の適応事例紹介
 
ユーザー企業内製CSIRTにおける対応のポイント
ユーザー企業内製CSIRTにおける対応のポイントユーザー企業内製CSIRTにおける対応のポイント
ユーザー企業内製CSIRTにおける対応のポイント
 
3万人が利用するリクルートのワイヤレス環境 ~リアクティブからプロアクティブへ~
3万人が利用するリクルートのワイヤレス環境 ~リアクティブからプロアクティブへ~3万人が利用するリクルートのワイヤレス環境 ~リアクティブからプロアクティブへ~
3万人が利用するリクルートのワイヤレス環境 ~リアクティブからプロアクティブへ~
 
リクルートにおけるデータのインフラ化への取組
リクルートにおけるデータのインフラ化への取組リクルートにおけるデータのインフラ化への取組
リクルートにおけるデータのインフラ化への取組
 
[Track4-3] AI・ディープラーニングを駆使して、「G検定合格者アンケートのフリーコメント欄」を分析してみた
[Track4-3] AI・ディープラーニングを駆使して、「G検定合格者アンケートのフリーコメント欄」を分析してみた[Track4-3] AI・ディープラーニングを駆使して、「G検定合格者アンケートのフリーコメント欄」を分析してみた
[Track4-3] AI・ディープラーニングを駆使して、「G検定合格者アンケートのフリーコメント欄」を分析してみた
 
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアルリクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
リクルートテクノロジーズが語る 企業における、「AI/ディープラーニング」活用のリアル
 
機械学習品質管理・保証の動向と取り組み
機械学習品質管理・保証の動向と取り組み機械学習品質管理・保証の動向と取り組み
機械学習品質管理・保証の動向と取り組み
 
Case study of DevOps for Hadoop in Recruit.
Case study of DevOps for Hadoop in Recruit.Case study of DevOps for Hadoop in Recruit.
Case study of DevOps for Hadoop in Recruit.
 
機械学習システムの品質保証に向けた課題とコンソーシアム活動
機械学習システムの品質保証に向けた課題とコンソーシアム活動機械学習システムの品質保証に向けた課題とコンソーシアム活動
機械学習システムの品質保証に向けた課題とコンソーシアム活動
 
長田武徳, アジャイル開発と品質 ~ アジャイル品質パターンの利用事例
長田武徳, アジャイル開発と品質 ~ アジャイル品質パターンの利用事例長田武徳, アジャイル開発と品質 ~ アジャイル品質パターンの利用事例
長田武徳, アジャイル開発と品質 ~ アジャイル品質パターンの利用事例
 
求職サービスの検索ログを用いたクエリのカテゴリ推定とその活用事例の紹介
求職サービスの検索ログを用いたクエリのカテゴリ推定とその活用事例の紹介求職サービスの検索ログを用いたクエリのカテゴリ推定とその活用事例の紹介
求職サービスの検索ログを用いたクエリのカテゴリ推定とその活用事例の紹介
 
オーバーエンジニアリングって何? #devsumi #devsumiA
オーバーエンジニアリングって何? #devsumi #devsumiAオーバーエンジニアリングって何? #devsumi #devsumiA
オーバーエンジニアリングって何? #devsumi #devsumiA
 
UXDの職能要件とキャリアパスについて
UXDの職能要件とキャリアパスについてUXDの職能要件とキャリアパスについて
UXDの職能要件とキャリアパスについて
 
リクルートにおけるセキュリティ施策方針とCSIRT組織運営のポイント
リクルートにおけるセキュリティ施策方針とCSIRT組織運営のポイントリクルートにおけるセキュリティ施策方針とCSIRT組織運営のポイント
リクルートにおけるセキュリティ施策方針とCSIRT組織運営のポイント
 
リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介リクルートにおける画像解析事例紹介
リクルートにおける画像解析事例紹介
 
レコメンドエンジン作成コンテストの勝ち方
レコメンドエンジン作成コンテストの勝ち方レコメンドエンジン作成コンテストの勝ち方
レコメンドエンジン作成コンテストの勝ち方
 
[Track2-5] CPUだけでAIをやり切った最近のお客様事例 と インテルの先進的な取り組み
[Track2-5] CPUだけでAIをやり切った最近のお客様事例 と インテルの先進的な取り組み[Track2-5] CPUだけでAIをやり切った最近のお客様事例 と インテルの先進的な取り組み
[Track2-5] CPUだけでAIをやり切った最近のお客様事例 と インテルの先進的な取り組み
 
[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料
[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料
[GTC 2018] GTCテクニカルセッション_0913 Ridge-i発表資料
 
LT(自由)
LT(自由)LT(自由)
LT(自由)
 

Similar to Springのプログラムモデルと動く仕様~テスト編~

【Logic Apps編】ノンコーディングでデキる!お問い合わせフォーム機能拡張
【Logic Apps編】ノンコーディングでデキる!お問い合わせフォーム機能拡張【Logic Apps編】ノンコーディングでデキる!お問い合わせフォーム機能拡張
【Logic Apps編】ノンコーディングでデキる!お問い合わせフォーム機能拡張典子 松本
 
TERAS Conference
TERAS ConferenceTERAS Conference
TERAS ConferenceKeiju Anada
 
AITCオープンラボ 2018年5月度(2)
AITCオープンラボ 2018年5月度(2)AITCオープンラボ 2018年5月度(2)
AITCオープンラボ 2018年5月度(2)aitc_jp
 
Supervised Machine Learning of Elastic Stack
Supervised Machine Learning of Elastic StackSupervised Machine Learning of Elastic Stack
Supervised Machine Learning of Elastic StackHiroshi Yoshioka
 
Coldfusionを活かすシステム企画をリーンスタートアップに学ぶ
Coldfusionを活かすシステム企画をリーンスタートアップに学ぶColdfusionを活かすシステム企画をリーンスタートアップに学ぶ
Coldfusionを活かすシステム企画をリーンスタートアップに学ぶmasashi takehara
 
モデリングの彼方に未来を見た
モデリングの彼方に未来を見たモデリングの彼方に未来を見た
モデリングの彼方に未来を見たHagimoto Junzo
 
Startup science 2018 4 ビジネスモデルの型とPlanAの作成
Startup science 2018 4 ビジネスモデルの型とPlanAの作成Startup science 2018 4 ビジネスモデルの型とPlanAの作成
Startup science 2018 4 ビジネスモデルの型とPlanAの作成Masa Tadokoro
 
第5回SIA研究会(例会)プレゼン資料
第5回SIA研究会(例会)プレゼン資料第5回SIA研究会(例会)プレゼン資料
第5回SIA研究会(例会)プレゼン資料Tae Yoshida
 
「効率・品質・統制」の共通課題に着目した現場主導によるITS導入の効果検証
「効率・品質・統制」の共通課題に着目した現場主導によるITS導入の効果検証「効率・品質・統制」の共通課題に着目した現場主導によるITS導入の効果検証
「効率・品質・統制」の共通課題に着目した現場主導によるITS導入の効果検証Kuniharu(州晴) AKAHANE(赤羽根)
 
マイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karateマイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with KarateTakanori Suzuki
 
テストマネジメントツールSquash TMを利用した継続的テスト改善
テストマネジメントツールSquash TMを利用した継続的テスト改善テストマネジメントツールSquash TMを利用した継続的テスト改善
テストマネジメントツールSquash TMを利用した継続的テスト改善Mizuho Wakai
 
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなしterahide
 
13_B_5 Who is a architect?
13_B_5 Who is a architect?13_B_5 Who is a architect?
13_B_5 Who is a architect?Atsushi Fukui
 
The way to a smart factory armed with data utilization
The way to a smart factory armed with data utilizationThe way to a smart factory armed with data utilization
The way to a smart factory armed with data utilizationDataWorks Summit
 
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所Kotaro Ogino
 
Automotive agile 自動車業界を取り巻くアジャイル・スクラムの潮流
Automotive agile  自動車業界を取り巻くアジャイル・スクラムの潮流Automotive agile  自動車業界を取り巻くアジャイル・スクラムの潮流
Automotive agile 自動車業界を取り巻くアジャイル・スクラムの潮流Kazutaka Sankai
 
ソフトウェアジャパン2018 ITフォーラムセッション(3)
ソフトウェアジャパン2018 ITフォーラムセッション(3)ソフトウェアジャパン2018 ITフォーラムセッション(3)
ソフトウェアジャパン2018 ITフォーラムセッション(3)aitc_jp
 

Similar to Springのプログラムモデルと動く仕様~テスト編~ (20)

【Logic Apps編】ノンコーディングでデキる!お問い合わせフォーム機能拡張
【Logic Apps編】ノンコーディングでデキる!お問い合わせフォーム機能拡張【Logic Apps編】ノンコーディングでデキる!お問い合わせフォーム機能拡張
【Logic Apps編】ノンコーディングでデキる!お問い合わせフォーム機能拡張
 
TERAS Conference
TERAS ConferenceTERAS Conference
TERAS Conference
 
AITCオープンラボ 2018年5月度(2)
AITCオープンラボ 2018年5月度(2)AITCオープンラボ 2018年5月度(2)
AITCオープンラボ 2018年5月度(2)
 
Supervised Machine Learning of Elastic Stack
Supervised Machine Learning of Elastic StackSupervised Machine Learning of Elastic Stack
Supervised Machine Learning of Elastic Stack
 
Coldfusionを活かすシステム企画をリーンスタートアップに学ぶ
Coldfusionを活かすシステム企画をリーンスタートアップに学ぶColdfusionを活かすシステム企画をリーンスタートアップに学ぶ
Coldfusionを活かすシステム企画をリーンスタートアップに学ぶ
 
Extreme Management Center を活用したネットワークの見える化
Extreme Management Center を活用したネットワークの見える化Extreme Management Center を活用したネットワークの見える化
Extreme Management Center を活用したネットワークの見える化
 
Fit12
Fit12Fit12
Fit12
 
モデリングの彼方に未来を見た
モデリングの彼方に未来を見たモデリングの彼方に未来を見た
モデリングの彼方に未来を見た
 
Iot literacy no.5
Iot literacy no.5Iot literacy no.5
Iot literacy no.5
 
Startup science 2018 4 ビジネスモデルの型とPlanAの作成
Startup science 2018 4 ビジネスモデルの型とPlanAの作成Startup science 2018 4 ビジネスモデルの型とPlanAの作成
Startup science 2018 4 ビジネスモデルの型とPlanAの作成
 
第5回SIA研究会(例会)プレゼン資料
第5回SIA研究会(例会)プレゼン資料第5回SIA研究会(例会)プレゼン資料
第5回SIA研究会(例会)プレゼン資料
 
「効率・品質・統制」の共通課題に着目した現場主導によるITS導入の効果検証
「効率・品質・統制」の共通課題に着目した現場主導によるITS導入の効果検証「効率・品質・統制」の共通課題に着目した現場主導によるITS導入の効果検証
「効率・品質・統制」の共通課題に着目した現場主導によるITS導入の効果検証
 
マイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karateマイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karate
 
テストマネジメントツールSquash TMを利用した継続的テスト改善
テストマネジメントツールSquash TMを利用した継続的テスト改善テストマネジメントツールSquash TMを利用した継続的テスト改善
テストマネジメントツールSquash TMを利用した継続的テスト改善
 
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
受託開発でテストファーストしたらXXXを早期発見できてハイアジリティになったはなし
 
13_B_5 Who is a architect?
13_B_5 Who is a architect?13_B_5 Who is a architect?
13_B_5 Who is a architect?
 
The way to a smart factory armed with data utilization
The way to a smart factory armed with data utilizationThe way to a smart factory armed with data utilization
The way to a smart factory armed with data utilization
 
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
【JaSST'18 Tokai】アジャイルとテスト自動化導入の勘所
 
Automotive agile 自動車業界を取り巻くアジャイル・スクラムの潮流
Automotive agile  自動車業界を取り巻くアジャイル・スクラムの潮流Automotive agile  自動車業界を取り巻くアジャイル・スクラムの潮流
Automotive agile 自動車業界を取り巻くアジャイル・スクラムの潮流
 
ソフトウェアジャパン2018 ITフォーラムセッション(3)
ソフトウェアジャパン2018 ITフォーラムセッション(3)ソフトウェアジャパン2018 ITフォーラムセッション(3)
ソフトウェアジャパン2018 ITフォーラムセッション(3)
 

More from terahide

オレオレになりがちなテスト計画を見直した話
オレオレになりがちなテスト計画を見直した話オレオレになりがちなテスト計画を見直した話
オレオレになりがちなテスト計画を見直した話terahide
 
和服を普段着にするようになって気づいたアジャイルの心
和服を普段着にするようになって気づいたアジャイルの心和服を普段着にするようになって気づいたアジャイルの心
和服を普段着にするようになって気づいたアジャイルの心terahide
 
Management3.0のワークを受けてから会社の偉い人へ M3.0のワークショップをするまでにやったこと
Management3.0のワークを受けてから会社の偉い人へM3.0のワークショップをするまでにやったことManagement3.0のワークを受けてから会社の偉い人へM3.0のワークショップをするまでにやったこと
Management3.0のワークを受けてから会社の偉い人へ M3.0のワークショップをするまでにやったことterahide
 
一番アジャイルな料理人はソーマくんだと思うんだ
一番アジャイルな料理人はソーマくんだと思うんだ一番アジャイルな料理人はソーマくんだと思うんだ
一番アジャイルな料理人はソーマくんだと思うんだterahide
 
オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~
オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~
オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~terahide
 
Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発terahide
 
明日に繋がるふり返りのプラクティス
明日に繋がるふり返りのプラクティス明日に繋がるふり返りのプラクティス
明日に繋がるふり返りのプラクティスterahide
 
ふりかえり
ふりかえりふりかえり
ふりかえりterahide
 
データモデルは時空を越える
データモデルは時空を越えるデータモデルは時空を越える
データモデルは時空を越えるterahide
 
ももたろう
ももたろうももたろう
ももたろうterahide
 
Vbaでもtdd
VbaでもtddVbaでもtdd
Vbaでもtddterahide
 
Sierのアジャイルとジレンマとパラダイムシフト
SierのアジャイルとジレンマとパラダイムシフトSierのアジャイルとジレンマとパラダイムシフト
Sierのアジャイルとジレンマとパラダイムシフトterahide
 
脱Java初心者を目指すときに読むといいと思う本を考える会
脱Java初心者を目指すときに読むといいと思う本を考える会脱Java初心者を目指すときに読むといいと思う本を考える会
脱Java初心者を目指すときに読むといいと思う本を考える会terahide
 
再入門!RESTとSpringMVC
再入門!RESTとSpringMVC再入門!RESTとSpringMVC
再入門!RESTとSpringMVCterahide
 
SGT2014 横浜道場 始めよう!インセプションデッキ
SGT2014 横浜道場 始めよう!インセプションデッキSGT2014 横浜道場 始めよう!インセプションデッキ
SGT2014 横浜道場 始めよう!インセプションデッキterahide
 
Tdd keyword
Tdd keywordTdd keyword
Tdd keywordterahide
 
ゆるぎー
ゆるぎーゆるぎー
ゆるぎーterahide
 
マシュマロチャレンジ
マシュマロチャレンジマシュマロチャレンジ
マシュマロチャレンジterahide
 
システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~
システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~
システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~terahide
 

More from terahide (20)

オレオレになりがちなテスト計画を見直した話
オレオレになりがちなテスト計画を見直した話オレオレになりがちなテスト計画を見直した話
オレオレになりがちなテスト計画を見直した話
 
和服を普段着にするようになって気づいたアジャイルの心
和服を普段着にするようになって気づいたアジャイルの心和服を普段着にするようになって気づいたアジャイルの心
和服を普段着にするようになって気づいたアジャイルの心
 
Management3.0のワークを受けてから会社の偉い人へ M3.0のワークショップをするまでにやったこと
Management3.0のワークを受けてから会社の偉い人へM3.0のワークショップをするまでにやったことManagement3.0のワークを受けてから会社の偉い人へM3.0のワークショップをするまでにやったこと
Management3.0のワークを受けてから会社の偉い人へ M3.0のワークショップをするまでにやったこと
 
一番アジャイルな料理人はソーマくんだと思うんだ
一番アジャイルな料理人はソーマくんだと思うんだ一番アジャイルな料理人はソーマくんだと思うんだ
一番アジャイルな料理人はソーマくんだと思うんだ
 
Att
AttAtt
Att
 
オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~
オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~
オフショアだから失敗したの?~誤解だらけのオフショアと、アジャイルの再発見~
 
Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発Spring bootで学ぶ初めてのwebアプリ開発
Spring bootで学ぶ初めてのwebアプリ開発
 
明日に繋がるふり返りのプラクティス
明日に繋がるふり返りのプラクティス明日に繋がるふり返りのプラクティス
明日に繋がるふり返りのプラクティス
 
ふりかえり
ふりかえりふりかえり
ふりかえり
 
データモデルは時空を越える
データモデルは時空を越えるデータモデルは時空を越える
データモデルは時空を越える
 
ももたろう
ももたろうももたろう
ももたろう
 
Vbaでもtdd
VbaでもtddVbaでもtdd
Vbaでもtdd
 
Sierのアジャイルとジレンマとパラダイムシフト
SierのアジャイルとジレンマとパラダイムシフトSierのアジャイルとジレンマとパラダイムシフト
Sierのアジャイルとジレンマとパラダイムシフト
 
脱Java初心者を目指すときに読むといいと思う本を考える会
脱Java初心者を目指すときに読むといいと思う本を考える会脱Java初心者を目指すときに読むといいと思う本を考える会
脱Java初心者を目指すときに読むといいと思う本を考える会
 
再入門!RESTとSpringMVC
再入門!RESTとSpringMVC再入門!RESTとSpringMVC
再入門!RESTとSpringMVC
 
SGT2014 横浜道場 始めよう!インセプションデッキ
SGT2014 横浜道場 始めよう!インセプションデッキSGT2014 横浜道場 始めよう!インセプションデッキ
SGT2014 横浜道場 始めよう!インセプションデッキ
 
Tdd keyword
Tdd keywordTdd keyword
Tdd keyword
 
ゆるぎー
ゆるぎーゆるぎー
ゆるぎー
 
マシュマロチャレンジ
マシュマロチャレンジマシュマロチャレンジ
マシュマロチャレンジ
 
システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~
システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~
システム設計の謎 ~べ、別にあんたのために設計してるんじゃないんだからね///~
 

Springのプログラムモデルと動く仕様~テスト編~

  • 2. 2Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. • 設計? • 仕様? • ドキュメント? はじめに 筆者は「設計とは“考えること”であり、アウト プットはその一側面である」と考えている
  • 3. 3Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 1. 物事をする方法。しかた。やりかた。 「まだほかに仕様があるだろう」 2. 機械類や建築物などの構造や内容。 「仕様の一部を変更する」 仕様とは? https://dictionary.goo.ne.jp/jn/107319/meaning/m0u/ デジタル大辞泉の解説
  • 4. 4Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 「ユーザの要求を満たすために サービスやシステム、機能などが どのように振る舞うかを 定めたもの」と定義する この場での「仕様」の定義
  • 5. 5Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 寺島 秀樹(@terahide27) (株)ビッグツリーテクノロジ&コ ンサルティング 所属 SIerを中心に アーキテクト・アジャイルコンサ ルタントとして就業 システムの保守運用から営業支援 まで手広くいろいろやってます CSP/CSPO/CSM TOCfE国際認定ファシリテータ/ アニメ/酒/ラーメン/ 自己紹介
  • 6. 6Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. • テスト駆動開発の話 • アジャイルの話 • すごい話 今日しない話
  • 7. 7Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. • 実際の事例 • テストと仕様とプログラムの話 • 現場で試してみようと思ってる話 (ちょっとだけ) 今日する話
  • 8. 8Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 出来事
  • 9. 9Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. • 某サービスを運用している現場 • 5週程度のイテレーションでリリースを繰 り返している • 保守を行うチームメンバは12人程度(ほと んどが経験3年目までの若いメンバ) • 自分はインフラのおもりや障害などの調査 を中心にしていて、開発のイテレーション にはあまり関わってなかった 背景
  • 10. 10Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 「手が足りないからステージング環境 でテストしてください」 「かしこま〜」 ある日
  • 11. 11Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. テスト仕様書「ユーザの区分がxxで商材のなんたらフラグ となんたらフラグが立っている時になんたら画面でなんた らするとほにゃららがほにゃららで...」 「?」 ユーザの区分がxxなのはわかった。(それ以外のユーザで はどうなるか書いてないけど一旦おいておこう) 「商材のなんたらフラグってどうやって立てるんですか? DB書き換えてええのん?」 「ステージング環境でそんなことしないでください」 「だったらどうやってその状態にするんですか?」(結構 マニアックな機能だった)
  • 12. 12Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. Untestable Test Case
  • 13. 13Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. • テストしたい観点は書かれていた • それをテストするための状態にする にはどうすればいいかが書かれてい なかった なにが問題だったか?
  • 14. 14Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. • 操作やその結果に対してはみなさん よく気づく • その操作を行う事前の条件や状態を 忘れがち • e.g. エアコンの設定温度を20度に すると冷たい風がでる。本当? 事前条件を表す?
  • 15. 15Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. • given 事前条件・状態 • when 対象に対する操作をした時 • then どうなるか テンプレート [given]の状態で[when]をすると[then] given - when – then
  • 16. 16Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. まさに仕様
  • 17. 17Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. この人ご存知? http://www.startrek.com/database_article/spock
  • 18. 18Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. • JUnitみたいなもん • given - when - then でテストが書ける素晴らし いもの e.g. Spock def test(){ given: "カートにアイテムがある" 商品一覧を開く() カートにいれるby商品ID(1) when: "カートを開く" 商品一覧でカートリンクをクリックする() then: カート画面が表示されている() and: 購入ボタンがクリッカブルである() }
  • 19. 19Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. プログラマはプログラムを書くのが仕事 我々はプログラマである https://www.lifehacker.jp/2014/12/141210programmer_signs.html
  • 20. 20Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. プログラムで表現することができれば ドキュメントと違い動かして検証をすることが容易 自動テストを書けば繰り返しの検証もできる 自動テストもまたプログラム 自動テストのプログラムは、もはやテストが目的で はなく、「動く仕様」としての位置づけを求められ る 自動テストは動く仕様である
  • 21. 21Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 出来事
  • 22. 22Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. @Test public void test_success1(){…} @Test public void test_success2(){…} 延々と続く・・・ 前みたJUnit
  • 23. 23Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. @Test public void test(){ load(“xxxData.xls”); actual = sut(); assertWithExcel(actual, “expected.xlsx”); } 前みたJUnit
  • 24. 24Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 仕様?
  • 25. 25Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. まずはテストメソッドの名前を given - when - then で書くことをしてみよう JUnitでは? @Test public void カートにアイテムがある状態でカートを開くと購入可能である(){ //given 商品一覧でカートにいれるby商品ID(1); //when 商品一覧でカートリンクをクリックする(); //then カート画面が表示されている(); 購入ボタンがクリッカブルである(); }
  • 26. 26Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. もう少しUnit Testみたいな例 @Test public void 商品がある状態でカートに追加すると購入可能である(){ //given assertThat(itemService.findAll().size(), graterThan(0)); //when Item item = itemService.findById(1); cartService.add(item); //then assertThat(cartService.isPurchasable(), is(true)); }
  • 27. 27Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. テストで確認したい部分が仕様レベルの話 それをどう実現するか(指定がないならば)の話は隠蔽しても構わない むしろプログラムレベルの話(前述の例ならばDOMの操作など)は積極 的に隠蔽した方がいい 仕様レベルとそれ以外のレベル @Test public void カートにアイテムがある状態でカートを開くと購入可能である(){ //given // 商品一覧ページを開きIDが商品IDの親のtrタグの中の // classがaddCartのリンクをクリックする(プログラムレベルの話) 商品一覧でカートにいれるby商品ID(1); //when // 「カートを開く」とあるが、開き方の指定はなし(操作レベルの話) 商品一覧でカートリンクをクリックする(); //then カート画面が表示されている(); 購入ボタンがクリッカブルである(); }
  • 28. 28Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 仕様レベルの話を残しそれ以外は他所に委譲する 結果テストのしやすさにつながってくる e.g. プロダクションコードにおける仕様と構造 public CartService{ //購入可能な状態で購入するとカートからアイテムがなくなり購入処理を行う public void purchase(){ if( ! this.isPurchasable()){ throw new IllegalStateException("is not purchasable"); } List<Item> items = this.findAll(); items.stream() .map(i -> toPurchased(i)) .forEach(p -> purchaseService.purchase(p))); this.deleteAll(items); } ・・・
  • 29. 29Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. つづき // カートにアイテムがあるならば購買処理の購買可能判定を行う public boolean isPurchasable(){ if( this.findAll().isEmpty() ){ return false; } return purchaseService.isPurchasable(); } public List<Item> findAll(){ return cartRepository.findAll(); } public void deleteAll(List<Item> items){ cartRepository.deleteAll(items); } private PurchasedItem toPurchased(Item item){ //snip 商品の特性によってなにやら難しい処理 }
  • 30. 30Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. Spring
  • 31. 31Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. Spring Ecosystem http://springtutorials.com/
  • 32. 32Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. DI Container
  • 33. 33Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 自動テストの際にテスト観点以外の依存した部分をMock やStubなどに差し替えることがやりやすくなった • Frameworkなどの親クラスみたいな縛りから解放され た • 依存関係があった場合でも依存性の注入という形で解決 される DI Container がもたらしたもの
  • 34. 34Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 前述の例 ホワイトボックステスト //購入可能な状態で購入するとカートからアイテムがなくなり購入処理を行う if( ! this.isPurchasable()){ //モックにしてtrue or false を返す throw new IllegalStateException("is not purchasable"); } List<Item> items = this.findAll(); //モックにしてアイテムを2個返す items.stream() .map(i -> toPurchased(i)) // 複雑なことをしていてテストしづらいなら // モックに変えてシンプルにする .forEach(p -> purchaseService.purchase(p))); //モックにして // 2度呼ばれたことを検証する this.deleteAll(items); //モックにして呼ばれたことを検証する
  • 35. 35Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 状態中心のテスト テストしたい対象の処理前後での状態の変化を検証すること でテストを行う 相互作用中心のテスト テストしたい対象のオブジェクトの相互作用(メッセージの やりとり)を検証することでテストを行う 平たく言うとどのメソッドがどのように何回呼び出されるか 状態中心のテストと相互作用中心のテスト
  • 36. 36Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 依存部分はモックに変えていくことでテスト観点(仕様)に フォーカスしたテストになる モックに変えた部分はそれぞれ「仕様」があるはずなのでそ れは個別にテストを行う 最終的には依存しないテスト対象はモックに変えずにテスト を行うのでホワイトボックステストとしては充分となる (前述の例だと repository や toPurchased() がその例) 相互作用中心のテスト(私見)
  • 37. 37Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 前述の例 再掲:ホワイトボックステスト //購入可能な状態で購入するとカートからアイテムがなくなり購入処理を行う if( ! this.isPurchasable()){ //モックにしてtrue or false を返す throw new IllegalStateException("is not purchasable"); } List<Item> items = this.findAll(); //モックにしてアイテムを2個返す items.stream() .map(i -> toPurchased(i)) // 複雑なことをしていてテストしづらいなら // モックに変えてシンプルにする .forEach(p -> purchaseService.purchase(p))); //モックにして // 2度呼ばれたことを検証する this.deleteAll(items); //モックにして呼ばれたことを検証する
  • 38. 38Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. E2Eのテストやもっと広いシナリオテストのように粒度の 大きい話しから1つのメソッドに対しての粒度の小さい話 しのいずれでも今日の話しは適用できる ただし、仕様の粒度を間違えるとぐちゃぐちゃになるので 要注意(特に粒度の小さい部分) 今日の仕様の話は ・・・
  • 39. 39Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 粒度の大小に関係なく、テスト対象の使い方をテ ストする (仕様をテストする) 使い方をテストする ・・・
  • 40. 40Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. e.g. • 北緯なん度、経度なん度の場所に向かい エレベータで何階に行き鍵を取り出しド アを開け靴を脱ぎ冷蔵庫から缶ビールを 取り出してベッドに横になる 粒度の違い
  • 41. 41Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. • プログラマはプログラム書くときの言葉に慣れすぎてい る • 最初に話したテスト仕様書の話しはすごくビジネスから 遠い用語で書かれていた • 特に粒度の小さいテストの場合は要注意 XXフラグみたいなもの
  • 42. 42Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. • ビジネスで使っている言葉で表現しましょう • 難しかったらせめて対象となるものの操作方法(画面と か)で表現しましょう • ただ抽象度の低いホワイトボックステストだとこれも難 しい コツ
  • 43. 43Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 課題と今後
  • 44. 44Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. テスト仕様書はgiven-when-thenのテストで書くように した 結果 • トータルコストは下がった(手戻りが減った) • プログラマの心理的安全が高まった 課題 • メンバによって理解度のバラツキが大きい • 品質は大差ない • テスト工数があがった 実際にやってみた(自プロジェクト)
  • 45. 45Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. Sound only 自動テストに対する取り組み
  • 46. 46Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. テスト仕様としていろいろなところに 散らばった仕様を一元管理してトレー ス可能に 今考えてること
  • 47. 47Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. • spockを使って自動テストを記載するプロ ジェクトがちらほらと増えてきた • E2Eの自動テストをうまく活用しているプ ロジェクト • 今後は社内外で今日のような話を通して増 やしていく予定 会社としての取り組み
  • 48. 48Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. まとめ
  • 49. 49Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. • given - when - then • 仕様はビジネスで使う用語で表わそう • 粒度に気をつけて表わそう • プログラムは構造に気をつけよう • 積極的に自動テストに落とそう まとめ
  • 50. 50Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. 最後に
  • 51. 51Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. • ドキュメンテーションや口伝だとうまく伝わらないもの をどう伝えるかは永遠にテーマだと思う • BDD,ATDDのように検証の方向からのアプローチした りDDDのように設計・実装からアプローチしたりいろい ろな方向から取り組んでいくべき課題と捉えている • なにはともあれプログラムはリーダブルであることが 大前提だと自分は思う • アプローチの一環として今までにはないサービスや開発 形態が今後どんどんでてくるだろうからそういう面でも 注目したいと思っている 所感
  • 52. 52Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. ってことで API編へ
  • 53. 53Copyright © 2018 Bigtree Technology&Consulting Ltd. All Rights Reserved. の前に 10分休憩