【社内勉強会】ソフトウェアテストの基礎(2017/07/27)


# 0.はじめに

------------------
## 伝えたいこと
* ブラックボックステスト、ホワイトボックステスト
* 同値分割法
* 境界値分析法



------------------
## 参考図書
![参考図書.png](https://qiita-image-store.s3.amazonaws.com/0/37903/7adcc9fd-ab30-4089-831d-0a5a9e27210c.png)

[『知識ゼロから学ぶソフトウェアテスト【改訂版】』翔泳社](http://www.shoeisha.co.jp/book/detail/9784798136523)



------------------
## 目次

1. テストとは？
2. ブラックボックステスト
3. ホワイトボックステスト
4. 付録

------------------
# 1. テストとは？


------------------
## ソフトウェアテストの7原則

* テストは「欠陥がある」ことしか示せない
* 全数テストは不可能
* 初期テスト
* 欠陥の偏在
* 殺虫剤のパラドックス
* テストは条件次第
* 「バグゼロ」の落とし穴

※ https://webrage.jp/techblog/7_principles_of_software_testing/ 参考

------------------
## ソフトウェアテストの目指すべき方針

>より少ないテストケースでより多くのプログラムのエラーを検知する

※『知識ゼロから学ぶソフトウェアテスト【改訂版】』P12引用

------------------
## Myersの三角形問題

テスト能力診断テスト。
下記のプログラムをテストするのに十分なテストケースは？

>このプログラムは入力ダイアログから3つの整数を読む。
この3つの値は、それぞれ三角形の3辺の長さをあらわすものとする。
プログラムは、三角形が不等辺三角形、二等辺三角形、正三角形のうちどれであるかを示すメッセージを表示する。

※ http://olroyko.github.io/triangle_test_design/ 参考
※ http://rejoice.jugem.jp/?eid=21 参考


------------------
## テストは難しい？

>* テストケースを書くことはプログラムを書くことより実際は難しいものなのです。
>* よく「テストなぞ新人にやらせておけ」とか、「プログラムができない人のやる仕事だ」などと耳にしますがとんでもありません。

※『知識ゼロから学ぶソフトウェアテスト【改訂版】』P16引用

[私見]プログラム開発とは異なった頭の使い方をします。



------------------
# ホワイトボックステスト

------------------
## ホワイトボックステストとは？

>ホワイトボックステストとは、システム内部の構造を理解した上でそれら一つ一つが意図した通りに動作しているかを確認する、プログラムのテスト方法。

※ [IT用語辞典](http://e-words.jp/w/%E3%83%9B%E3%83%AF%E3%82%A4%E3%83%88%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%83%86%E3%82%B9%E3%83%88.html)  引用

* ソフトウェアの仕様が間違っていることから起こるバグは発見できない


------------------
# ホワイトボックステストの種類

* 命令網羅(statement coverage)（C0）
* 分岐網羅(branch coverage)（C1）
* 条件網羅(condition coverage)（C2）

※ http://www.itmedia.co.jp/im/articles/1111/07/news143.html 参考

[私見]分岐網羅が一般的？(根拠なし）



------------------
## カバレッジテストで検出できないバグ

* プログラムのループ
    - ループが1回目や最後で起こるバグは発見できる？
* 要求仕様自体の誤りや機能が備わっていないバグ    
* データに関するバグ
* マルチタスクや割り込みに関するバグ


------------------
### [補足][私見] ループに関するバグ

ループカウンタを使ったループは、バグになりやすい。

```java
for (int i=0; i<list.length; i++) {
   int elm = list[i];
   //...
}   
```

* `int i=0;`の誤り
* `i<list.length;`の誤り
* `i++`の誤り
* `int elm = list[i];`の誤り

iteratorを使えば、バグになりにくい。

```java
for (int elm : list) {
   //...
}   
```

品質を高めるには、コードからも攻める必要がある。


------------------
# ブラックボックステスト

------------------
## ブラックボックステストとは？

>ブラックボックステストとは、システムの内部構造とは無関係に、外部から見た機能を検証するプログラムのテスト方法

※ [IT用語辞典](http://e-words.jp/w/%E3%83%96%E3%83%A9%E3%83%83%E3%82%AF%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%83%86%E3%82%B9%E3%83%88.html) 引用

------------------
## 同値分割

>同値分割法とは，仕様からデータを“⁠意味のあるグループ⁠”（同値クラス）に分類し，各グループから代表値を選ぶ技法です。

※ http://gihyo.jp/dev/serial/01/tech_station/0004 引用

>代表値の選び方には明確なルールはありませんが，「⁠この値でテストが通ればその同値クラスは全部OK」と言えるような値を選ぶべきで，それは同値クラスの範囲内でも端のほうにある値よりは，真ん中付近にある値を使うのが確実でしょう。

------------------
## 境界値分析

>境界値分析とは，同値クラスの間の境界の値（境界値）をテストデータとして選択する技法です。

※ http://gihyo.jp/dev/serial/01/tech_station/0004 引用

経験上、境界値付近でバグが起こりやすい

テストは。異なる処理が行われる一番近い二点を選ぶ

------------------
### 境界値でバグになる要因

```java
if (a >= 1) {
  //正常処理
} else {
  //エラー処理
}
```

* 演算子の間違い（`>`と`>=`の間違い）
* 数字の間違い(`a >= 2`)
* elseがない
* 余分な境界を付けてしまう (`if (a >= 1 &&  a< 10)`)

※『知識ゼロから学ぶソフトウェアテスト【改訂版】』P61参考


------------------
## エラー推測テスト
経験や直観から起こりそうなエラーを推測して、バグを発見するための入力値を挙げる方法。

以下、エラーの例。

* 数値ゼロ
* null参照
* 空リスト
* うるう年

※ https://webrage.jp/techblog/testing_by_experience/ 参考


------------------
## ホワイトボックステストとブラックボックステストは両方やるのか？

### 理想論
1. ホワイトボックステストを実施
2. ブラックボックスボックステストを実施
⇒ 非効率

### 現実論
1. ブラックボックスをメインに実施
2. カバレッジ率を測定
3. カバレッジ率が100％になるためのテスト項目を追加

### カバレッジ率が100%にならない原因
* 単体テスト環境ではテストできない
* 仕様にないロジックがコーディングされている

※『ソフトウェアテスト入門　押さえておきたい<<要点・重点>>』P80 参考
 

---------
# 付録

---------
## 参考サイト＆情報

* JSTQB認定テスト技術者資格
* https://webrage.jp/techblog/