autoconfを使って単体テストにリモートのサーバー名など環境依存な情報を埋め込む

どうもです。
お久しぶりです。


サーバーと通信する単体テストを書いてるときに、
リモートのサーバー名をどうやって埋め込むか悩んだことはありませんか?


共通ファイルを作ってインクルードするのが一般的だと思いますが、
共通処理が複雑になってテスト自体にバグが出たら本末転倒。


そんなときの解決方法のひとつとして、
autoconfという昔からあるツールが便利なので紹介します。


まず、テストのファイルをtests/example.phptとすると、
そのファイルをtests/example.phpt.inとファイル名の後ろに".in"がつく形式にリネームします。


次に環境依存な部分を @HOGE@ という形式に置き換えます。


それからconfigure.ac というファイルを作り、こんな感じに書けばOK。

AC_INIT([example], 0.0)

AC_ARG_WITH(
    [host],
    [AS_HELP_STRING([--with-host=HOST],
        [target host to connect in tests])],
    [host="$withval"],
    [host=localhost]
)

AC_SUBST([HOST], $host)

AC_CONFIG_FILES([tests/example.phpt])
AC_OUTPUT

このあとは、

autoconf

とすれば、configureスクリプトが自動生成されますので、

./configure

とすれば実行できます。

./configure --help

とすればヘルプも見えます。

2回目からは、autoconfのかわりに、autoreconfも使えます。


難しそうだけど、意外と簡単なのです。


動くソースをこちらにあげておきます。

https://github.com/coiled-coil/autoconf-tutorial