みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

autotoolsでmake check

テストを実行させるときに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
============================================================================

テストが実行されている。