autotools で make check を実装する方法(その1)

今更ですが 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とかプログラミングの覚え書き -