ソフトウェアテスト研修

yamamoto kiyohiro

2021/10/15

研修の前に…
質問１
これまでテストについて勉強したことがある[ はい ][いいえ]研修の前に…
質問２
テストを書くことが好きである[ はい ][いいえ]研修の目的・テストは体系化された学問である事を知る・テストに対する正しい認識を持つ・テストの典型的な手法について知る

今日の内容・ ソフトウェアテストとは・ 代表的なテスト手法
・ テスト対象について
・ ホワイトボックステスト
・ 制御パステスト・ カバレッジについて
・ ブラックボックステスト
・ 同値分析法
・ 境界値分析法
・ 決定表テスト
・ 状態遷移テスト
・ ランダムテスト
・ 探索的テストソフトウェアテストとは

ソフトウェアテストとは

https://ja.wikipedia.org/wiki/ソフトウェアテスト

ソフトウェアテストの目的

仕様にない振舞または欠陥（バグ）を見つけ出す作業↓
何のためか？

ソフトウェアテストの目的

仕様にない振舞または欠陥（バグ）を見つけ出す作業↓

品質を保つため

ソフトウェアテストの目的
ソフトウェアテストはもっともポピュラーな品質改善方法である― Steve McConnell

https://stevemcconnell.com

余談：バグのこわい話
アリアン 5 型ロケット爆発事故（1996年、European Space Agency）

原因
64 bit 浮動小数を 16 bit 符号付き整数に変換する際のオーバーフローバグ
損失
10 年と 70 億ドルをかけて開発
ロケット本体の価格は 5 億ドル
https://karapaia.com/archives/52135274.html

バグを完全につぶすには

バグこわい🥺
バグを完全につぶしたい😡
どうすればいい？

バグを完全につぶすにはバグこわい🥺
バグを完全につぶしたい😡
A. そんなことは不可能
どうすればいい？

バグを完全につぶすには
例：整数 A と B が入力、A × B が出力（ただし A, B は 0 ~ 999 の範囲）

この場合、全てを網羅するテストケースは 100 万通り「完璧」でなくとも「十分」な品質を持つ事が求められる

テストはスキル
パレートの法則（80:20の法則）
全体の数値の大部分は全体を構成するうちの一部の要素が生み出している

パレートの法則はバグに関しても成り立つ→ バグが起きやすい部分を重点的にテストする事が大事→ 危険な箇所への嗅覚を、知識と経験から鍛える
https://ga-geek.com/pareto/テストケースを作るのは難しい
例：マイヤーズの三角形（マイヤーズ：ソフトウェア・テストの技法の著者）

https://www.qbook.jp/academy/curriculum/0001/lessons/ad00001/

テストケースを作るのは難しい
答え
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.

有効な不等辺三角形を表す
有効な二等辺三角形を表す
有効な正三角形を表す
有効な二等辺三角形の場合に2つの等辺を含む3種類の組み合わせを3つ含（3.3.4/3.4.3/4.3.3）
一つの辺が0の値をもつ
一つの辺が負の値をもつ
すべての辺が0の値をもつ
0より大きい3つの整数のうち、2つの数の和がそれ以外の1つと等しい
8.において、1辺の長さが他の2辺の長の和に等しいことを少なくとも3種類の順列のすべてに対して試すことのテストケースを持っているか？
0より大きい3つの整数のうち、2つの数の和がそれ以外の1つの数より小さくなるテストケースを持っているか？
10において、1辺の長さが他の2辺の長の和に等しいことを少なくとも3種類の順列のすべてに対して試すことのテストケースを持っているか？
整数でない値を持つテストケースを持っているか？
数値の個数が間違っていることを試すテストケースについて、入力の値に対して予想される出力を示したか？
それぞれのテストケースについて、入力の値に対して予想される出力を示したか？

テストケースを作るのは難しい
答え
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.

有効な不等辺三角形を表す
有効な二等辺三角形を表す
有効な正三角形を表す
有効な二等辺三角形の場合に2つの等辺を含む3種類の組み合わせを3つ含（3.3.4/3.4.3/4.3.3）
一つの辺が0の値をもつ
一つの辺が負の値をもつ
すべての辺が0の値をもつ
0より大きい3つの整数のうち、2つの数の和がそれ以外の1つと等しい
8.において、1辺の長さが他の2辺の長の和に等しいことを少なくとも3種類の順列のすべてに対して試すことのテストケースを持っているか？
0より大きい3つの整数のうち、2つの数の和がそれ以外の1つの数より小さくなるテストケースを持っているか？
10において、1辺の長さが他の2辺の長の和に等しいことを少なくとも3種類の順列のすべてに対して試すことのテストケースを持っているか？
整数でない値を持つテストケースを持っているか？
数値の個数が間違っていることを試すテストケースについて、入力の値に対して予想される出力を示したか？
それぞれのテストケースについて、入力の値に対して予想される出力を示したか？

基本的に実装よりテストの方が記述が多くなる

代表的なテスト手法

テストの対象
ソフトウェアが達成すべき目的は２つに分類できる

機能要件→ クライアントが求める機能→ 仕様書に記載される要件

非機能要件→ 機能要件以外の品質特性 (-ity)→ 暗黙的に求められる仕様書外の要件
https://webrage.jp/techblog/non_functional_testing/代表的なテスト手法
非機能要件

非機能要件とは非機能要件にはどういったものがあるのか？

非機能要件とは※ ISO9126 品質特性による

非機能要件のテスト
非機能要件は特性毎にテスト手法が異なる
さらに全てはトレードオフ→信頼性を維持しつつ効率を上げる事は出来ない…
テスト手法の例
効率性：パフォーマンステスト
機密性：セキュリティテスト
信頼性：カオスエンジニアリング

多岐にわたりそれぞれ専門性も問われる
今回の研修では範囲外😇

代表的なテスト手法
機能要件

機能要件のテスト
代表的なテスト手法がいくつか存在する・ホワイトボックステスト・ブラックボックステスト
・探索的テスト代表的なテスト手法
機能要件
ホワイトボックステスト

ホワイトボックステスト
ホワイトボックステスト ＝ プログラム内部構造のテスト
内部実装をコードレベルで把握した上で行うテストのこと

https://www.qbook.jp/column/20180625_631.html

代表的なテスト手法
機能要件
ホワイトボックステスト
制御パステストホワイトボックステスト：制御パステスト
ホワイトボックステストの中でも代表的かつ重要な手法

制御パステスト
制御パスをどれだけ網羅できたかをチェックするテスト

ホワイトボックステスト：制御パステスト
網羅率を考えたいホワイトボックステスト：制御パステスト
start

フローチャートにしてみる

c1 or c2

s1

c3

s3

end

s2

ホワイトボックステスト：制御パステスト
start

条件
真か偽か
分岐
どのルートを辿るか
命令文実行されるかどうか

c1 or c2

s1

c3

s3

この３点に注目するends2

ホワイトボックステスト：制御パステスト
ステートメントカバレッジ（C0）start

全ての命令文が１回以上実行されれば 100%c1 or c2

100 % 達成のテストケース

s1

c1

c2

c3

c3

1

T

F

T

s3

2

FF

T
ends2

ホワイトボックステスト：制御パステスト
ブランチカバレッジ（C1）start

全分岐における方向が１回以上実行されれば100%
c1 or c2

100 % 達成のテストケース

s1

c1

c2

c3

c31TTTs3

2

FF

Fends2

ホワイトボックステスト：制御パステスト
コンディションカバレッジ（C2）start

全条件における真偽が１回以上実行されれば100%
c1 or c2

100 % 達成のテストケース

s1

c1

c2

c3

c3

1

TFT

s3

2

F

TFends2

ホワイトボックステスト：制御パステスト
他にもいろいろ…

MCC (Multiple Condition Coverage)
C2 を複合条件に対応させたもの

MC / DC (Modified condition / decision coverage)
C1 と C2 の合体版みたいなものホワイトボックステスト：制御パステスト
制御パステストは重要… しかし、万能ではない
苦手なもの
・ループ・排他制御・マルチタスク（スレッド）・ etc ...

なるべくテストしやすい部分をモジュールとして切り出すのがおすすめ代表的なテスト手法
機能要件
ブラックボックステスト

ブラックボックステスト
ブラックボックステスト ＝ プログラム内部構造を考慮しないテスト
入力と結果の整合性で行うテストのこと

https://www.qbook.jp/column/20180704_633.html

ブラックボックステスト
代表的な手法がいくつか存在する・同値分析法・境界値分析法
・決定表テスト（デシジョンテーブル）・状態遷移テスト
・ランダムテスト

代表的なテスト手法
機能要件
ブラックボックステスト
同値分析法

ブラックボックステスト：同値分析法
同値分析法
入力を「有効同値クラス」と「無効同値クラス」に分ける
同じクラスの値は等価とみなしてテストを行う

https://tanagram18.hatenablog.com/entry/2019/09/28/032222

ブラックボックステスト：同値分析法
同値分析法
例：日付の「月」を入力されるシステム

テストケース例
無効同値クラス１：-10
有効同値クラス ：5
無効同値クラス２：100

https://gihyo.jp/dev/serial/01/tech_station/0004

代表的なテスト手法
機能要件
ブラックボックステスト
境界値分析法ブラックボックステスト：境界値分析法
境界値分析法
同値分析法で入力クラスを分けた上で、クラス間の境界に注目する

何故か？

理由：バグは境界にひそむためブラックボックステスト：境界値分析法
境界値分析法例：印刷システムでのページ指定のバリデーション（１ページ以上印刷できる）

正常なコードブラックボックステスト：境界値分析法
境界値分析法例：印刷システムでのページ指定のバリデーション（１ページ以上印刷できる）

閉包関係バグ

余分な境界境界がない

ブラックボックステスト：境界値分析法
境界値分析法例：日付の「月」を入力されるシステム
On-Offポイント法
異なる処理が行われる一番近い２点をテストする

テストケース例
無効同値クラス１：-10, 0
有効同値クラス ：5, 1, 12
無効同値クラス２：100, 13

https://gihyo.jp/dev/serial/01/tech_station/0004

代表的なテスト手法
機能要件
ブラックボックステスト
決定表テストブラックボックステスト：決定表テスト
決定表テスト（ディシジョンテーブル）
全ての入力の組み合わせと、その出力をテストする※条件が多いものには不向き（ケースが多くなる）

https://www.itmedia.co.jp/im/articles/1111/07/news138.html

代表的なテスト手法
機能要件
ブラックボックステスト
状態遷移テストブラックボックステスト：状態遷移テスト状態遷移テスト
状態によって異なる動作をテストするGUI や通信プロトコル等のテストで有効

状態遷移図

状態遷移表

https://webrage.jp/techblog/transition_test_of_the_state_of_the_system/

代表的なテスト手法
機能要件
ブラックボックステスト
ランダムテストブラックボックステスト：ランダムテスト
ランダムテスト（アドホックテスト・モンキーテスト）
ランダムに操作を行ってバグを探す手法
例：デタラメに入力しまくる
画面をクリックしまくる
荒っぽいやり方だが結構バグは見つかる※ただし氷山の一角

https://blog.members.co.jp/article/19146

代表的なテスト手法
機能要件
探索的テスト

探索的テスト
探索的テスト ＝ 担当者がドメインエキスパートとして実施するテスト
ドメインに対する深い知識とテストに関する知識を持つテスト担当者が行うもの
テストケースのある記述的なテスト（スクリプトテスト）と対象的

https://www.nttdata.com/jp/ja/data-insight/2014/072401/

探索的テスト
探索的テストの１ケース
・パワーポイントでは表の最大値が 75 までの仕様→ なんとか超えられないか？
・まず最大値の表を作成
・そこに 1 行挿入を行う→ 突破できる！
・以下繰り返しで拡大していく→ どんどん不安定になり最後はクラッシュ最後に改めて確認今日の目的再確認

・テストは体系化された学問である事を知る・テストに対する正しい認識を持つ・テストの典型的な手法について知る