Autotest.mkはソフトウェアテスト自動化のための、GNU Makeを利用したフレームワークです。何回かmakeコマンドを実行し、コマンドファイルとテスト結果の想定をあらわすファイルを作成すれば、テストの準備は完了です。あとはmakeコマンドを1回実行すれば、テストを実行できます。テストが実行されると、詳細なログが出力されます。
Autotest.mkの特徴は次のとおりです。
Autotest.mkは、LinuxやMac OS Xなどで動作します。現在動作を確認しているのは、次のディストリビューションです。
ダウンロードが完了したら、opensslとdiffで正しくファイルがダウンロードができているかを検証します。
$ openssl md5 autotest_mk.tar.gz | diff -s autotest_mk.tar.gz.md5sum - Files autotest_mk.tar.gz.md5sum and - are identical
autotest_mkファイルをダウンロードしたら、展開先のディレクトリーに移動してから、展開します。 次のコマンドでは、現在ログインしているユーザーのホームディレクトリーに展開します。
$ cd ~ $ tar xvzf autotest_mk.tar.gz
展開したら、Autotest.mkは使えるようになります。多くのプログラムをインストールするときに必要なコンパイルやビルド、システムディレクトリーへのインストール(./configureやmake、make install)は必要ありません。
Autotest.mkでテストを実行するときは、次の3つのディレクトリーを使います。
テストグループとテストのテンプレートとなるディレクトリー
1つまたは複数のテストを含むディレクトリー
テスト実行のためのファイルと、実行結果をあらわすファイルを含むディレクトリー
ここでは、Glenford J Myers『ソフトウェア・テストの技法』(近代科学社、1980)の記載を元にした、次の仕様の三角形判定プログラムをテストする手順を取り上げます1。
プログラムtriangleは、整数をあらわす3つの引数をとる。この3つの値は、それぞれ三角形の3辺の長さをあらわすものとする。プログラムは、三角形が不等辺三角形の場合は‘scalene triangle’、二等辺三角形の場合は‘isosceles triangle’、正三角形の場合は‘equilateral triangle’を印字する。
この三角形判定プログラムの動作を検証するには、次のテスト・ケースが必要です2。
- 有効な不等辺三角形をあらわすテスト・ケース
- 有効な正三角形をあらわすテスト・ケース
- 有効な二等辺三角形をあらわすテスト・ケース
- 有効な二等辺三角形で2つの等辺を含む3種類の組合せすべてをためすことができる3つのテスト・ケース
- 1つの辺がゼロの値をもつテスト・ケース
- 1つの辺が負の値をしめすテスト・ケース
- ゼロより大きい3つの整数をもち、そのうち2つの和がそれ以外の1つと等しいようなテスト・ケース
- 1辺の長さが他の2辺の長さの和に等しいことを3種類の順列のすべてに対してためすことのできるテスト・ケース
- ゼロより大きな3つの整数のうち、2つの数の和がそれ以外の1つの数より小さくなるテスト・ケース
- ゼロより大きな3つの整数のうち、2つの数の和がそれ以外の1つの数より小さくなることにおいて、3種類の順列すべてを考慮することのできるテスト・ケース
- すべての辺がゼロであるテスト・ケース
- 整数でない値をもつテスト・ケース
- 数値の個数が間違っていることをためすテスト・ケース
三角形判定プログラムは、サンプルとして用意されているものを準備するか、または自作してください。
準備ができたら、Autotest.mkを使った次の手順でテストを実行できます。
まず、Autotest.mkのパッケージに含まれているsample/triangle以下のファイルを、任意の作業用ディレクトリーにコピーします。ここでは、~/triangle(~は、現在ログインしているユーザーのホームディレクトリー)を作業用ディレクトリーにします。また、autotest.mkは、~に展開されているものとします。
$ cd $ mkdir triangle $ cd autotest.mk/sample/triangle $ cp triangle.c triangle_bug.c Makefile ~/triangle
作業用ディレクトリーに移動し、中のファイルを確認します。
$ cd ~/triangle $ ls Makefile triangle.c triangle_bug.c
三角形判定プログラムをビルドします。
$ make rm -f triangle gcc -o triangle triangle.c
テストもかねて、三角形判定プログラムを手動で実行します。
$ ./triangle 3 4 5 scalene triangle $ ./triangle 4 4 4 equilateral triangle $ ./triangle 2 4 4 isosceles triangle
バグを含み一部のテストに失敗する三角形判定プログラムをビルドする場合は、次のコマンドを実行します。
$ make bug rm -f triangle gcc -o triangle triangle.c
テストもかねて、三角形判定プログラムを手動で実行します。
$ ./triangle 3 4 5 futohen sankakukei $ ./triangle 4 4 4 equilateral triangle $ ./triangle 2 4 4 isosceles triangle
./triangle 3 4 5で、仕様で‘scalene triangle’となるべきところが、‘futohen sankakukei’となっています。
テンプレートディレクトリーでmakeを実行し、グループディレクトリーを作成します。このとき、テストグループのディレクトリーを変数GROUPDIR
で指定します。ここでは、~/triangle/testをテストグループのディレクトリーにします。
$ cd ~/autotest.mk/template $ make GROUPDIR=~/triangle/test
次のコマンドでグループディレクトリーに移動し、その中を確認します。
$ cd ~/triangle/test $ ls Define.mk Makefile Test.mk
グループディレクトリーでmake createを実行し、テストディレクトリーを作成します。このとき、変数TEST
でテスト名を指定します。テスト名は、小文字のアルファベットと数字で指定します。ここでは、1つめのテスト・ケースに対応するテストディレクトリーを、01_scaleneという名前で作成します。
$ make create TEST=01_scalene
次のコマンドでテストディレクトリーに移動し、その中を確認します。
$ cd 01_scalene $ ls Makefile
テスト説明ファイルdesc.txtはテストに関する説明をあらわし、テストの結果と一緒にログに出力されます。 desc.txtをテキストエディターを使って次の内容で作成します。
有効な不等辺三角形をあらわすテスト・ケース
テストコマンドファイルcmdは、テスト時に実行されるコマンドをあらわします。 このコマンドにより、標準出力とエラー出力にテストの結果が出力されるようにします。
ここでは、cmdをテキストエディターを使って次の内容で作成します。
../../triangle 3 4 5
テスト想定ファイル0.txtは、テストが正しく実行された場合の結果をあらわします。0.txtの作成方法は、次の3つがあります。
エラーが発生するテストでは、標準出力想定の下にエラー出力想定を続けます。
テスト想定ファイル0.txtをテキストエディターを使って次の内容で作成します。
scalene triangle
make setを実行すると、コマンドファイルcmdが実行されます。実行結果は0.txtファイルに出力され、その内容が表示されます。
$ make set scalene triangle
この方法で0.txtを作成する場合は、作成された内容がテスト想定として本当に正しいかよく検討する必要があります。例えば、バグを含む三角形判定プログラムを準備してmake setを実行すると、仕様と異なる次のようなテスト想定となり、テストを正しく実行できません。
$ make set futohen sankakukei
0.txtがすでに存在する場合はmake setを実行するとエラーになり、0.txtは更新されません。
0.txtがすでに存在する場合は、make resetで更新できます。
$ make reset scalene triangle
コマンドファイルとテスト想定を用意したら、makeまたはmake checkでテストを実行できます。
$ ls 0.txt Makefile cmd desc.txt $ make 有効な不等辺三角形をあらわすテスト・ケース 01_scalene: Test Success 2011-01-10 10:09:55 Detail in /home/foo/triangle/test/01_scalene/detail.log
表示される項目は、次のとおりです。
正しいテスト想定を作成していた場合にバグを含む三角形判定プログラムでテストを実行すると、次のように表示されます。
$ make make: [diff.log] Error 1 (ignored) 有効な不等辺三角形をあらわすテスト・ケース 01_scalene: Test Failure 2011-01-10 20:25:16 Detail in /home/foo/triangle/test/01_scalene/detail.log
テストを実行して作成されたファイルを確認します。1.txt summary.log detail.logが作成されています。
$ ls 0.txt 1.txt Makefile cmd desc.txt detail.log summary.log
テストを実行すると作成されるファイルは、次のとおりです。必要に応じてファイルの内容を確認します。
テスト結果をあらわします。エラー発生時は、標準出力のあとにエラー出力が続きます
エラー発生時に、エラーが出力されます。エラーが発生しない場合は作成されません
テスト想定ファイル0.txtとテスト結果ファイル1.txtの差分をあらわします。想定と結果が同一の場合は、作成されません
テストの実行結果を表します。テスト実行時に表示される項目です。
テストの詳細ログを表します。上記の内容がすべて出力されます
detail.logは、次のようになります。
== summary.log == ---------------------------------------------------------------------- 有効な不等辺三角形をあらわすテスト・ケース 01_scalene: Test Success 2011-01-10 10:09:55 Detail in /home/foo/triangle/test/01_scalene/detail.log ---------------------------------------------------------------------- == cmd == ---------------------------------------------------------------------- ../../triangle 3 4 5 ---------------------------------------------------------------------- == 0.txt == ---------------------------------------------------------------------- scalene triangle ---------------------------------------------------------------------- == 1.txt == ---------------------------------------------------------------------- scalene triangle ----------------------------------------------------------------------
バグを含む三角形判定プログラムを準備してテストを実行した場合、1.txt summary.log detail.logのほかに、テスト想定とテスト結果が異なるためdiff.logが作成されます。
$ ls 0.txt 1.txt Makefile cmd desc.txt detail.log diff.log summary.log
detail.logは次のようになります。
== summary.log == ---------------------------------------------------------------------- 有効な不等辺三角形をあらわすテスト・ケース 01_scalene: Test Failure 2011-01-10 20:25:16 Detail in /home/foo/triangle/test/01_scalene/detail.log ---------------------------------------------------------------------- == cmd == ---------------------------------------------------------------------- ../../triangle 3 4 5 ---------------------------------------------------------------------- == 0.txt == ---------------------------------------------------------------------- scalene triangle ---------------------------------------------------------------------- == diff.log == ---------------------------------------------------------------------- *** 0.txt Mon Jan 10 20:12:14 2011 --- 1.txt Mon Jan 10 20:25:16 2011 *************** *** 1 **** ! scalene triangle --- 1 ---- ! futohen sankakukei ---------------------------------------------------------------------- == 1.txt == ---------------------------------------------------------------------- futohen sankakukei ----------------------------------------------------------------------
make cleanを実行すると、テストの結果作成されたファイルがクリアされます。
$ make clean $ ls 0.txt Makefile cmd desc.txt
2つめ以降のテスト・ケースについても、1つめと同じ手順でテストディレクトリーの作成後、テスト説明ファイルとテストコマンドファイル、テスト想定ファイルを作成します。
ここでは、先に作成した01_scaleneも含めて、次のようなディレクトリーとファイルを作成します。こうしたディレクトリーやファイルはAutotest.mkのsample/triangle/test以下にあります。
テストグループディレクトリーでは、makeまたはmake checkで複数のテストをまとめて実行できます。
$ cd ~/triangle/test $ make test: 13 / 13 tests passed. Detail in /home/foo/triangle/test/TEST.log test: All tests are succeded.
表示されるのは、次の項目です。
バグを含む三角形判定プログラムを準備してテストグループを実行した場合、次のように表示されます。失敗したテストがあることをあらわしています。
$ cd ~/triangle/test $ make test: 11 / 13 tests passed. Detail in /home/foo/triangle/test/TEST.log
テストグループを実行すると作成されるファイルは、次のとおりです。
テストグループに含まれるテストとその実行結果の一覧をあらわします。
テストの実行結果を表します。テストグループ実行時に表示される内容です。
ここではテストグループ名はtestなので、TEST.logが次の内容で作成されます。
01_scalene/ 有効な不等辺三角形をあらわすテスト・ケース 01_scalene: Test Success 2011-01-10 12:14:23 Detail in /home/foo/triangle/test/01_scalene/detail.log 12_notint/ 整数でない値をもつテスト・ケース 12_notint: Test Success 2011-01-10 12:14:23 Detail in /home/foo/triangle/test/12_notint/detail.log 03_isosceles/ 有効な二等辺三角形をあらわすテスト・ケース 03_isosceles: Test Success 2011-01-10 12:14:23 Detail in /home/foo/triangle/test/03_isosceles/detail.log 02_equilateral/ 有効な正三角形をあらわすテスト・ケース 02_equilateral: Test Success 2011-01-10 12:14:23 Detail in /home/foo/triangle/test/02_equilateral/detail.log 05_zero/ 1つの辺がゼロの値をもつテスト・ケース 05_zero: Test Success 2011-01-10 12:14:23 Detail in /home/foo/triangle/test/05_zero/detail.log 13_argcnt/ 数値の個数が間違っていることをためすテスト・ケース 13_argcnt: Test Success 2011-01-10 12:14:23 Detail in /home/foo/triangle/test/13_argcnt/detail.log 10_lesses/ ゼロより大きな3つの整数のうち、2つの数の和がそれ以外の1つの数より小さくなることにおいて、3種類の順列すべてを考慮することのできるテストケース 10_lesses: Test Success 2011-01-10 12:14:23 Detail in /home/foo/triangle/test/10_lesses/detail.log 07_line/ ゼロより大きい3つの整数をもち、そのうち2つの和がそれ以外の1つと等しいようなテスト・ケース 07_line: Test Success 2011-01-10 12:14:23 Detail in /home/foo/triangle/test/07_line/detail.log 06_minus/ 1つの辺が負の値をしめすテスト・ケース 06_minus: Test Success 2011-01-10 12:14:23 Detail in /home/foo/triangle/test/06_minus/detail.log 11_zeroall/ すべての辺がゼロであるテスト・ケース 11_zeroall: Test Success 2011-01-10 12:14:24 Detail in /home/foo/triangle/test/11_zeroall/detail.log 08_lines/ 1辺の長さが他の2辺の長さの和に等しいことを3種類の順列のすべてに対してためすことのできるテスト・ケース 08_lines: Test Success 2011-01-10 12:14:24 Detail in /home/foo/triangle/test/08_lines/detail.log 09_less/ ゼロより大きな3つの整数のうち、2つの数の和がそれ以外の1つの数より小さくなるテストケース 09_less: Test Success 2011-01-10 12:14:24 Detail in /home/foo/triangle/test/09_less/detail.log 04_isosceles_c/ 有効な二等辺三角形で2つの等辺を含む3種類の組合せすべてをためすことができる3つのテストケース 04_isosceles_c: Test Success 2011-01-10 12:14:24 Detail in /home/foo/triangle/test/04_isosceles_c/detail.log
テストをまとめて実行した場合も、個別のテストを実行した場合と同様に、テストディレクトリーにテストログが出力されます。特定のテスト結果を詳細に検討する場合は、そのテストのテストディレクトリーを開いてテストログファイルの確認をします。
バグを含む三角形判定プログラムを準備してテストグループを実行した場合、TEST.logは次のように表示されます。01_scaleneのほか、11_zeroのテストで失敗しています。すべての辺がゼロである場合に表示が正しくないバグがあることがわかります。
01_scalene/ 有効な不等辺三角形をあらわすテスト・ケース 01_scalene: Test Failure 2011-01-10 21:45:52 Detail in /home/foo/triangle/test/01_scalene/detail.log 12_notint/ 整数でない値をもつテスト・ケース 12_notint: Test Success 2011-01-10 21:45:52 Detail in /home/foo/triangle/test/12_notint/detail.log 03_isosceles/ 有効な二等辺三角形をあらわすテスト・ケース 03_isosceles: Test Success 2011-01-10 21:45:52 Detail in /home/foo/triangle/test/03_isosceles/detail.log 02_equilateral/ 有効な正三角形をあらわすテスト・ケース 02_equilateral: Test Success 2011-01-10 21:45:53 Detail in /home/foo/triangle/test/02_equilateral/detail.log 05_zero/ 1つの辺がゼロの値をもつテスト・ケース 05_zero: Test Failure 2011-01-10 21:45:53 Detail in /home/foo/triangle/test/05_zero/detail.log 13_argcnt/ 数値の個数が間違っていることをためすテスト・ケース 13_argcnt: Test Success 2011-01-10 21:45:53 Detail in /home/foo/triangle/test/13_argcnt/detail.log 10_lesses/ ゼロより大きな3つの整数のうち、2つの数の和がそれ以外の1つの数より小さくなることにおいて、3種類の順列すべてを考慮することのできるテストケース 10_lesses: Test Success 2011-01-10 21:45:53 Detail in /home/foo/triangle/test/10_lesses/detail.log 07_line/ ゼロより大きい3つの整数をもち、そのうち2つの和がそれ以外の1つと等しいようなテスト・ケース 07_line: Test Success 2011-01-10 21:45:53 Detail in /home/foo/triangle/test/07_line/detail.log 06_minus/ 1つの辺が負の値をしめすテスト・ケース 06_minus: Test Success 2011-01-10 21:45:53 Detail in /home/foo/triangle/test/06_minus/detail.log 11_zeroall/ すべての辺がゼロであるテスト・ケース 11_zeroall: Test Failure 2011-01-10 21:45:53 Detail in /home/foo/triangle/test/11_zeroall/detail.log 08_lines/ 1辺の長さが他の2辺の長さの和に等しいことを3種類の順列のすべてに対してためすことのできるテスト・ケース 08_lines: Test Success 2011-01-10 21:45:53 Detail in /home/foo/triangle/test/08_lines/detail.log 09_less/ ゼロより大きな3つの整数のうち、2つの数の和がそれ以外の1つの数より小さくなるテストケース 09_less: Test Success 2011-01-10 21:45:53 Detail in /home/foo/triangle/test/09_less/detail.log 04_isosceles_c/ 有効な二等辺三角形で2つの等辺を含む3種類の組合せすべてをためすことができる3つのテストケース 04_isosceles_c: Test Success 2011-01-10 21:45:53 Detail in /home/foo/triangle/test/04_isosceles_c/detail.log
三角形判定プログラムでは、~/triangleなど作業用ディレクトリーのトップでmakeを実行すればプログラムをビルドできました。作業用ディレクトリーのMakefileを次のように編集すると、ビルドと連携してテストを実行できるようになります。
CC = gcc .PHONY: all check clean all: $(CC) -o triangle triangle.c check: $(MAKE) -c test clean: rm -f triangle
ビルドとテストは、次のように実行します。
$ make gcc -o triangle triangle.c $ make check make -C test test: 13 / 13 tests passed. Detail in /home/foo/triangle/test/TEST.log test: All tests are succeded.
こうした設定をしておけば、プログラムを変更するたびに簡単にビルドとテストを実行することができます。
sort
関数のテストここではC言語の関数テストの例として、sort
関数をテストします。CUnitのわかりやすい日本語チュートリアルCUnit チュートリアルで使われている関数です。
sort_normal.cは、次の内容です。
void sort(int array[], int num) { int i; int j; int val; for(i=0; i<(num-1); i++) { for(j=(num-1); j>i; j--) { if (array[j-1] > array[j]) { val = array[j]; array[j] = array[j-1]; array[j-1] = val; } } } }
バグを含むsort_bug.cは、次の内容です。
void sort(int array[], int num) { int i; int j; int val; for(i=0; i<(num-1); i++) { for(j=(num-1); j>i; j--) { if (array[j-1] > array[j]) { val = array[j]; array[j] = array[j]; /* 本当は array[j] = array[j-1]; */ array[j-1] = val; } } } }
プログラムは、サンプルとして用意されているものを準備してください。
準備ができたら、Autotest.mkを使った次の手順でテストを実行できます。
まず、Autotest.mkのパッケージに含まれているsample/sort以下のファイルを、任意の作業用ディレクトリーにコピーします。ここでは、~/sort(~は、現在ログインしているユーザーのホームディレクトリー)を作業用ディレクトリーにします。また、autotest.mkは、~に展開されているものとします。
$ cd $ mkdir sort $ cd autotest.mk/sample/sort $ cp sort_normal.c sort_bug.c Makefile ~/sort
作業用ディレクトリーに移動し、中のファイルを確認します。
$ cd ~/sort $ ls Makefile sort_normal.c sort_bug.c
sort
関数ファイルの準備makeまたはmake normalで、sort_normal.cがsort.cにコピーされます。
$ make rm -f sort.c cp sort_normal.c sort.c
sort
関数ファイルの準備make bugで、sort_bug.cがsort.cにコピーされます。 この場合、sort.cはバグを含みます。
$ make bug rm -f sort.c cp sort_bug.c sort.c
テンプレートディレクトリーでmakeを実行し、グループディレクトリーを作成します。このとき、テストグループのディレクトリーを変数GROUPDIR
で指定します。ここでは、~/sort/testをテストグループのディレクトリーにします。
$ cd ~/autotest.mk/template $ make GROUPDIR=~/sort/test
次のコマンドでグループディレクトリーに移動し、その中を確認します。
$ cd ~/sort/test $ ls Define.mk Makefile Test.mk
グループディレクトリーでmake createを実行し、テストディレクトリーを作成します。このとき、変数GROUPDIR
でテスト名を指定し、さらにC言語の関数テスト用のMakefile
を作成するため変数SRC=c
を指定します。ここでは、1つめのテストをsort_001という名前で作成します3。
$ make create TEST=sort_001 SRC=c
次のコマンドでテストディレクトリーに移動し、その中を確認します。
$ cd sort_001 $ ls Makefile
C言語の関数をテストするためのプログラムをC言語で記述した、プログラムのソースファイルcmd.cをテキストエディターで作成します。テスト対象の関数sort
を呼び出してソートを実行し、その結果を表示するプログラムです。
#include <stdio.h> #ifndef ARRAYSIZE #define ARRAYSIZE(array) (sizeof(array)/sizeof(array[0])) #endif void sort(int array[], int num); int main() { int i, array[] = {11, 7, 5, 3, 2}; sort(array, ARRAYSIZE(array)); for(i = 0; i < ARRAYSIZE(array); i++) { printf("%d\n", array[i]); } return 0; }
Makefileをテキストエディターで編集し、テスト対象ファイルをあらわす変数TESTTARGET_FILES
を指定します。
ここでは、../../sort.cを指定します。
include ../Define.mk include ../Test.mk CC := gcc CFLAGS := -Wall .INTERMEDIATE: $(CMD_FILE) CMDSRC_FILE := cmd.c TESTTARGET_FILES := ../../sort.c # Set test target files COMPILE_FILE := compile.log $(CMD_FILE): $(CMDSRC_FILE) $(TESTTARGET_FILES) $(CC) $(CFLAGS) -o $ $^ >$(COMPILE_FILE) 2>&1 cat $(COMPILE_FILE)
テスト説明ファイルdesc.txtはテストに関する説明をあらわし、テストの結果と一緒にログに出力されます。 desc.txtをテキストエディターを使って次の内容で作成します。
テスト関数1
テスト想定ファイル0.txtは、テストが正しく実行された場合の結果をあらわします。0.txtの作成方法は、次の3つがあります。
エラーが発生するテストでは、標準出力想定の下にエラー出力想定を続けます。
テスト想定ファイル0.txtをテキストエディターを使って次の内容で作成します。
3
make setを実行すると、Makefileの設定に従い関数テスト用のプログラムソースcmd.cと関数ファイル../../sort.cからコマンドファイルcmdが作成されます。そのあとcmdが実行され、実行結果は0.txtファイルに出力されます。実行後、次回のテストのため、cmdは自動的に削除されます。
$ make set gcc -Wall -o cmd cmd.c ../../sort.c 2 3 5 7 11 rm cmd
この方法で0.txtを作成する場合は、作成された内容がテスト想定として本当に正しいかよく検討する必要があります。
0.txtがすでに存在する場合はmake setを実行するとエラーになり、0.txtは更新されません。例えば、バグを含むsort
関数ファイルを準備してmake setを実行すると、仕様と異なる次のようなテスト想定となり、テストを正しく実行できません。
$ make set gcc -Wall -o cmd cmd.c ../../sort.c 2 2 2 2 2 rm cmd
0.txtがすでに存在する場合は、make resetで更新できます。
$ make reset gcc -Wall -o cmd cmd.c ../../sort.c 2 3 5 7 11 rm cmd
コマンドファイルとテスト想定を用意したら、makeまたはmake checkでテストを実行できます。
$ ls 0.txt Makefile cmd.c desc.txt $ make sort_001: Test Success 2011-01-24 11:13:04 Details in /home/foo/sort/test/sort_001/detail.log rm cmd
表示される項目は、次のとおりです。
sort
関数の場合正しいテスト想定を作成していた場合にバグを含むsort
関数でテストを実行すると、次のように表示されます。
$ make gcc -Wall -o cmd cmd.c ../../sort.c make: [diff.log] Error 1 (ignored) テスト関数1 sort_001: Test Failure 2011-01-24 11:09:34 Details in /home/foo/sort/test/sort_001/detail.log rm cmd
テストを実行して作成されたファイルを確認します。1.txt summary.log detail.logが作成されています。
$ ls 0.txt 1.txt Makefile cmd desc.txt detail.log summary.log
テストを実行すると作成されるファイルは、次のとおりです。必要に応じてファイルの内容を確認します。
テスト結果をあらわします。エラー発生時は、標準出力のあとにエラー出力が続きます
エラー発生時に、エラーが出力されます。エラーが発生しない場合は作成されません
テスト想定ファイル0.txtとテスト結果ファイル1.txtの差分をあらわします。想定と結果が同一の場合は、作成されません
テストの実行結果を表します。テスト実行時に表示される項目です。
テストの詳細ログを表します。上記の内容がすべて出力されます
detail.logは、次のようになります。
== summary.log == ---------------------------------------------------------------------- テスト関数1 sort_001: Test Success 2011-01-24 11:13:04 Details in /Users/kazubito/2011_01/sort/test/sort_001/detail.log ---------------------------------------------------------------------- == cmd.c == ---------------------------------------------------------------------- #include <stdio.h> #ifndef ARRAYSIZE #define ARRAYSIZE(array) (sizeof(array)/sizeof(array[0])) #endif void sort(int array[], int num); int main() { int i, array[] = {11, 7, 5, 3, 2}; sort(array, ARRAYSIZE(array)); for(i = 0; i < ARRAYSIZE(array); i++) { printf("%d\n", array[i]); } return 0; } ---------------------------------------------------------------------- == 0.txt == ---------------------------------------------------------------------- 2 3 5 7 11 ---------------------------------------------------------------------- == 1.txt == ---------------------------------------------------------------------- 2 3 5 7 11 ----------------------------------------------------------------------
sort
関数の場合バグを含むsort
関数を準備してテストを実行した場合、1.txt summary.log detail.logのほかに、テスト想定とテスト結果が異なるためdiff.logが作成されます。
$ ls 0.txt 1.txt Makefile cmd desc.txt detail.log diff.log summary.log
detail.logは次のようになります。
== summary.log == ---------------------------------------------------------------------- テスト関数1 sort_001: Test Failure 2011-01-24 11:09:34 Details in /home/foo/sort/test/sort_001/detail.log ---------------------------------------------------------------------- == cmd.c == ---------------------------------------------------------------------- #include <stdio.h> #ifndef ARRAYSIZE #define ARRAYSIZE(array) (sizeof(array)/sizeof(array[0])) #endif void sort(int array[], int num); int main() { int i, array[] = {11, 7, 5, 3, 2}; sort(array, ARRAYSIZE(array)); for(i = 0; i < ARRAYSIZE(array); i++) { printf("%d\n", array[i]); } return 0; } ---------------------------------------------------------------------- == 0.txt == ---------------------------------------------------------------------- 2 3 5 7 11 ---------------------------------------------------------------------- == diff.log == ---------------------------------------------------------------------- *** 0.txt 2011-01-24 11:07:39.000000000 +0900 --- 1.txt 2011-01-24 11:09:34.000000000 +0900 *************** *** 1,5 **** 2 ! 3 ! 5 ! 7 ! 11 --- 1,5 ---- 2 ! 2 ! 2 ! 2 ! 2 ---------------------------------------------------------------------- == 1.txt == ---------------------------------------------------------------------- 2 2 2 2 2 ----------------------------------------------------------------------
make cleanを実行すると、テストの結果作成されたファイルがクリアされます。
$ make clean $ ls 0.txt Makefile cmd.c desc.txt
2つめ以降のテスト・ケースについても、1つめと同じ手順でテストディレクトリーの作成後、テスト説明ファイルとテストコマンドファイル、テスト想定ファイルを作成します。
ここでは、先に作成したsort_001も含めて、次のようなディレクトリーとファイルを作成します。こうしたディレクトリーやファイルはAutotest.mkのsample/sort/test以下にあります。
テストグループディレクトリーでは、makeまたはmake checkで複数のテストをまとめて実行できます。
$ cd ~/sort/test $ make test: 5 / 5 tests passed. Details in /home/foo/sort/test/TEST.log test: All tests are succeded.
表示されるのは、次の項目です。
sort
関数の場合バグを含むsort
関数を準備してテストグループを実行した場合、次のように表示されます。失敗したテストがあることをあらわしています。
$ cd ~/sort/test $ make test: 1 / 5 tests passed. Details in /home/foo/sort/test/TEST.log
テストグループを実行すると作成されるファイルは、次のとおりです。
テストグループに含まれるテストとその実行結果の一覧をあらわします。
テストの実行結果を表します。テストグループ実行時に表示される内容です。
ここではテストグループ名はtestなので、TEST.logが次の内容で作成されます。
sort_001/ テスト関数1 sort_001: Test Success 2011-01-24 11:37:46 Details in /home/foo/sort/test/sort_001/detail.log sort_002/ テスト関数1 sort_002: Test Success 2011-01-24 11:37:46 Details in /home/foo/sort/test/sort_002/detail.log sort_003/ テスト関数3 sort_003: Test Success 2011-01-24 11:37:46 Details in /home/foo/sort/test/sort_003/detail.log sort_004/ テスト関数4 sort_004: Test Success 2011-01-24 11:37:46 Details in /home/foo/sort/test/sort_004/detail.log sort_005/ テスト関数5 sort_005: Test Success 2011-01-24 11:37:47 Details in /home/foo/sort/test/sort_005/detail.log
テストをまとめて実行した場合も、個別のテストを実行した場合と同様に、テストディレクトリーにテストログが出力されます。特定のテスト結果を詳細に検討する場合は、そのテストのテストディレクトリーを開いてテストログファイルの確認をします。
sort
関数の場合バグを含むsort
関数を準備してテストグループを実行した場合、TEST.logは次のように表示されます。sort_001、sort_003、sort_004、sort_005のテストで失敗していることがわかります。
sort_001/ テスト関数1 sort_001: Test Failure 2011-01-24 12:03:02 Details in /home/foo/sort/test/sort_001/detail.log sort_002/ テスト関数1 sort_002: Test Success 2011-01-24 12:03:02 Details in /home/foo/sort/test/sort_002/detail.log sort_003/ テスト関数3 sort_003: Test Failure 2011-01-24 12:03:02 Details in /home/foo/sort/test/sort_003/detail.log sort_004/ テスト関数4 sort_004: Test Failure 2011-01-24 12:03:02 Details in /home/foo/sort/test/sort_004/detail.log sort_005/ テスト関数5 sort_005: Test Failure 2011-01-24 12:03:04 Details in /home/foo/sort/test/sort_005/detail.log
あとはテスト対象となっている関数を変更するたびに、テストを実行できるようになります。つまり、関数の単位で開発とテストを反復してできます。
関数の実装だけが変更されて仕様が変わっていない場合は、テストグループのディレクトリーでmakeを実行するだけでテストができます。
関数の入力または出力の仕様が変わった場合には、0.txtとcmd.cの変更を検討します。関数のコンパイル方法(依存するファイル)が変わった場合は、Makefileの変更を検討します。
テンプレートディレクトリーは、Autotest.mkをインストールするときに展開により作成されたtemplateディレクトリーです。
変数GROUPDIR
で指定されたディレクトリーをテストグループディレクトリーとして作成し、テストの実行に必要な次のファイルを配置します。
通常、テストに必要なファイルテンプレートディレクトリーからグループディレクトリーにコピーされます。変数LINKMK
を指定した場合は、シンボリックリンクが作成されます。
GROUPDIR
テストディレクトリーを指定します。指定しない場合や既存のディレクトリーを指定した場合は、エラーが発生してテストグループディレクトリーは作成されません。
LINKMK
指定した場合、グループディレクトリーにテストの実行に必要なファイルのシンボリックリンクが作成されます。値は任意です。シンボリックリンクのリンク先は、テンプレートディレクトリーの中です。
グループディレクトリーとして~/triangle/testを作成します。
$ make GROUPDIR=~/triangle/test
テンプレートディレクトリーには、次のファイルが含まれます。
テンプレートディレクトリーのMakefile
グループディレクトリーのMakefile。makeまたはmake groupで、グループディレクトリーにMakefileとして配置されます。
テストディレクトリーから参照されるMakefile。makeまたはmake groupで、グループディレクトリーに配置されます。
テストとテストグループに関する項目を定義したMakefile。makeまたはmake groupで、グループディレクトリーに配置されます。
グループディレクトリーの作成後、グループディレクトリーに移動すると次の操作ができます。
変数TEST
で指定されたディレクトリーをテストディレクトリーとして作成し、ディレクトリーの中にMakefile
を作成します。
テスト名は、小文字のアルファベットと数字で指定します。大文字ではじまる名前を指定した場合、ディレクトリーやMakefile
は作成されるものの、テストグループ実行の対象になりません。
変数SRC=c
を指定した場合は、C言語の関数テスト用のMakefile
が作成されます。
TEST
テストディレクトリー名を指定します。
SRC
値c
を指定すると、C言語の関数テスト用のMakefile
が作成されます。
テストディレクトリーを、01_scalene
という名前で作成します。
$ make create TEST=01_scalene
テスト名を変更したりテストをコピーしたりする場合は、mvやcpなどでテストディレクトリーを移動、コピーします。
テスト名01_scalene
を01
に変更します。
$ mv 01_scalene 01
テスト01
をコピーし、テスト02
を作成します。
$ cp -r 01 02
makeまたはmake checkで、グループ内にあるすべてのテストの実行をし、次の項目を表示します。
テストグループを実行すると次のファイルが作成されます。
テストグループに含まれるテストとその実行結果の一覧をあらわします。
テスト実行結果の概要を表します。テストグループ実行時に表示される内容です。
$ make test: 13 / 13 tests passed. Detail in /home/foo/triangle/test/TEST.log test: All tests are succeded.
make checkallでグループ内にあるすべてのテストを、実行し、計時します。テストグループの実行と同じ項目を表示し、出力されるファイルの種類も同じです。<テストグループ名を大文字にした文字列>.log
には、テストと実行結果に加え、計時結果が一覧として出力されます。
テストの実行と計時は別に行われるため、通常にテストを実行するよりも2倍程度の時間がかかります。
$ make checkall test: 13 / 13 tests passed. Detail in /home/foo/triangle/test/TEST.log test: All tests are succeded.
make cleanで、makeまたはmake checkやmake checkallにより作成されたファイルをすべて削除します。グループディレクトリーのほか、テストディレクトリーのファイルも削除されます。
$ make clean
make timeで、グループ内にあるすべてのテストを計時し、その結果が表示されます。計時結果は、<テストグループ名を大文字にした文字列>_time.logに格納されます。
$ make time 01_scalene/ real 0m0.007s 02_equilateral/ real 0m0.007s 03_isosceles/ real 0m0.007s 04_isosceles_c/ real 0m0.013s 05_zero/ real 0m0.010s 06_minus/ real 0m0.007s 07_line/ real 0m0.008s 08_lines/ real 0m0.024s 09_less/ real 0m0.009s 10_lesses/ real 0m0.024s 11_zeroall/ real 0m0.007s 12_notint/ real 0m0.007s 13_argcnt/ real 0m0.012s
make time-cleanで、make timeにより作成されたテストグループディレクトリーと各テストディレクトリーのファイルをすべて削除します。
$ make time-clean
グループディレクトリーには、テストディレクトリーに加えて、次のファイルが含まれます。
グループディレクトリーのMakefile
テストディレクトリーから参照されるMakefile
テストとテストグループに関する項目を定義したMakefile
makeまたはmake checkやmake checkallを実行したときに作成されます。makeやmake checkの場合は、テストグループに含まれるテストと実行結果の一覧です。make checkallの場合は、テストと実行結果と計時結果の一覧です。
テスト実行結果の概要です。makeまたはmake checkやmake checkallを実行すると作成され、その内容が表示されます。
make setで、テストコマンドcmdが実行され、テスト想定ファイル0.txtが作成されます。また、実行時に0.txtの内容が表示されます。0.txtがすでにある場合は、エラーが発生して0.txtは更新されません。
$ make set scalene triangle
make resetで、テストコマンドcmdが実行され、テスト想定ファイル0.txtを作成されます。また、実行時に0.txtの内容が表示されます。0.txtがすでにある場合、0.txtが更新されます。
$ make reset scalene triangle
makeまたはmake checkで、テストコマンドcmdが実行され、テスト結果ファイル1.txtが作成されます。また、実行時にテストの結果をあらわす次の項目が表示されます。
$ make 有効な不等辺三角形をあらわすテスト・ケース 01_scalene: Test Success 2011-01-10 10:09:55 Detail in /home/foo/triangle/test/01_scalene/detail.log
make cleanで、テストの実行または計時の結果作成された次のファイルが削除されます。
$ make clean $ ls 0.txt Makefile cmd desc.txt
make cleanで次の、テストの想定ファイルとテストの実行または計時の結果作成されたファイルが削除されます。
$ make all-clean $ ls Makefile cmd desc.txt
make timeで、テストを計時しその結果が表示されます。計時結果は、time.logに格納されます。
$ make time real 0m0.006s
make time-cleanで、テストの計時の結果作成された次のファイルが削除されます。
$ make time-clean
テストディレクトリーのMakefile
テスト時に実行されるコマンドをあらわすテストコマンドファイル。手動で作成します。
テストに関する説明をあらわし、テストの結果と一緒にログに出力されます。手動で作成します。
テストが正しく実行された場合の結果をあらわすテスト想定ファイル。エラー発生時は、標準出力のあとにエラー出力を続けます。手動か、make setか、make resetで作成します。
テスト結果をあらわします。エラー発生時は、標準出力のあとにエラー出力が続きます。makeまたはmake checkで作成されます。
テストの想定と結果の差分をあらわす差分ファイル。makeまたはmake checkでテストを実行した結果、想定と差分が異なる場合に作成されます。想定と結果が同じ場合は作成されません。
テストのエラー出力をあらわすエラーファイル。makeまたはmake checkでテストを実行した結果、エラー出力がある場合に作成されます。なお、エラー出力は1.txtにも含まれます。
テスト実行結果の概要です。makeまたはmake checkで作成され、その内容が表示されます。
テスト実行結果の詳細です。summary.log cmd 0.txt err.log diff.log 1.txtの内容がコピーされます。makeまたはmake checkで作成されます。