あるいは
ところで
おまけ
欠陥、品質はフィードバックがあって初めて改善される
→ レポートや報告などでフィードバックするまでがテスト
テストの始まりはいろいろある
早速テストを始めるべきか?
なにも考えずに手を付けるとこういうこともありうる
→ 「いまどき手動テスト? CI で動かせないとこまるんだけど」
→ 「動かないんだけど?動作確認は当たり前でしょ」
認識違いは多々ある!
何事も始める前に意識合わせをしよう
プロジェクトの三角形に対してテストの三角形も考えられる
プロジェクトの三角形
予算
時間
スコープ
テストの三角形
リソース
工程
スコープ
テストに必要なリソースはなにか?
どのテストをどのタイミングでいつまでに実施するか?
IEEE 829 でテストプランテンプレートというものが用意されている
テスト担当になってもいきなりテストを始めてはいけない
いつ、誰がやっても同じように成否が判断できるように書く
テスト手順、確認手順、結果は具体的に書く
テストケースID: SEARCH1234
テストケースタイトル: ファイルの検索
テスト手順:
ステップ1: TestTaisho ページをブラウザから開く
ステップ2: abcd と検索欄に入力する
ステップ3: 検索ボタンを押下する
結果及び確認:
ステップ3 の実行後に検索結果画面に遷移すること確認する。検索結果画面に abcd を含む結果が表示されていることを確認する。
これでは誰かがやったテストを再現することができない
対象 | テスト項目 | 結果 |
---|---|---|
アルファベットファイル名 | OK/NG | |
日本語ファイル名 | OK/NG | |
長いファイル名 | OK/NG | |
禁止文字を含むファイル名 | OK/NG |
検索機能
入力を条件でグルーピングして、それぞれのグループから代表となる値を選び、それをテストケースに使う方法
例えば「65歳以上」という条件が合った場合
として 2 つのテストケースをつくる
65歳
70歳
10歳
入力を条件でグルーピングして、それぞれのグループの上限値、下限値をテストケースに使う方法
例えば「65歳以上」という条件が合った場合
としてテストケースをつくる
65歳
64歳
複数の条件がある仕様をテストする際に条件のすべての組み合わせを圧縮してテストケースを省く手法
圧縮は
品物は書籍 | Y | Y | Y | Y | N | N | N | N | |
合計 1,500 円以上 | Y | Y | N | N | Y | Y | N | N | |
配送先は離島以外 | Y | N | Y | N | Y | N | Y | N | |
動作 | 送料無料 | Y | N | N | N | N | N | N | N |
条件
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ||
---|---|---|---|---|---|---|---|---|---|
品物は書籍 | Y | Y | Y | Y | N | N | N | N | |
合計 1,500 円以上 | Y | Y | N | N | Y | Y | N | N | |
配送先は離島以外 | Y | N | Y | N | Y | N | Y | N | |
動作 | 送料無料 | Y | N | N | N | N | N | N | N |
条件
赤枠は動作に影響なし
→圧縮できる
1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
---|---|---|---|---|---|---|---|---|
品物は書籍 | Y | Y | Y | Y | N | N | N | |
合計 1,500 円以上 | Y | Y | N | N | Y | Y | N | |
配送先は離島以外 | Y | N | Y | N | Y | N | - | |
動作 | 送料無料 | Y | N | N | N | N | N | N |
条件
赤枠は動作に影響なし
→圧縮できる
1 | 2 | 3 | 4 | 5 | ||
---|---|---|---|---|---|---|
品物は書籍 | Y | Y | Y | N | N | |
合計 1,500 円以上 | Y | Y | N | Y | N | |
配送先は離島以外 | Y | N | - | - | - | |
動作 | 送料無料 | Y | N | N | N | N |
条件
赤枠は動作に影響なし
→圧縮できる
1 | 2 | 3 | 4 | ||
---|---|---|---|---|---|
品物は書籍 | Y | Y | Y | N | |
合計 1,500 円以上 | Y | Y | N | - | |
配送先は離島以外 | Y | N | - | - | |
動作 | 送料無料 | Y | N | N | N |
条件
4 件までテストケースを減らせた
(余談)
開発者のつくるテストではあまり聞かない気がする…
No | ドリンクの種類 | 砂糖のありなし | ミルクのありなし |
---|---|---|---|
1 | コーヒー | あり | なし |
2 | コーヒー | なし | あり |
3 | 紅茶 | あり | あり |
4 | 紅茶 | なし | なし |
HAYST法でテストケースを作成した例
開発者がソフトウェアテスト技法を学んでメリットはあるか?
State of Testing Report 2018 によると
まだ Excel は結構使われている様子
「テスト管理ツール」が具体的に何が良いかはわからず…
おまけ
手動テストだけで済む時代ではなさそう
おまけ
だいたいの場合は YES
(実践JUnit からの引用)
func TestParseRequestResult(t *T) {
c := HeavyObject()
res, _ := c.RequestSomething() // すごい遅い処理
v, err := parse(res) // このテストケースでやりたいこと
T.Assert().NoError(err)
T.Assert().Equals(v.body, "期待する結果")
}
func TestParseRequestResult(t *T) {
c := HeavyObjectMock() // Mock に変える
res, _ := c.RequestSomething() // すぐ終わる
v, err := parse(res) // このテストケースでやりたいこと
T.Assert().NoError(err)
T.Assert().Equals(v.body, "期待する結果")
}
テストで確認したいこととは別の場所で時間がかかる
時間がかかる処理はモックに置き換え、テストしたいことが
迅速に終わるようにする
var v Something // 使いまわしたいのでグローバル変数にする
func TestInitialization(t *T) {
v := SomethingInitialize()
T.Assert().Equals(v.msg, "期待する結果")
}
func TestParseRequestResult(t *T) {
v.Change()
T.Assert().Equals(v.msg, "別の結果")
}
2 つめのテストは 1 つめのテストの実行を前提にしている
func TestInitialization(t *T) {
v := SomethingInitialize()
T.Assert().Equals(v.msg, "期待する結果")
}
func TestParseRequestResult(t *T) {
v := SomethingInitialize()
v.Change()
T.Assert().Equals(v.msg, "別の結果")
}
テストケースは独立に実行できるようにする
func TestInitialization(t *T) {
f := LoadConfiguration()
t.Assert().Equal(f.HasSomeValue(), false)
f.SetSomeValue()
t.Assert().Equal(f.HasSomeValue(), true)
f.SaveConfiguration()
g := LoadConfiguration()
t.Assert().Equal(g.HasSomeValue(), true)
}
func TestInitialization(t *T) {
f := LoadConfiguration()
t.Assert().Equal(f.HasSomeValue(), false)
f.SetSomeValue()
t.Assert().Equal(f.HasSomeValue(), true)
f.SaveConfiguration()
g := LoadConfiguration()
t.Assert().Equal(g.HasSomeValue(), true)
CleanConfiguration() // 環境をクリーンアップする
}
テストごとにテストケースによるゴミは片付ける
func TestSomething(t *T) {
runSomething()
fmt.Fprintf(os.Stderr, "標準出力に Hello, World と出てるか確認してください")
}
人間が目視での確認が必要なテストコードは避ける
作ったテストケースは実行されないと意味がない
なんらかのタイミングで実行する仕組みを作る
例
テストコードによるテストを実行し続けると
などいいことづくめに見えるが…
テストコードのバグによって常に成功するテスト
一見無害に見えるが、
似たような機能がたくさんあるために、コピペでテストをつくる
コピペでテストできてしまうので、
などの理由でテストの意味が失われてしまう
Template Methodパターンを採用しているときに起きやすい
テスト対象のコードがテストコードでどれくらい実行されたかを示す指標。 100% になることはまずない
TDDを実施した場合に、コーディング(実装)の時間が16%増えた。
TDDを実施した場合に機能テスト(ブラックボックス)で不具合を検出するテーストケース数が削減された(不具合を検出したテストケースが18%減少)。
TDDを実施した場合、テストのカバレッジが大きくなった。
(http://blogs.itmedia.co.jp/morisaki/2010/03/tdd---3-5b4a.html から引用)
YES
TDD 本の写経をしてみるのもおすすめ
状況による
とはいえ、
ココらへんの人から芋づる式に辿れるはず
紹介はしたが、テストエンジニア向け。開発者にはちょっとむいていないかも
アルゴリズム
データ構造
ネットワーク