今更ですが autotools で make check を実装する方法をまとめます.
make check の仕組み
GNU autotools はデフォルトで make check のフレームワークを用意しています.
使い方も簡単で,大雑把に言うと以下の4つの手順だけで make check が実装できます.
手順1: テスト用プログラムを用意する
プログラムはシェルスクリプトでも,C/C++で実装したプログラムでも何でもOKです.
ただしテスト結果をプログラムの終了コードで返すように実装する必要があります.テスト結果と終了コードの対応は以下の通りです.
テスト結果 | 意味 | 終了コード |
PASS | テストに成功した | 0 |
FAIL | テストに失敗した | 0, 77, 99 以外の値 |
SKIP | テストを省略した. | 77 |
ERROR | テスト用プログラム自身のエラー | 99 |
SKIPは,例えば,環境依存のバグがあり,そのバグが再現出来ない環境の場合はテストが実行できないので,テストケースはSKIPを返す,という使い方をします.
ERRORはテストの失敗ではなくて,テスト用プログラム自体の不具合を意味します.
終了コードの扱いはもう少し細かい制御が出来るのですが,その点は後日,別エントリでまとめます.
手順2: Makefile.am で テスト用プログラムを指定する
例えば テスト用プログラムを tests ディレクトリ以下に配置した場合は
tests/Makefile.am を作成して,以下の1行を加えます
TESTS = テスト用プログラム
手順3: configure.ac の記述
2つ設定が必要です
例えば テスト用プログラムを tests ディレクトリ以下に配置した場合は
AC_CONFIG_TESTDIR([tests]) AC_CONFIG_FILES([Makefile tests/Makefile])
の2行が必要です
手順4: autoreconf -vfi の実行
Makefile.amや configure.ac を編集したあとは autoreconf -vif を実行すると configure など必要なファイルが更新されます
make check の動作
上記の4つの手順を済ませておけば,あとは configure して make check を実行するだけです
make check を実行すると,手順2で TESTS に登録したプログラムが順番に実行され,プログラムが ゼロを返した場合はテスト成功,非ゼロを返した場合はテスト失敗として,テストを実行していきます.
テスト結果はログに保存されます.ログファイルのファイル名は
- tests/test-suite.log テスト全体のログファイル
- tests/test_テスト用プログラム名.log 個別のテストのログファイル
となります.
簡単なサンプル
全コードを載せます
ファイル構成は
となります.
configure.ac の中身です
AC_PREREQ([2.71]) AC_INIT([project_name], [1.0]) AM_INIT_AUTOMAKE([foreign]) AC_CONFIG_TESTDIR([tests]) AC_CONFIG_FILES([Makefile tests/Makefile]) AC_OUTPUT
Makefile.am は一行だけ
SUBDIRS = tests
動作確認のために,テスト用プログラムを2つ用意します
一つ目.tests/test1.sh
#!/bin/sh /usr/bin/false
これはリターンコードとして1を返します.1はテストケースの結果はFAIL(失敗)であることを意味します
テスト用プログラム2つ目.tests/test2.sh
#!/bin/sh /usr/bin/true
これはリターンコードとしてゼロを返すシェルスクリプトです.テストケースの結果はPASS(成功)となります
テスト用プログラムを起動するための Makefile.am です
tests/Makefile.am
TESTS = test1.sh test2.sh
ファイルを用意したら,以下のコマンドで configure を生成します
$ autoreconf -vfi
あとは configure して make check するだけです
$ ./configure $ make check
make checkの出力は次のようになります
FAIL: test1.sh PASS: test2.sh ============================================================================ Testsuite summary for project_name 1.0 ============================================================================ # TOTAL: 2 # PASS: 1 # SKIP: 0 # XFAIL: 0 # FAIL: 1 # XPASS: 0 # ERROR: 0 ============================================================================ See tests/test-suite.log
テストプログラムは2つあり
- test1.sh は失敗(FAIL: test1.sh の表示)
- test2.sh は成功 (PASS: test2.sh の表示)
を返します
- test2.sh は /usr/bin/true を起動しているだけなのでリターンコードはゼロ
- test1.sh は /usr/bin/false を起動しているだけでリターンコードは非ゼロ
なので,期待どおりの動作になっていることが確認できます.
次回に続きます.
autotools で make check を実装する方法(その2) - pyopyopyo - Linuxとかプログラミングの覚え書き -