\input texinfo    @c -*-texinfo-*-
@c %**start of header
@ifnottex
@documentlanguage ja_JP
@end ifnottex
@setfilename autotest_mk.info
@documentencoding UTF-8
@settitle Autotest.mk - ソフトウェアテストの自動化
@firstparagraphindent insert
@paragraphindent 1
@ifhtml
@exampleindent 0
@end ifhtml
@c %**end of header

@copying
Copyright @copyright{} 2011-2026 j8takagi
@end copying

@dircategory Basics
@direntry
* Autotest.mk: (autotest_mk).
@end direntry

@titlepage
@title Autotest.mk
@subtitle ソフトウェアテスト自動化のための、GNU Makeを利用したフレームワーク
@author j8takagi
@insertcopying
@end titlepage

@node Top, Top
@ifhtml
@top Autotest.mk - ソフトウェアテストの自動化
@end ifhtml

@menu
* About::                       Autotest.mk 概要
* Install::                     Autotest.mk インストール
* Tutorial triangle::           Autotest.mk チュートリアルI - 三角形判定プログラムのテスト
* Tutorial sort::               Autotest.mk チュートリアルII - C言語@code{sort}関数のテスト
* Template dir::                テンプレートディレクトリー マニュアル
* Group dir::                   グループディレクトリー マニュアル
* Test dir::                    テストディレクトリー マニュアル
@end menu

@ifinfo
@detailmenu
 --- The Detailed Node Listing ---

* About::                       Autotest.mk 概要
* Install::                     Autotest.mk インストール
* Tutorial triangle::           Autotest.mk チュートリアルI - 三角形判定プログラムのテスト
* Tutorial sort::               Autotest.mk チュートリアルII - C言語@code{sort}関数のテスト
* Template dir::                テンプレートディレクトリー マニュアル
* Group dir::                   グループディレクトリー マニュアル
* Test dir::                    テストディレクトリー マニュアル

Autotest.mk インストール

* Requirements::                要件
* Download::                    ダウンロード
* Verify::                      検証
* Expand::                      展開
* Dir::                         ディレクトリー

Autotest.mk チュートリアルI - 三角形判定プログラムのテスト

* Tutorial triangle About::     概要
* Prepare triangle::            準備
* Create triangle group::       グループディレクトリーの作成
* Create triangle test::        テストディレクトリーの作成
* Edit triangle desc::          テスト説明ファイルの作成
* Edit triangle cmd::           テストコマンドファイルの作成
* Set triangle test::           テスト想定ファイルの作成
* Execute triangle test::       テストの実行
* Check triangle log::          テストログファイルの確認
* Execute triangle group::      テストグループの実行
* Check triangle group log::    テストグループログファイルの確認
* Associate triangle::          ビルドとの連携

Autotest.mk チュートリアルII - C言語@code{sort}関数のテスト

* Tutorial sort About::         概要
* Prepare sort::                準備
* Create sort group::           グループディレクトリーの作成
* Create sort test::            テストディレクトリーの作成
* Create sort src::             関数テスト用プログラムのソース作成
* Edit sort Makefile::          @file{Makefile}の編集
* Edit sort desc::              テスト説明ファイルの作成
* Set sort test::               テスト想定ファイルの作成
* Execute sort test::           テストの実行
* Check sort log::              テストログファイルの確認
* Execute sort group::          テストグループの実行
* Check sort group log::        テストグループログファイルの確認
* Iteretive::                   開発とテストの反復

テンプレートディレクトリー マニュアル

* make group::                  @kbd{make}または@kbd{make group} - グループディレクトリーの作成
* Template Files::              テンプレートのファイル

グループディレクトリー マニュアル

* make create::                 @kbd{make create} - テストの作成
* Rename and Copy::             テスト名の変更とコピー
* Delete::                      テストの削除
* make check at group::         @kbd{make}または@kbd{make check} - テストグループの実行
* make checkall::               @kbd{make checkall} - グループ内にあるすべてのテストの実行、計時
* make clean at group::         @kbd{make clean} - グループ内にあるすべてのテストで、実行結果をクリア
* make time at group::          @kbd{make time} - グループ内にあるすべてのテストを計時
* make time-clean at group::     @kbd{make time-clean} - グループ内にあるすべてのテストで、計時結果をクリア
* Group Files::                 グループのファイル

テストディレクトリー マニュアル

* make set::                    @kbd{make set} - テスト想定の作成
* make reset::                  @kbd{make reset} - テスト想定の作成または更新
* make check at test::          @kbd{make}または@kbd{make check} - テストの実行
* make clean at test::          @kbd{make clean} - テスト結果のクリア
* make all-clean at test::       @kbd{make all-clean} - テストの想定と結果をクリア
* make time at test::           @kbd{make time} - テストの計時
* make time-clean at test::      @kbd{make time-clean} - テスト計時結果のクリア
* Test Files::                  テストディレクトリーのファイル

@end detailmenu
@end ifinfo

@ifnotinfo
@contents
@end ifnotinfo

@node About, Install, Top, Top
@chapter Autotest.mk 概要
Autotest.mkはソフトウェアテスト自動化のための、GNU Makeを利用したフレームワークです。何回か@kbd{make}コマンドを実行し、コマンドファイルとテスト結果の想定をあらわすファイルを作成すれば、テストの準備は完了です。あとは@kbd{make}コマンドを1回実行すれば、テストを実行できます。テストが実行されると、詳細なログが出力されます。

@section 特徴
Autotest.mkの特徴は次のとおりです。

@itemize
@item
使い方がシンプル

@item
さまざまなプログラムや環境に対応

@item
ビルド作業と連携しやすい

@item
無償で使うことができ、自由に改造できる
@end itemize

@node Install, Tutorial triangle, About, Top
@chapter Autotest.mk インストール

@menu
* Requirements::                要件
* Download::                    ダウンロード
* Verify::                      検証
* Expand::                      展開
* Dir::                         ディレクトリー
@end menu

@node Requirements, Download, Install, Install
@section 要件
Autotest.mkは、LinuxやMac OS Xなどで動作します。現在動作を確認しているのは、次のディストリビューションです。

@itemize @bullet
@item
Ubuntu Linux 10.10

@item
Mac OS X バージョン 10.6.5
@end itemize

@node Download, Verify, Requirements, Install
@section ダウンロード

@uref{http://www.j8takagi.net/autotest_mk/, Autotest.mkのサイト}または@uref{http://github.com/j8takagi/Autotest.mk/downloads/, githubのダウンロードページ}から最新版の@file{tar.gz}ファイルをダウンロードします。

@node Verify, Expand, Download, Install
@section 検証

ダウンロードが完了したら、@kbd{openssl}と@kbd{diff}で正しくファイルがダウンロードができているかを検証します。

@example
$ @kbd{openssl md5 autotest_mk.tar.gz | diff -s autotest_mk.tar.gz.md5sum -}
Files autotest_mk.tar.gz.md5sum and - are identical
@end example

@node Expand, Dir, Verify, Install
@section 展開

@file{autotest_mk}ファイルをダウンロードしたら、展開先のディレクトリーに移動してから、展開します。
次のコマンドでは、現在ログインしているユーザーのホームディレクトリーに展開します。

@example
$ @kbd{cd ~}
$ @kbd{tar xvzf autotest_mk.tar.gz}
@end example

展開したら、Autotest.mkは使えるようになります。多くのプログラムをインストールするときに必要なコンパイルやビルド、システムディレクトリーへのインストール（@kbd{./configure}や@kbd{make}、@kbd{make install}）は必要ありません。

@node Dir,  , Expand, Install
@section ディレクトリー
Autotest.mkでテストを実行するときは、次の3つのディレクトリーを使います。

@table @option
@item テンプレートディレクトリー
テストグループとテストのテンプレートとなるディレクトリー

@item テストグループディレクトリー
1つまたは複数のテストを含むディレクトリー

@item テストディレクトリー
テスト実行のためのファイルと、実行結果をあらわすファイルを含むディレクトリー
@end table

@node Tutorial triangle, Tutorial sort, Install, Top
@chapter Autotest.mk チュートリアルI - 三角形判定プログラムのテスト

@menu
* Tutorial triangle About::     概要
* Prepare triangle::            準備
* Create triangle group::       グループディレクトリーの作成
* Create triangle test::        テストディレクトリーの作成
* Edit triangle desc::          テスト説明ファイルの作成
* Edit triangle cmd::           テストコマンドファイルの作成
* Set triangle test::           テスト想定ファイルの作成
* Execute triangle test::       テストの実行
* Check triangle log::          テストログファイルの確認
* Execute triangle group::      テストグループの実行
* Check triangle group log::    テストグループログファイルの確認
* Associate triangle::          ビルドとの連携
@end menu

@node Tutorial triangle About, Prepare triangle, Tutorial triangle, Tutorial triangle
@unnumberedsec 概要
ここでは、Glenford J Myers『ソフトウェア・テストの技法』（近代科学社、1980）の記載を元にした、次の仕様の三角形判定プログラムをテストする手順を取り上げます@footnote{『ソフトウェア・テストの技法』では「カードから3つの整数を読む」となっているのを、「3つの引数をとる」に変更しています。}。

@quotation
プログラムtriangleは、整数をあらわす3つの引数をとる。この3つの値は、それぞれ三角形の3辺の長さをあらわすものとする。プログラムは、三角形が不等辺三角形の場合は`scalene triangle'、二等辺三角形の場合は`isosceles triangle'、正三角形の場合は`equilateral triangle'を印字する。
@end quotation

この三角形判定プログラムの動作を検証するには、次のテスト・ケースが必要です@footnote{『ソフトウェア・テストの技法』では下記の13個に加え、「それぞれのテスト・ケースについて、入力の値に対して予想される値をしめしたか」というテスト・ケースが記載されています。このテスト・ケースは、Autotest.mkを実行している場合は自動的に満たされると考えています。}。

@quotation
@enumerate
@item
有効な不等辺三角形をあらわすテスト・ケース

@item
有効な正三角形をあらわすテスト・ケース

@item
有効な二等辺三角形をあらわすテスト・ケース

@item
有効な二等辺三角形で2つの等辺を含む3種類の組合せすべてをためすことができる3つのテスト・ケース

@item
1つの辺がゼロの値をもつテスト・ケース

@item
1つの辺が負の値をしめすテスト・ケース

@item
ゼロより大きい3つの整数をもち、そのうち2つの和がそれ以外の1つと等しいようなテスト・ケース

@item
1辺の長さが他の2辺の長さの和に等しいことを3種類の順列のすべてに対してためすことのできるテスト・ケース

@item
ゼロより大きな3つの整数のうち、2つの数の和がそれ以外の1つの数より小さくなるテスト・ケース

@item
ゼロより大きな3つの整数のうち、2つの数の和がそれ以外の1つの数より小さくなることにおいて、3種類の順列すべてを考慮することのできるテスト・ケース

@item
すべての辺がゼロであるテスト・ケース

@item
整数でない値をもつテスト・ケース

@item
数値の個数が間違っていることをためすテスト・ケース
@end enumerate
@end quotation

三角形判定プログラムは、サンプルとして用意されているものを@ref{Prepare triangle, , 準備}するか、または自作してください。

準備ができたら、Autotest.mkを使った次の手順でテストを実行できます。

@enumerate
@item
グループディレクトリーの作成

@item
テストディレクトリーの作成

@item
テスト説明ファイルの作成

@item
テストコマンドファイルの作成

@item
テスト想定ファイルの作成

@item
テストの実行

@item
テストログファイルの確認

@item
テストグループの実行

@item
テストグループログファイルの確認
@end enumerate

@node Prepare triangle, Create triangle group, Tutorial triangle About, Tutorial triangle
@unnumberedsec 準備

@unnumberedsubsec 作業用ディレクトリーの作成

まず、Autotest.mkのパッケージに含まれている@file{sample/triangle}以下のファイルを、任意の作業用ディレクトリーにコピーします。ここでは、@file{~/triangle}（@file{~}は、現在ログインしているユーザーのホームディレクトリー）を作業用ディレクトリーにします。また、@file{autotest.mk}は、@file{~}に展開されているものとします。

@example
$ @kbd{cd}
$ @kbd{mkdir triangle}
$ @kbd{cd autotest.mk/sample/triangle}
$ @kbd{cp triangle.c triangle_bug.c Makefile ~/triangle}
@end example

作業用ディレクトリーに移動し、中のファイルを確認します。

@example
$ @kbd{cd ~/triangle}
$ @kbd{ls}
Makefile  triangle.c  triangle_bug.c
@end example

@unnumberedsubsec 三角形判定プログラムのビルド

三角形判定プログラムをビルドします。

@example
$ @kbd{make}
rm -f triangle
gcc -o triangle triangle.c
@end example

テストもかねて、三角形判定プログラムを手動で実行します。

@example
$ @kbd{./triangle 3 4 5}
scalene triangle
$ @kbd{./triangle 4 4 4}
equilateral triangle
$ @kbd{./triangle 2 4 4}
isosceles triangle
@end example

@unnumberedsubsec バグを含む三角形判定プログラムのビルド

バグを含み一部のテストに失敗する三角形判定プログラムをビルドする場合は、次のコマンドを実行します。

@example
$ @kbd{make bug}
rm -f triangle
gcc -o triangle triangle.c
@end example

テストもかねて、三角形判定プログラムを手動で実行します。

@example
$ @kbd{./triangle 3 4 5}
futohen sankakukei
$ @kbd{./triangle 4 4 4}
equilateral triangle
$ @kbd{./triangle 2 4 4}
isosceles triangle
@end example

@kbd{./triangle 3 4 5}で、仕様で`scalene triangle'となるべきところが、`futohen sankakukei'となっています。

@node Create triangle group, Create triangle test, Prepare triangle, Tutorial triangle
@section グループディレクトリーの作成

テンプレートディレクトリーで@kbd{make}を実行し、グループディレクトリーを作成します。このとき、テストグループのディレクトリーを変数@code{GROUPDIR}で指定します。ここでは、@kbd{~/triangle/test}をテストグループのディレクトリーにします。

@example
$ @kbd{cd ~/autotest.mk/template}
$ @kbd{make GROUPDIR=~/triangle/test}
@end example

次のコマンドでグループディレクトリーに移動し、その中を確認します。

@example
$ @kbd{cd ~/triangle/test}
$ @kbd{ls}
Define.mk  Makefile  Test.mk
@end example

@node Create triangle test, Edit triangle desc, Create triangle group, Tutorial triangle
@section テストディレクトリーの作成

グループディレクトリーで@kbd{make create}を実行し、テストディレクトリーを作成します。このとき、変数@code{TEST}でテスト名を指定します。テスト名は、小文字のアルファベットと数字で指定します。ここでは、1つめのテスト・ケースに対応するテストディレクトリーを、@file{01_scalene}という名前で作成します。

@example
$ @kbd{make create TEST=01_scalene}
@end example

次のコマンドでテストディレクトリーに移動し、その中を確認します。

@example
$ @kbd{cd 01_scalene}
$ @kbd{ls}
Makefile
@end example

@node Edit triangle desc, Edit triangle cmd, Create triangle test, Tutorial triangle
@section テスト説明ファイルの作成
テスト説明ファイル@file{desc.txt}はテストに関する説明をあらわし、テストの結果と一緒にログに出力されます。
@file{desc.txt}をテキストエディターを使って次の内容で作成します。

@example
@kbd{有効な不等辺三角形をあらわすテスト・ケース}
@end example

@node Edit triangle cmd, Set triangle test, Edit triangle desc, Tutorial triangle
@section テストコマンドファイルの作成

テストコマンドファイル@file{cmd}は、テスト時に実行されるコマンドをあらわします。
このコマンドにより、標準出力とエラー出力にテストの結果が出力されるようにします。

ここでは、@file{cmd}をテキストエディターを使って次の内容で作成します。

@example
@kbd{../../triangle 3 4 5}
@end example

@node Set triangle test, Execute triangle test, Edit triangle cmd, Tutorial triangle
@section テスト想定ファイルの作成

テスト想定ファイル@file{0.txt}は、テストが正しく実行された場合の結果をあらわします。@file{0.txt}の作成方法は、次の3つがあります。

@itemize
@item
手動で作成

@item
@kbd{make set}

@item
@kbd{make reset}
@end itemize

エラーが発生するテストでは、標準出力想定の下にエラー出力想定を続けます。

@subsection 手動で作成
テスト想定ファイル@file{0.txt}をテキストエディターを使って次の内容で作成します。

@example
@kbd{scalene triangle}
@end example

@subsection @kbd{make set}
@kbd{make set}を実行すると、コマンドファイル@file{cmd}が実行されます。実行結果は@file{0.txt}ファイルに出力され、その内容が表示されます。

@example
$ @kbd{make set}
scalene triangle
@end example

この方法で@file{0.txt}を作成する場合は、作成された内容がテスト想定として本当に正しいかよく検討する必要があります。例えば、バグを含む三角形判定プログラムを準備して@kbd{make set}を実行すると、仕様と異なる次のようなテスト想定となり、テストを正しく実行できません。

@example
$ @kbd{make set}
futohen sankakukei
@end example

@file{0.txt}がすでに存在する場合は@kbd{make set}を実行するとエラーになり、@file{0.txt}は更新されません。

@subsection @kbd{make reset}
@file{0.txt}がすでに存在する場合は、@kbd{make reset}で更新できます。

@example
$ @kbd{make reset}
scalene triangle
@end example

@node Execute triangle test, Check triangle log, Set triangle test, Tutorial triangle
@section テストの実行

コマンドファイルとテスト想定を用意したら、@kbd{make}または@kbd{make check}でテストを実行できます。

@example
$ @kbd{ls}
0.txt  Makefile  cmd  desc.txt
$ @kbd{make}
有効な不等辺三角形をあらわすテスト・ケース
01_scalene: Test Success 2011-01-10 10:09:55
Detail in /home/foo/triangle/test/01_scalene/detail.log
@end example

表示される項目は、次のとおりです。

@itemize
@item
<テスト説明ファイル@file{desc.txt}の内容>

@item
<テスト名>: <テスト結果（Test SuccessまたはTest Failure）> <テスト実行日時>

@item
Detail in <テスト詳細ログファイルの絶対パス>
@end itemize


@unnumberedsubsec バグを含む三角形判定プログラムの場合

正しいテスト想定を作成していた場合にバグを含む三角形判定プログラムでテストを実行すると、次のように表示されます。

@example
$ @kbd{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
@end example

@node Check triangle log, Execute triangle group, Execute triangle test, Tutorial triangle
@section テストログファイルの確認

テストを実行して作成されたファイルを確認します。@file{1.txt} @file{summary.log} @file{detail.log}が作成されています。

@example
$ @kbd{ls}
0.txt  1.txt  Makefile  cmd  desc.txt  detail.log  summary.log
@end example

テストを実行すると作成されるファイルは、次のとおりです。必要に応じてファイルの内容を確認します。

@table @file
@item 1.txt
テスト結果をあらわします。エラー発生時は、標準出力のあとにエラー出力が続きます

@item err.log
エラー発生時に、エラーが出力されます。エラーが発生しない場合は作成されません

@item diff.log
テスト想定ファイル@file{0.txt}とテスト結果ファイル@file{1.txt}の差分をあらわします。想定と結果が同一の場合は、作成されません

@item summary.log
テストの実行結果を表します。テスト実行時に表示される項目です。

@item detail.log
テストの詳細ログを表します。上記の内容がすべて出力されます
@end table

@file{detail.log}は、次のようになります。

@example
== 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
----------------------------------------------------------------------

@end example

@unnumberedsubsec バグを含む三角形判定プログラムの場合

バグを含む三角形判定プログラムを準備してテストを実行した場合、@file{1.txt} @file{summary.log} @file{detail.log}のほかに、テスト想定とテスト結果が異なるため@kbd{diff.log}が作成されます。

@example
$ @kbd{ls}
0.txt  1.txt  Makefile  cmd  desc.txt  detail.log  diff.log  summary.log
@end example

@file{detail.log}は次のようになります。

@example
== 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
----------------------------------------------------------------------

@end example

@subsection テストのクリア

@kbd{make clean}を実行すると、テストの結果作成されたファイルがクリアされます。

@example
$ @kbd{make clean}
$ @kbd{ls}
0.txt  Makefile  cmd  desc.txt
@end example


@node Execute triangle group, Check triangle group log, Check triangle log, Tutorial triangle
@section テストグループの実行

2つめ以降のテスト・ケースについても、1つめと同じ手順でテストディレクトリーの作成後、テスト説明ファイルとテストコマンドファイル、テスト想定ファイルを作成します。

ここでは、先に作成した@file{01_scalene}も含めて、次のようなディレクトリーとファイルを作成します。こうしたディレクトリーやファイルはAutotest.mkの@file{sample/triangle/test}以下にあります。

@itemize
@ifnothtml
@item
01_scalene

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd} @file{0.txt}
@end itemize

@item
02_equilateral

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd} @file{0.txt}
@end itemize

@item
03_isosceles

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd} @file{0.txt}
@end itemize


@item
04_isosceles_c

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd} @file{0.txt}
@end itemize

@item
05_zero

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd} @file{0.txt}
@end itemize

@item
06_minus

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd} @file{0.txt}
@end itemize

@item
07_line

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd} @file{0.txt}
@end itemize

@item
08_lines

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd} @file{0.txt}
@end itemize

@item
09_less

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd} @file{0.txt}
@end itemize

@item
10_lesses

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd} @file{0.txt}
@end itemize

@item
11_zeroall

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd} @file{0.txt}
@end itemize

@item
12_notint

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd} @file{0.txt}
@end itemize

@item
13_argcnt

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd} @file{0.txt}
@end itemize
@end ifnothtml

@ifhtml
@item
01_scalene

@itemize
@item
@file{Makefile} @uref{sample/triangle/01_scalene/desc.txt, @file{desc.txt}} @uref{sample/triangle/01_scalene/cmd.txt, @file{cmd}} @uref{sample/triangle/01_scalene/0.txt, @file{0.txt}}
@end itemize

@item
02_equilateral

@itemize
@item
@file{Makefile} @uref{sample/triangle/02_equilateral/desc.txt, @file{desc.txt}} @uref{sample/triangle/02_equilateral/cmd.txt, @file{cmd}} @uref{sample/triangle/02_equilateral/0.txt, @file{0.txt}}
@end itemize

@item
03_isosceles

@itemize
@item
@file{Makefile} @uref{sample/triangle/03_isosceles/desc.txt, @file{desc.txt}} @uref{sample/triangle/03_isosceles/cmd.txt, @file{cmd}} @uref{sample/triangle/03_isosceles/0.txt, @file{0.txt}}
@end itemize


@item
04_isosceles_c

@itemize
@item
@file{Makefile} @uref{sample/triangle/04_isosceles_c/desc.txt, @file{desc.txt}} @uref{sample/triangle/04_isosceles_c/cmd.txt, @file{cmd}} @uref{sample/triangle/04_isosceles_c/0.txt, @file{0.txt}}
@end itemize

@item
05_zero

@itemize
@item
@file{Makefile} @uref{sample/triangle/05_zero/desc.txt, @file{desc.txt}} @uref{sample/triangle/05_zero/cmd.txt, @file{cmd}} @uref{sample/triangle/05_zero/0.txt, @file{0.txt}}
@end itemize

@item
06_minus

@itemize
@item
@file{Makefile} @uref{sample/triangle/06_minus/desc.txt, @file{desc.txt}} @uref{sample/triangle/06_minus/cmd.txt, @file{cmd}} @uref{sample/triangle/06_minus/0.txt, @file{0.txt}}
@end itemize

@item
07_line

@itemize
@item
@file{Makefile} @uref{sample/triangle/01_scalene/desc.txt, @file{desc.txt}} @uref{sample/triangle/01_scalene/cmd.txt, @file{cmd}} @uref{sample/triangle/01_scalene/0.txt, @file{0.txt}}
@end itemize

@item
08_lines

@itemize
@item
@file{Makefile} @uref{sample/triangle/08_lines/desc.txt, @file{desc.txt}} @uref{sample/triangle/08_lines/cmd.txt, @file{cmd}} @uref{sample/triangle/08_lines/0.txt, @file{0.txt}}
@end itemize

@item
09_less

@itemize
@item
@file{Makefile} @uref{sample/triangle/09_less/desc.txt, @file{desc.txt}} @uref{sample/triangle/09_less/cmd.txt, @file{cmd}} @uref{sample/triangle/09_less/0.txt, @file{0.txt}}
@end itemize

@item
10_lesses

@itemize
@item
@file{Makefile} @uref{sample/triangle/10_lesses/desc.txt, @file{desc.txt}} @uref{sample/triangle/10_lesses/cmd.txt, @file{cmd}} @uref{sample/triangle/10_lesses/0.txt, @file{0.txt}}
@end itemize

@item
11_zeroall

@itemize
@item
@file{Makefile} @uref{sample/triangle/11_zeroall/desc.txt, @file{desc.txt}} @uref{sample/triangle/11_zeroall/cmd.txt, @file{cmd}} @uref{sample/triangle/11_zeroall/0.txt, @file{0.txt}}
@end itemize

@item
12_notint

@itemize
@item
@file{Makefile} @uref{sample/triangle/12_notint/desc.txt, @file{desc.txt}} @uref{sample/triangle/12_notint/cmd.txt, @file{cmd}} @uref{sample/triangle/12_notint/0.txt, @file{0.txt}}
@end itemize

@item
13_argcnt

@itemize
@item
@file{Makefile} @uref{sample/triangle/13_argcnt/desc.txt, @file{desc.txt}} @uref{sample/triangle/13_argcnt/cmd.txt, @file{cmd}} @uref{sample/triangle/13_argcnt/0.txt, @file{0.txt}}
@end itemize
@end ifhtml
@end itemize

テストグループディレクトリーでは、@kbd{make}または@kbd{make check}で複数のテストをまとめて実行できます。

@example
$ @kbd{cd ~/triangle/test}
$ @kbd{make}
test: 13 / 13 tests passed. Detail in /home/foo/triangle/test/TEST.log
test: All tests are succeded.
@end example

表示されるのは、次の項目です。
@itemize
@item
<テスト名>: <成功テスト数>/<全テスト数> test passed. Detail in <テストグループログファイルの絶対パス>

@item
（すべてのテストに成功した場合）<テスト名>: All tests are succeded.
@end itemize

@unnumberedsubsec バグを含む三角形判定プログラムの場合

バグを含む三角形判定プログラムを準備してテストグループを実行した場合、次のように表示されます。失敗したテストがあることをあらわしています。

@example
$ @kbd{cd ~/triangle/test}
$ @kbd{make}
test: 11 / 13 tests passed. Detail in /home/foo/triangle/test/TEST.log
@end example

@node Check triangle group log, Associate triangle, Execute triangle group, Tutorial triangle
@section テストグループログファイルの確認
テストグループを実行すると作成されるファイルは、次のとおりです。

@table @file
@item <テストグループ名を大文字にした文字列>.log
テストグループに含まれるテストとその実行結果の一覧をあらわします。

@item Summary.log
テストの実行結果を表します。テストグループ実行時に表示される内容です。
@end table

ここではテストグループ名は@file{test}なので、@file{TEST.log}が次の内容で作成されます。

@example
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
@end example

テストをまとめて実行した場合も、個別のテストを実行した場合と同様に、テストディレクトリーにテストログが出力されます。特定のテスト結果を詳細に検討する場合は、そのテストのテストディレクトリーを開いてテストログファイルの確認をします。

@unnumberedsubsec バグを含む三角形判定プログラムの場合

バグを含む三角形判定プログラムを準備してテストグループを実行した場合、@file{TEST.log}は次のように表示されます。01_scaleneのほか、11_zeroのテストで失敗しています。すべての辺がゼロである場合に表示が正しくないバグがあることがわかります。

@example
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

@end example

@node Associate triangle,  , Check triangle group log, Tutorial triangle
@section ビルドとの連携
三角形判定プログラムでは、@file{~/triangle}など作業用ディレクトリーのトップで@kbd{make}を実行すればプログラムをビルドできました。作業用ディレクトリーの@file{Makefile}を次のように編集すると、ビルドと連携してテストを実行できるようになります。

@example
CC = gcc

.PHONY: all @kbd{check} clean

all:
	$(CC) -o triangle triangle.c

@kbd{check:}
@kbd{    $(MAKE) -c test}

clean:
	rm -f triangle
@end example

ビルドとテストは、次のように実行します。

@example
$ @kbd{make}
gcc -o triangle triangle.c
$ @kbd{make check}
make -C test
test: 13 / 13 tests passed. Detail in /home/foo/triangle/test/TEST.log
test: All tests are succeded.
@end example

こうした設定をしておけば、プログラムを変更するたびに簡単にビルドとテストを実行することができます。

@node Tutorial sort, Template dir, Tutorial triangle, Top
@chapter Autotest.mk チュートリアルII - C言語@code{sort}関数のテスト

@menu
* Tutorial sort About::         概要
* Prepare sort::                準備
* Create sort group::           グループディレクトリーの作成
* Create sort test::            テストディレクトリーの作成
* Create sort src::             関数テスト用プログラムのソース作成
* Edit sort Makefile::          @file{Makefile}の編集
* Edit sort desc::              テスト説明ファイルの作成
* Set sort test::               テスト想定ファイルの作成
* Execute sort test::           テストの実行
* Check sort log::              テストログファイルの確認
* Execute sort group::          テストグループの実行
* Check sort group log::        テストグループログファイルの確認
* Iteretive::                   開発とテストの反復
@end menu

@node Tutorial sort About, Prepare sort, Tutorial sort, Tutorial sort
@unnumberedsec 概要
ここではC言語の関数テストの例として、@code{sort}関数をテストします。@uref{http://cunit.sourceforge.net/, CUnit}のわかりやすい日本語チュートリアル@uref{http://homepage3.nifty.com/kaku-chan/cunit/index.html, CUnit チュートリアル}で使われている関数です。

@file{sort_normal.c}は、次の内容です。

@example
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;
            @}
        @}
    @}
@}
@end example

バグを含む@file{sort_bug.c}は、次の内容です。

@example
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;
            @}
        @}
    @}
@}
@end example

プログラムは、サンプルとして用意されているものを@ref{Prepare sort, , 準備}してください。

準備ができたら、Autotest.mkを使った次の手順でテストを実行できます。

@enumerate
@item
グループディレクトリーの作成

@item
テストディレクトリーの作成

@item
テスト説明ファイルの作成

@item
関数テスト用プログラムのソース作成

@item
@file{Makefile}の編集

@item
テスト想定ファイルの作成

@item
テストの実行

@item
テストログファイルの確認

@item
テストグループの実行

@item
テストグループログファイルの確認
@end enumerate

@node Prepare sort, Create sort group, Tutorial sort About, Tutorial sort
@unnumberedsec 準備

@unnumberedsubsec 作業用ディレクトリーの作成

まず、Autotest.mkのパッケージに含まれている@file{sample/sort}以下のファイルを、任意の作業用ディレクトリーにコピーします。ここでは、@file{~/sort}（@file{~}は、現在ログインしているユーザーのホームディレクトリー）を作業用ディレクトリーにします。また、@file{autotest.mk}は、@file{~}に展開されているものとします。

@example
$ @kbd{cd}
$ @kbd{mkdir sort}
$ @kbd{cd autotest.mk/sample/sort}
$ @kbd{cp sort_normal.c sort_bug.c Makefile ~/sort}
@end example

作業用ディレクトリーに移動し、中のファイルを確認します。

@example
$ @kbd{cd ~/sort}
$ @kbd{ls}
Makefile  sort_normal.c  sort_bug.c
@end example

@unnumberedsubsec @code{sort}関数ファイルの準備
@kbd{make}または@kbd{make normal}で、@file{sort_normal.c}が@file{sort.c}にコピーされます。

@example
$ @kbd{make}
rm -f sort.c
cp sort_normal.c sort.c
@end example

@unnumberedsubsec バグを含む@code{sort}関数ファイルの準備
@kbd{make bug}で、@file{sort_bug.c}が@file{sort.c}にコピーされます。
この場合、@file{sort.c}はバグを含みます。

@example
$ @kbd{make bug}
rm -f sort.c
cp sort_bug.c sort.c
@end example

@node Create sort group, Create sort test, Prepare sort, Tutorial sort
@section グループディレクトリーの作成

テンプレートディレクトリーで@kbd{make}を実行し、グループディレクトリーを作成します。このとき、テストグループのディレクトリーを変数@code{GROUPDIR}で指定します。ここでは、@kbd{~/sort/test}をテストグループのディレクトリーにします。

@example
$ @kbd{cd ~/autotest.mk/template}
$ @kbd{make GROUPDIR=~/sort/test}
@end example

次のコマンドでグループディレクトリーに移動し、その中を確認します。

@example
$ @kbd{cd ~/sort/test}
$ @kbd{ls}
Define.mk  Makefile  Test.mk
@end example

@node Create sort test, Create sort src, Create sort group, Tutorial sort
@section テストディレクトリーの作成

グループディレクトリーで@kbd{make create}を実行し、テストディレクトリーを作成します。このとき、変数@code{GROUPDIR}でテスト名を指定し、さらにC言語の関数テスト用の@code{Makefile}を作成するため変数@code{SRC=c}を指定します。ここでは、1つめのテストを@file{sort_001}という名前で作成します@footnote{「CUnit チュートリアル」の「テスト関数1」と「テスト関数2」を、チュートリアルを説明しやすくするため入れ替えています。}。

@example
$ @kbd{make create TEST=sort_001 SRC=c}
@end example

次のコマンドでテストディレクトリーに移動し、その中を確認します。

@example
$ @kbd{cd sort_001}
$ @kbd{ls}
Makefile
@end example

@node Create sort src, Edit sort Makefile, Create sort test, Tutorial sort
@section 関数テスト用プログラムのソース作成
C言語の関数をテストするためのプログラムをC言語で記述した、プログラムのソースファイル@file{cmd.c}をテキストエディターで作成します。テスト対象の関数@code{sort}を呼び出してソートを実行し、その結果を表示するプログラムです。

@example
#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;
@}
@end example

@node Edit sort Makefile, Edit sort desc, Create sort src, Tutorial sort
@section @file{Makefile}の編集
@file{Makefile}をテキストエディターで編集し、テスト対象ファイルをあらわす変数@code{TESTTARGET_FILES}を指定します。
ここでは、@file{../../sort.c}を指定します。

@example
include ../Define.mk
include ../Test.mk

CC := gcc
CFLAGS := -Wall

.INTERMEDIATE: $(CMD_FILE)

CMDSRC_FILE := cmd.c
TESTTARGET_FILES := @kbd{../../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)
@end example


@node Edit sort desc, Set sort test, Edit sort Makefile, Tutorial sort
@section テスト説明ファイルの作成
テスト説明ファイル@file{desc.txt}はテストに関する説明をあらわし、テストの結果と一緒にログに出力されます。
@file{desc.txt}をテキストエディターを使って次の内容で作成します。

@example
@kbd{テスト関数1}
@end example

@node Set sort test, Execute sort test, Edit sort desc, Tutorial sort
@section テスト想定ファイルの作成

テスト想定ファイル@file{0.txt}は、テストが正しく実行された場合の結果をあらわします。@file{0.txt}の作成方法は、次の3つがあります。

@itemize
@item
手動で作成

@item
@kbd{make set}

@item
@kbd{make reset}
@end itemize

エラーが発生するテストでは、標準出力想定の下にエラー出力想定を続けます。

@subsection 手動で作成
テスト想定ファイル@file{0.txt}をテキストエディターを使って次の内容で作成します。

@example
@kbd{3}
@end example

@subsection @kbd{make set}
@kbd{make set}を実行すると、@file{Makefile}の設定に従い関数テスト用のプログラムソース@file{cmd.c}と関数ファイル@file{../../sort.c}からコマンドファイル@file{cmd}が作成されます。そのあと@file{cmd}が実行され、実行結果は@file{0.txt}ファイルに出力されます。実行後、次回のテストのため、@file{cmd}は自動的に削除されます。

@example
$ @kbd{make set}
gcc -Wall -o cmd cmd.c ../../sort.c
2
3
5
7
11
rm cmd
@end example

この方法で@file{0.txt}を作成する場合は、作成された内容がテスト想定として本当に正しいかよく検討する必要があります。

@file{0.txt}がすでに存在する場合は@kbd{make set}を実行するとエラーになり、@file{0.txt}は更新されません。例えば、バグを含む@code{sort}関数ファイルを準備して@kbd{make set}を実行すると、仕様と異なる次のようなテスト想定となり、テストを正しく実行できません。

@example
$ @kbd{make set}
gcc -Wall -o cmd cmd.c ../../sort.c
2
2
2
2
2
rm cmd
@end example

@subsection @kbd{make reset}
@file{0.txt}がすでに存在する場合は、@kbd{make reset}で更新できます。

@example
$ @kbd{make reset}
gcc -Wall -o cmd cmd.c ../../sort.c
2
3
5
7
11
rm cmd
@end example

@node Execute sort test, Check sort log, Set sort test, Tutorial sort
@section テストの実行

コマンドファイルとテスト想定を用意したら、@kbd{make}または@kbd{make check}でテストを実行できます。

@example
$ @kbd{ls}
0.txt  Makefile  cmd.c  desc.txt
$ @kbd{make}
sort_001: Test Success 2011-01-24 11:13:04
Details in /home/foo/sort/test/sort_001/detail.log
rm cmd
@end example

表示される項目は、次のとおりです。

@itemize
@item
<テスト説明ファイル@file{desc.txt}の内容>

@item
<テスト名>: <テスト結果（Test SuccessまたはTest Failure）> <テスト実行日時>

@item
Detail in <テスト詳細ログファイルの絶対パス>
@end itemize


@unnumberedsubsec バグを含む@code{sort}関数の場合

正しいテスト想定を作成していた場合にバグを含む@code{sort}関数でテストを実行すると、次のように表示されます。

@example
$ @kbd{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
@end example

@node Check sort log, Execute sort group, Execute sort test, Tutorial sort
@section テストログファイルの確認

テストを実行して作成されたファイルを確認します。@file{1.txt} @file{summary.log} @file{detail.log}が作成されています。

@example
$ @kbd{ls}
0.txt  1.txt  Makefile  cmd  desc.txt  detail.log  summary.log
@end example

テストを実行すると作成されるファイルは、次のとおりです。必要に応じてファイルの内容を確認します。

@table @file
@item 1.txt
テスト結果をあらわします。エラー発生時は、標準出力のあとにエラー出力が続きます

@item err.log
エラー発生時に、エラーが出力されます。エラーが発生しない場合は作成されません

@item diff.log
テスト想定ファイル@file{0.txt}とテスト結果ファイル@file{1.txt}の差分をあらわします。想定と結果が同一の場合は、作成されません

@item summary.log
テストの実行結果を表します。テスト実行時に表示される項目です。

@item detail.log
テストの詳細ログを表します。上記の内容がすべて出力されます
@end table

@file{detail.log}は、次のようになります。

@example
== 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
----------------------------------------------------------------------

@end example

@unnumberedsubsec バグを含む@code{sort}関数の場合

バグを含む@code{sort}関数を準備してテストを実行した場合、@file{1.txt} @file{summary.log} @file{detail.log}のほかに、テスト想定とテスト結果が異なるため@kbd{diff.log}が作成されます。

@example
$ @kbd{ls}
0.txt  1.txt  Makefile  cmd  desc.txt  detail.log  diff.log  summary.log
@end example

@file{detail.log}は次のようになります。

@example
== 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
----------------------------------------------------------------------

@end example

@subsection テストのクリア

@kbd{make clean}を実行すると、テストの結果作成されたファイルがクリアされます。

@example
$ @kbd{make clean}
$ @kbd{ls}
0.txt  Makefile  cmd.c  desc.txt
@end example


@node Execute sort group, Check sort group log, Check sort log, Tutorial sort
@section テストグループの実行

2つめ以降のテスト・ケースについても、1つめと同じ手順でテストディレクトリーの作成後、テスト説明ファイルとテストコマンドファイル、テスト想定ファイルを作成します。

ここでは、先に作成した@file{sort_001}も含めて、次のようなディレクトリーとファイルを作成します。こうしたディレクトリーやファイルはAutotest.mkの@file{sample/sort/test}以下にあります。

@itemize
@ifnothtml
@item
sort_001

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd.c} @file{0.txt}
@end itemize

@item
sort_002

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd.c} @file{0.txt}
@end itemize

@item
sort_003

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd.c} @file{0.txt}
@end itemize


@item
sort_004

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd.c} @file{0.txt}
@end itemize

@item
sort_005

@itemize
@item
@file{Makefile} @file{desc.txt} @file{cmd.c} @file{0.txt}
@end itemize
@end ifnothtml

@ifhtml
@item
sort_001

@itemize
@item
@file{Makefile} @uref{sample/sort/sort_001/desc.txt, @file{desc.txt}} @uref{sample/sort/sort_001/cmd.c.txt, @file{cmd.c}} @uref{sample/sort/sort_001/0.txt, @file{0.txt}}
@end itemize

@item
sort_002

@itemize
@item
@file{Makefile} @uref{sample/sort/sort_002/desc.txt, @file{desc.txt}} @uref{sample/sort/sort_002/cmd.c.txt, @file{cmd.c}} @uref{sample/sort/sort_002/0.txt, @file{0.txt}}
@end itemize

@item
sort_003

@itemize
@item
@file{Makefile} @uref{sample/sort/sort_003/desc.txt, @file{desc.txt}} @uref{sample/sort/sort_003/cmd.c.txt, @file{cmd.c}} @uref{sample/sort/sort_003/0.txt, @file{0.txt}}
@end itemize


@item
sort_004

@itemize
@item
@file{Makefile} @uref{sample/sort/sort_004/desc.txt, @file{desc.txt}} @uref{sample/sort/sort_004/cmd.c.txt, @file{cmd.c}} @uref{sample/sort/sort_004/0.txt, @file{0.txt}}
@end itemize

@item
sort_005

@itemize
@item
@file{Makefile} @uref{sample/sort/sort_005/desc.txt, @file{desc.txt}} @uref{sample/sort/sort_005/cmd.c.txt, @file{cmd.c}} @uref{sample/sort/sort_005/0.txt, @file{0.txt}}
@end itemize
@end ifhtml
@end itemize

テストグループディレクトリーでは、@kbd{make}または@kbd{make check}で複数のテストをまとめて実行できます。

@example
$ @kbd{cd ~/sort/test}
$ @kbd{make}
test:        5 / 5 tests passed. Details in /home/foo/sort/test/TEST.log
test: All tests are succeded.
@end example

表示されるのは、次の項目です。
@itemize
@item
<テスト名>: <成功テスト数>/<全テスト数> test passed. Detail in <テストグループログファイルの絶対パス>

@item
（すべてのテストに成功した場合）<テスト名>: All tests are succeded.
@end itemize

@unnumberedsubsec バグを含む@code{sort}関数の場合

バグを含む@code{sort}関数を準備してテストグループを実行した場合、次のように表示されます。失敗したテストがあることをあらわしています。

@example
$ @kbd{cd ~/sort/test}
$ @kbd{make}
test: 1 / 5 tests passed. Details in /home/foo/sort/test/TEST.log
@end example

@node Check sort group log, Iteretive, Execute sort group, Tutorial sort
@section テストグループログファイルの確認
テストグループを実行すると作成されるファイルは、次のとおりです。

@table @file
@item <テストグループ名を大文字にした文字列>.log
テストグループに含まれるテストとその実行結果の一覧をあらわします。

@item Summary.log
テストの実行結果を表します。テストグループ実行時に表示される内容です。
@end table

ここではテストグループ名は@file{test}なので、@file{TEST.log}が次の内容で作成されます。

@example
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

@end example

テストをまとめて実行した場合も、個別のテストを実行した場合と同様に、テストディレクトリーにテストログが出力されます。特定のテスト結果を詳細に検討する場合は、そのテストのテストディレクトリーを開いてテストログファイルの確認をします。

@unnumberedsubsec バグを含む@code{sort}関数の場合

バグを含む@code{sort}関数を準備してテストグループを実行した場合、@file{TEST.log}は次のように表示されます。sort_001、sort_003、sort_004、sort_005のテストで失敗していることがわかります。

@example
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

@end example

@node Iteretive,  , Check sort group log, Tutorial sort
@section 開発とテストの反復
あとはテスト対象となっている関数を変更するたびに、テストを実行できるようになります。つまり、関数の単位で開発とテストを反復してできます。

関数の実装だけが変更されて仕様が変わっていない場合は、テストグループのディレクトリーで@kbd{make}を実行するだけでテストができます。

関数の入力または出力の仕様が変わった場合には、@file{0.txt}と@file{cmd.c}の変更を検討します。関数のコンパイル方法（依存するファイル）が変わった場合は、@file{Makefile}の変更を検討します。

@node Template dir, Group dir, Tutorial sort, Top
@chapter テンプレートディレクトリー マニュアル

テンプレートディレクトリーは、Autotest.mkをインストールするときに展開により作成された@file{template}ディレクトリーです。

@menu
* make group::                  @kbd{make}または@kbd{make group} - グループディレクトリーの作成
* Template Files::              テンプレートのファイル
@end menu

@node make group, Template Files, Template dir, Template dir
@section @kbd{make}または@kbd{make group} - グループディレクトリーの作成

変数@code{GROUPDIR}で指定されたディレクトリーをテストグループディレクトリーとして作成し、テストの実行に必要な次のファイルを配置します。

@itemize
@item
@file{Define.mk}

@item
@file{Makefile}

@item
@file{Test.mk}
@end itemize

通常、テストに必要なファイルテンプレートディレクトリーからグループディレクトリーにコピーされます。変数@code{LINKMK}を指定した場合は、シンボリックリンクが作成されます。

@subsection 変数

@table @code
@item GROUPDIR
テストディレクトリーを指定します。指定しない場合や既存のディレクトリーを指定した場合は、エラーが発生してテストグループディレクトリーは作成されません。

@item LINKMK
指定した場合、グループディレクトリーにテストの実行に必要なファイルのシンボリックリンクが作成されます。値は任意です。シンボリックリンクのリンク先は、テンプレートディレクトリーの中です。
@end table

@unnumberedsubsec 使用例

グループディレクトリーとして@file{~/triangle/test}を作成します。

@example
$ @kbd{make GROUPDIR=~/triangle/test}
@end example

@node Template Files,  , make group, Template dir
@section テンプレートのファイル

テンプレートディレクトリーには、次のファイルが含まれます。
@table @file
@item Makefile
テンプレートディレクトリーのMakefile

@item Group.mk
グループディレクトリーのMakefile。@kbd{make}または@kbd{make group}で、グループディレクトリーに@file{Makefile}として配置されます。

@item Test.mk
テストディレクトリーから参照されるMakefile。@kbd{make}または@kbd{make group}で、グループディレクトリーに配置されます。

@item Define.mk
テストとテストグループに関する項目を定義したMakefile。@kbd{make}または@kbd{make group}で、グループディレクトリーに配置されます。
@end table

@node Group dir, Test dir, Template dir, Top
@chapter グループディレクトリー マニュアル

@ref{make group, , グループディレクトリーの作成}後、グループディレクトリーに移動すると次の操作ができます。

@menu
* make create::                 @kbd{make create} - テストの作成
* Rename and Copy::             テスト名の変更とコピー
* Delete::                      テストの削除
* make check at group::         @kbd{make}または@kbd{make check} - テストグループの実行
* make checkall::               @kbd{make checkall} - グループ内にあるすべてのテストの実行、計時
* make clean at group::         @kbd{make clean} - グループ内にあるすべてのテストで、実行結果をクリア
* make time at group::          @kbd{make time} - グループ内にあるすべてのテストを計時
* make time-clean at group::     @kbd{make time-clean} - グループ内にあるすべてのテストで、計時結果をクリア
* Group Files::                 グループのファイル
@end menu

@node make create, Rename and Copy, Group dir, Group dir
@section @kbd{make create} - テストの作成

変数@code{TEST}で指定されたディレクトリーをテストディレクトリーとして作成し、ディレクトリーの中に@code{Makefile}を作成します。

テスト名は、小文字のアルファベットと数字で指定します。大文字ではじまる名前を指定した場合、ディレクトリーや@code{Makefile}は作成されるものの、テストグループ実行の対象になりません。

変数@code{SRC=c}を指定した場合は、C言語の関数テスト用の@code{Makefile}が作成されます。

@subsection 変数
@table @code
@item TEST
テストディレクトリー名を指定します。

@item SRC
値@code{c}を指定すると、C言語の関数テスト用の@code{Makefile}が作成されます。

@end table

@unnumberedsubsec 使用例
テストディレクトリーを、@code{01_scalene}という名前で作成します。

@example
$ @kbd{make create TEST=01_scalene}
@end example

@node Rename and Copy, Delete, make create, Group dir
@section テスト名の変更とコピー

テスト名を変更したりテストをコピーしたりする場合は、@kbd{mv}や@kbd{cp}などでテストディレクトリーを移動、コピーします。

@unnumberedsubsec 使用例
テスト名@code{01_scalene}を@code{01}に変更します。

@example
$ @kbd{mv 01_scalene 01}
@end example

テスト@code{01}をコピーし、テスト@code{02}を作成します。

@example
$ @kbd{cp -r 01 02}
@end example

@node Delete, make check at group, Rename and Copy, Group dir
@section テストの削除

テストを削除する場合は、@kbd{rm}などでテストディレクトリーを削除します。

@unnumberedsubsec 使用例

@example
$ @kbd{rm -rf 01_scalene}
@end example

@node make check at group, make checkall, Delete, Group dir
@section @kbd{make}または@kbd{make check} - テストグループの実行

@kbd{make}または@kbd{make check}で、グループ内にあるすべての@ref{make check at test, , テストの実行}をし、次の項目を表示します。

@itemize
@item
<テスト名>: <成功テスト数>/<全テスト数> test passed. Detail in <テストグループログファイルの絶対パス>

@item
（すべてのテストに成功した場合）<テスト名>: All tests are succeded.
@end itemize

テストグループを実行すると次のファイルが作成されます。

@table @file
@item <テストグループ名を大文字にした文字列>.log
テストグループに含まれるテストとその実行結果の一覧をあらわします。

@item Summary.log
テスト実行結果の概要を表します。テストグループ実行時に表示される内容です。
@end table

@unnumberedsubsec 使用例

@example
$ @kbd{make}
test: 13 / 13 tests passed. Detail in /home/foo/triangle/test/TEST.log
test: All tests are succeded.
@end example

@node make checkall, make clean at group, make check at group, Group dir
@section @kbd{make checkall} - グループ内にあるすべてのテストの実行、計時

@kbd{make checkall}でグループ内にあるすべてのテストを、@ref{make check at test, , 実行}し、@ref{make time at test, , 計時}します。@ref{make check at group, , テストグループの実行}と同じ項目を表示し、出力されるファイルの種類も同じです。@code{<テストグループ名を大文字にした文字列>.log}には、テストと実行結果に加え、計時結果が一覧として出力されます。

テストの実行と計時は別に行われるため、通常にテストを実行するよりも2倍程度の時間がかかります。

@unnumberedsubsec 使用例

@example
$ @kbd{make checkall}
test: 13 / 13 tests passed. Detail in /home/foo/triangle/test/TEST.log
test: All tests are succeded.
@end example

@node make clean at group, make time at group, make checkall, Group dir
@section @kbd{make clean} - グループの実行結果をクリア

@kbd{make clean}で、@ref{make check at group, , @kbd{make}または@kbd{make check}}や@ref{make checkall, ,@kbd{make checkall}}により作成されたファイルをすべて削除します。グループディレクトリーのほか、テストディレクトリーのファイルも削除されます。

@unnumberedsubsec 使用例

@example
$ @kbd{make clean}
@end example

@node make time at group, make time-clean at group, make clean at group, Group dir
@section @kbd{make time} - グループ内にあるすべてのテストを計時

@kbd{make time}で、グループ内にあるすべてのテストを計時し、その結果が表示されます。計時結果は、@file{<テストグループ名を大文字にした文字列>_time.log}に格納されます。

@unnumberedsubsec 使用例

@example
$ @kbd{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
@end example

@node make time-clean at group, Group Files, make time at group, Group dir
@section @kbd{make time-clean} - グループの計時結果をクリア

@kbd{make time-clean}で、@kbd{make time}により作成されたテストグループディレクトリーと各テストディレクトリーのファイルをすべて削除します。

@unnumberedsubsec 使用例

@example
$ @kbd{make time-clean}
@end example

@node Group Files,  , make time-clean at group, Group dir
@section グループディレクトリーのファイル

グループディレクトリーには、テストディレクトリーに加えて、次のファイルが含まれます。

@table @file
@item Makefile
グループディレクトリーのMakefile

@item Test.mk
テストディレクトリーから参照されるMakefile

@item Define.mk
テストとテストグループに関する項目を定義したMakefile

@item <テストグループ名を大文字にした文字列>.log
@ref{make check at group, , @kbd{make}または@kbd{make check}}や@ref{make checkall, , @kbd{make checkall}}を実行したときに作成されます。@kbd{make}や@kbd{make check}の場合は、テストグループに含まれるテストと実行結果の一覧です。@kbd{make checkall}の場合は、テストと実行結果と計時結果の一覧です。

@item  Summary.log
テスト実行結果の概要です。@ref{make check at group, , @kbd{make}または@kbd{make check}}や@ref{make checkall, , @kbd{make checkall}}を実行すると作成され、その内容が表示されます。
@end table

@node Test dir,  , Group dir, Top
@chapter テストディレクトリー マニュアル

@menu
* make set::                    @kbd{make set} - テスト想定の作成
* make reset::                  @kbd{make reset} - テスト想定の作成または更新
* make check at test::          @kbd{make}または@kbd{make check} - テストの実行
* make clean at test::          @kbd{make clean} - テスト結果のクリア
* make all-clean at test::       @kbd{make all-clean} - テストの想定と結果をクリア
* make time at test::           @kbd{make time} - テストの計時
* make time-clean at test::      @kbd{make time-clean} - テスト計時結果のクリア
* Test Files::                  テストディレクトリーのファイル
@end menu

@node make set, make reset, Test dir, Test dir
@section @kbd{make set} - テスト想定の作成
@kbd{make set}で、テストコマンド@file{cmd}が実行され、テスト想定ファイル@file{0.txt}が作成されます。また、実行時に@file{0.txt}の内容が表示されます。@file{0.txt}がすでにある場合は、エラーが発生して@file{0.txt}は更新されません。

@unnumberedsubsec 使用例
@example
$ @kbd{make set}
scalene triangle
@end example

@node make reset, make check at test, make set, Test dir
@section @kbd{make reset} - テスト想定の作成または更新
@kbd{make reset}で、テストコマンド@file{cmd}が実行され、テスト想定ファイル@file{0.txt}を作成されます。また、実行時に@file{0.txt}の内容が表示されます。@file{0.txt}がすでにある場合、@file{0.txt}が更新されます。

@unnumberedsubsec 使用例
@example
$ @kbd{make reset}
scalene triangle
@end example

@node make check at test, make clean at test, make reset, Test dir
@section @kbd{make}または@kbd{make check} - テストの実行
@kbd{make}または@kbd{make check}で、テストコマンド@file{cmd}が実行され、テスト結果ファイル@file{1.txt}が作成されます。また、実行時にテストの結果をあらわす次の項目が表示されます。

@itemize
@item
<テスト説明ファイル@file{desc.txt}の内容>

@item
<テスト名>: <テスト結果（Test SuccessまたはTest Failure）> <テスト実行日時>

@item
Detail in <テスト詳細ログファイルの絶対パス>
@end itemize

@unnumberedsubsec 使用例
@example
$ @kbd{make}
有効な不等辺三角形をあらわすテスト・ケース
01_scalene: Test Success 2011-01-10 10:09:55
Detail in /home/foo/triangle/test/01_scalene/detail.log
@end example

@node make clean at test, make all-clean at test, make check at test, Test dir
@section @kbd{make clean} - テスト結果のクリア
@kbd{make clean}で、テストの実行または計時の結果作成された次のファイルが削除されます。

@itemize
@item
@file{1.txt}

@item
@file{diff.log}

@item
@file{err.log}

@item
@file{summary.log}

@item
@file{time.log}
@end itemize

@unnumberedsubsec 使用例
@example
$ @kbd{make clean}
$ @kbd{ls}
0.txt  Makefile  cmd  desc.txt
@end example

@node make all-clean at test, make time at test, make clean at test, Test dir
@section @kbd{make all-clean} - テストの想定と結果をクリア
@kbd{make clean}で次の、テストの想定ファイルとテストの実行または計時の結果作成されたファイルが削除されます。

@itemize
@item
@file{0.txt}

@item
@file{1.txt}

@item
@file{diff.log}

@item
@file{err.log}

@item
@file{summary.log}

@item
@file{time.log}
@end itemize

@unnumberedsubsec 使用例
@example
$ @kbd{make all-clean}
$ @kbd{ls}
Makefile  cmd  desc.txt
@end example


@node make time at test, make time-clean at test, make all-clean at test, Test dir
@section @kbd{make time} - テストの計時
@kbd{make time}で、テストを計時しその結果が表示されます。計時結果は、@file{time.log}に格納されます。

@unnumberedsubsec 使用例
@example
$ @kbd{make time}
real  0m0.006s
@end example

@node make time-clean at test, Test Files, make time at test, Test dir
@section @kbd{make time-clean} - テスト計時結果のクリア
@kbd{make time-clean}で、テストの計時の結果作成された次のファイルが削除されます。

@itemize
@item
@file{time.log}
@end itemize

@unnumberedsubsec 使用例

@example
$ @kbd{make time-clean}
@end example

@node Test Files,  , make time-clean at test, Test dir
@section テストディレクトリーのファイル
@table @file
@item Makefile
テストディレクトリーのMakefile

@item cmd
テスト時に実行されるコマンドをあらわすテストコマンドファイル。手動で作成します。

@item desc.txt
テストに関する説明をあらわし、テストの結果と一緒にログに出力されます。手動で作成します。

@item 0.txt
テストが正しく実行された場合の結果をあらわすテスト想定ファイル。エラー発生時は、標準出力のあとにエラー出力を続けます。手動か、@kbd{make set}か、@kbd{make reset}で作成します。

@item 1.txt
テスト結果をあらわします。エラー発生時は、標準出力のあとにエラー出力が続きます。@kbd{make}または@kbd{make check}で作成されます。

@item  diff.log
テストの想定と結果の差分をあらわす差分ファイル。@kbd{make}または@kbd{make check}でテストを実行した結果、想定と差分が異なる場合に作成されます。想定と結果が同じ場合は作成されません。

@item  err.log
テストのエラー出力をあらわすエラーファイル。@kbd{make}または@kbd{make check}でテストを実行した結果、エラー出力がある場合に作成されます。なお、エラー出力は@file{1.txt}にも含まれます。

@item  summary.log
テスト実行結果の概要です。@kbd{make}または@kbd{make check}で作成され、その内容が表示されます。

@item  detail.log
テスト実行結果の詳細です。@file{summary.log} @file{cmd} @file{0.txt} @file{err.log} @file{diff.log} @file{1.txt}の内容がコピーされます。@kbd{make}または@kbd{make check}で作成されます。
@end table
@bye
