提供: Japanese Scratch-Wiki

< 利用者:Daikonnbatake

ソフトウェアテスト(デバッグ)とはプログラム中のバグを発見し、改善を行うことでソフトウェアの品質を高める手法である。このページでは効果的なソフトウェアテストの手法とバグを減らす工夫について解説する。

前提知識

デバッグ作業という単語を聞いて「デバッグ作業とは勘を頼りに手探りでバグを探す行為」と捉えられがちであるが、この捉え方は大きな間違いである。ソフトウェアテストとは「ソフトウェアに対して如何にして効率的にバグを発見し、高い品質を保つか」という命題のもと行われる必要があり、そのための準備が非常に重要である。

テストケース

テストケースとは、実際に検証すべき箇所を洗い出してリストアップしたものを指す。例えば、Aという10進数1桁の入力に対して予め決められているデータを出力する関数(カスタムブロック)があった場合、テストケースは以下のようになる。

  1. Aに0が入力されたとき「おはよう」と出力される
  2. Aに1が入力されたとき「こんにちは」と出力される
  3. Aに2が入力されたとき「こんばんは」と出力される




このようにテストケースを作成することでひと目見ただけで「何をどのようにテストすればよいのか」ということを明確に設定することが出来、テスト全体の進捗管理・バグの発見率を向上し、無駄を省くことができるようになる。

ブラックボックステスト

ブラックボックステストとは、プログラムの詳細は考慮せずに入力に対して正しい出力が帰るかのみを確認するテスト手法である。すでにシステムが完成しており、修正用のマスタデータを追加したのみのアップデートなど、プログラムが直接改変されないアップデートを検証する場合や、プログラムの実行速度や効率が重視されないプログラムの場合に用いられる。

ホワイトボックステスト

ブラックボックステストとは逆に、プログラムの内部構造(条件分岐や繰り返しの回数、変数の内容など)すべての要素の入力と出力をチェックするテストである。使われていない変数がプログラム内に含まれている場合はその変数もバグとして対応を進める場合もある。プログラムの実行速度や確実性が求められるプログラムのテストに用いられる。

代表値検査と境界値検査

代表値検査とは、プログラムに対して条件分岐に使われる値を範囲の中から一定の条件で1つ取り出し、それを使用して行うテストである。条件分岐の境目での不具合を検出することは出来ないが、手っ取り早い方法である。
一方で境界値検査とは条件分岐の前後の値で正しい出力が行われるかを確認するため、条件分岐前後の入出力のバグを検出することができる。一般的には境界値検査と代表値検査の両方を行うことが多い。

テストケース作成のコツ

テストケースは被検査対象プログラムに対して網羅的に行う必要があり、網羅率が高くなればなるほどプログラムの信頼性が高まる。これを考慮してテストケースはすべての入出力に対して検査を行うよう作成する必要がある。また、テストケースを実行する際、最初はバグが多く発見されるが、テストケースの消化数とバグの修正作業が進行すればするほどバグ発見率が減り、ある一定の品質に到達したと判断された際にデバッグ作業が完了となる。

デバッグ作業における正確性

デバッグ作業においてテスト結果はけして改ざんしてはならない。もしあなたが第三者のプログラムをブラックボックステストでテストする際、テストケースの期待結果と違う値が出力された場合、その値は何が原因で間違った結果として出力されたか分からないからである。また、自身のプログラムをデバッグする際もテストケースの期待結果と違う値が出力された場合は速やかにバグの原因究明と解消を行う必要がある。また、テストケースを作成する際もプログラムの仕様を理解し、正しいテストケースの作成を心がけるべきである。

バグを産まないプログラミング

バグを最小限に抑えるためにプログラミングを行う段階から気をつけられることはいくつか存在する。このポイントを抑えることでスクリプトの可読性を高め、制作をスムーズに進めるための足がかりとなるだろう。

仕様を作成する

作成したいプログラムは「誰に対してどのように使ってもらうのか」という大まかな所から、「カスタムブロックAとCを組み合わせて機能Rを実装する」といった細かなところまでプログラムの振る舞いをできる限り細かく決めることで、予期せぬ競合が起きづらくなりプログラム全体の制作もスムーズに進めることができるようになる。

変数を使いまわさない

外部との干渉以外の目的でグローバル変数を作ることは良いことではない。同じグローバル変数を別々のスプライトが使用しあうと競合が起こり正しい動作ができなくなる場合があるため、余程のことがない限りはローカル変数を使うことを勧める。また、同じスプライト内の別々のプログラムが同じ変数にアクセスすることもバグの原因となるため、余程の理由がない限りは一つの処理には個別の変数と決めることが良いだろう。

小さく実装する

プログラム全体を「モジュール」と呼ばれる細かいカスタムブロックで構成することで個々の独立性を高め、バグの発生が起こりにくくなる。