テストを実行させるときにmake checkで行うという慣習があるらしく 今さらだがautotoolsでそれを組み込む方法を試してみたのでメモ。
ディレクトリ構成
.
├── Makefile.am
├── configure.ac
├── src
│ └ foo.h
└── test
├── Makefile.am
└── foo_test.cpp
src以下がテスト対象でtest以下がテストとなる。
test/Makefile.am
TESTS = foo_test
check_PROGRAMS = foo_test
foo_test_SOURCES = foo_test.cpp \
$(top_builddir)/src/foo.h
foo_test_CXXFLAGS = -I../src
foo_test_LDADD = -lboost_unit_test_framework
TESTSでmake checkで実行されるファイルを指定。これはシェルスクリプトなどでも良い。
check_PROGRAMSでmake checkした時にビルドされるファイルを指定。ここではfoo_test。 foo_test_XXXXは通常の場合と同じなので割愛。
ここでの注意点はtestやcheckで指定されたファイルはinstall対象ではないこと。 リリース時にテスト用のファイルは必要ないだろうし当然と言えば当然かも。
test/foo_test.cpp
テストの実体ここではBoost.Testを利用している。
#define BOOST_TEST_DYN_LINK #define BOOST_TEST_MODULE foo_test #include <boost/test/unit_test.hpp> #include "foo.h" BOOST_AUTO_TEST_SUITE(foo_test) BOOST_AUTO_TEST_CASE(test_foo_equal_ok) { Foo foo; BOOST_CHECK_EQUAL(foo.equal(10, 10), true); } BOOST_AUTO_TEST_CASE(test_foo_equal_ng) { Foo foo; BOOST_CHECK_EQUAL(foo.equal(10, 11), false); } BOOST_AUTO_TEST_SUITE_END()
src/foo.h
テスト対象のコード
#ifndef FOO_H #define FOO_H class Foo { public: bool equal(int lhs, int rhs) const {return (lhs==rhs);} }; #endif //FOO_H
Makefile.am
SUBDIRS = test
configure.ac
まずは以下のコマンドでスケルトンを生成
$ autoscan
$ mv ./configure.scan ./configure.ac
configure.acを以下の内容に編集
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ([2.68])
AC_INIT([make-check-sample], [0.0.0], [mail@address])
AM_INIT_AUTOMAKE([foreign])
AC_CONFIG_SRCDIR([src/foo.h])
AC_CONFIG_HEADERS([config.h])
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
AC_CHECK_HEADER_STDBOOL
# Checks for library functions.
AC_CONFIG_FILES([Makefile
test/Makefile])
AC_OUTPUT
実行
$ autoreconf -i
$ ./configure
$ make check
....
============================================================================
Testsuite summary for make-check-sample 0.0.0
============================================================================
# TOTAL: 1
# PASS: 1
# SKIP: 0
# XFAIL: 0
# FAIL: 0
# XPASS: 0
# ERROR: 0
============================================================================
テストが実行されている。