Acceptanceなtestは
開発者がまず書こう
!
muryoimpl
1
※注意※
ここでいうAcceptance testは
自動テストとして実行できるものを
大前提としています
Acceptance Testとは
• いわゆる受け入れテストというやつ
• Web開発者のコンテキストでは、作ったものが
ブラウザの動きをシミュレートして End to end
な感じでちゃんと動くかどうか、を確認するテ
スト(と思っている)
• 有名どころgemでは cucumber とか turnip
feature ファイル作って自動実行する
システム
↓
→ Unit test ←
↑
(内部から¦内部の) 動作が正しいかを検証
Unit test
↓
→ Unit test ←
↑
システム
外側から動作が正しいかを検証
Acceptance test
↑
Acceptance test
Acceptance test
↓
テスト粒度
小 大
Unit test Acceptance test
1つあたりの網羅性
大小
さて、本題
テスターが別にテスト
作ったらいいじゃん
(゚Д゚)ハァ??
なぜ開発者がまず
作成するのか?
開発者にとって
必要だからです
( ー`дー́)キリッ
なぜ開発者に必要か
1. 動作異常(バグ)に気がつく機会が増える
2. 手動確認の手間が減る
3. feature はリファクタリングのトモダチ
4. 一機能としてひと通り動くことを証明できる
なぜ開発者に必要か
1. 動作異常(バグ)に気がつく機会が増える
2. 手動確認の手間が減る
3. feature はリファクタリングのトモダチ
4. 一機能としてひと通り動くことを証明できる
1. 動作異常(バグ)に気がつく機会が増える
• model と controller だけでなくview 側の異常
に気づくことができる

-> poltergeist だと js エラーも検知できるし

-> view spec 作るより幸せだと思うし
• 各ロジック確認するより、feature みるほうが
ざっと何してるかわかりやすいので、

実装漏れに気づきやすい(実際にあった話)
なぜ開発者に必要か
1. 動作異常(バグ)に気がつく機会が増える
2. 手動確認の手間が減る
3. feature はリファクタリングのトモダチ
4. 一機能としてひと通り動くことを証明できる
2. 手動確認の手間が減る
• 苦労が美談的なものは窓から投げ捨てよう!

楽して別のところに時間使おう
• Jenkinsおじさんに任せることもできる
• リファクタリング時、仕様変更時に威力大
なぜ開発者に必要か
1. 動作異常(バグ)に気がつく機会が増える
2. 手動確認の手間が減る
3. feature はリファクタリングのトモダチ
4. 一機能としてひと通り動くことを証明できる
3. feature はリファクタリングのトモダチ
• リグレッションの確認動作が楽チン

-> 手動実行、ダルい。不正確。

-> Q.どこまで確認したらいいの?

A. 迷ったら全部流せばいい
• これが通ればOKという最後の砦ができるので

障壁が下がる -> 積極的にリファクタできる
なぜ開発者に必要か
1. 動作異常(バグ)に気がつく機会が増える
2. 手動確認の手間が減る
3. feature はリファクタリングのトモダチ
4. 一機能としてひと通り動くことを証明できる
3. 一機能としてひと通り動くことを証明できる
• だいたいの仕様を満たすことが確認できると思
うので、一旦「できた」って宣言できる
• 客から求められるのは外から確認できる動きが
正しいか。最低これが正しければ直接確認して
もらうことも可能なのでは?

-> 内部処理が心配なら Unit test を厚く
なぜ開発者に必要か
1. 動作異常(バグ)に気がつく機会が増える
2. 手動確認の手間が減る
3. feature はリファクタリングのトモダチ
4. 一機能としてひと通り動くことを証明できる
そして
feature あるとですね
bundle update
できるようになるんですよ
bundle update できるようになる
• RailsやRubyは更新が早い → サポート切れ早い

各種gemをupdateしたときの動作保証は何でする?

-> Unit test カバレッジ100% (ヾノ・ ・`)ムリムリ

-> feature(外側から見た動きの保証)があれば

道標になる・最後の砦になる
• 2.x系は無理として、3.x系は4.x系にあげたい

-> 開発者は後で「上げて」って言われたときの地獄 

 を知っている…

-> 使いきりでない限りこれは営業的には確保必至

  保守費という概念に含めるべきだが、無理なら

  システム寿命を延ばすために絶対必要って言って!

  先延ばしにすればするほどコストと不満は激増(真顔)
テスターが別にテスト
作ったらいいじゃん
(゚Д゚)ハァ??
テスター テストエンジニア
の場合
そもそも
step定義作成するのに
内部仕様知ってないと
ダメでしょ?
どういう仕様か確認しながら
作るより
仕様作りながらstep作るほうが
(私は)楽と思う
楽 == 工数少ない
(心理的にも楽と思う)
というわけで
feature/stepを
せっせこ開発時に
作りましょう
ただし
stepのノウハウ貯めるのに
最初はコストがかかる
けど、これは醸成する価値
がある箇所だと思います
stepのノウハウ
• プロジェクト間で再利用が可能

-> 醸成していけば、後に始まったプロジェクト

 は効率化される
• stepが多くなれば、開発者じゃない人たちが
featureファイル作成してテスト作るのも可能に
なる…と思う…
stepのノウハウ
抽象度
低
高 common なfileに定義する = 他でも使いまわす
step_fors :hoge {} なnamespaceに定義する
※moduleで分けてもいいけど、eachとかして全部いれるちゃうじゃない?
stepのノウハウ
抽象度
低
高 common なfileに定義する = 他でも使いまわす
step_fors :hoge {} なnamespaceに定義する
※moduleで分けてもいいけど、eachとかして全部いれるちゃうじゃない?
なるべく抽象度高くできるといいよね!
※テーブルも使ったほうが見やすいかな
定義貯めたcommonなstepを
ライブラリ的に入れるもよし
!
使うものだけ入れるもよし
テスター = テストエンジニア
の場合
システムが出来上がった後に
テストエンジニアがテストする観点
って
そもそもシステムがある程度ちゃんと
動いてないとテストエンジニアの
やりたい観点のテストまで到達しないので
もったいないと思う
劇終

Acceptance testは開発者がつくるべき(公開版)