2015年9月24日木曜日

[iutest] コンパイルエラーになることをテストしてみた

iutest v1.13.0 をリリースしましたが、
iutest v1.12.0 あたりからコンパイルエラーになることをテストするようにしていました。

手法としては、コンパイラ出力を解析してエラーが発生したことを確認するシンプルな方法です。
この解析周りも含め Python で書いてます。
https://github.com/srz-zumix/iutest/blob/master/tools/python/iutest_compile_error_test.py

さて、テストですので期待値を書くことになります。
これはソースコードに直接書ける仕組みにしました。

以下のように書きます。
IUTEST(StaticAssertTypeEqTest, Fail)
{
    IUTEST_TEST_COMPILEERROR("static_assert_typeeq")
    ::iutest::StaticAssertTypeEq<float, int>();
}

IUTEST_TEST_COMPILEERROR の引数にはエラーメッセージを記述します。
このマクロの直後の行にエラーがあり、エラーメッセージに引数の内容が含まれているとテスト成功です。
(エラーメッセージはコンパイラーごとに異なるので注意が必要ですが…)

実際にテストするときは、以下のようにします。
g++ -I../include -g -Wall -Wextra   -std=c++1y -Werror=undef -o static_assertion_failure_tests static_assertion_failure_tests.cpp   2>&1 | python ../tools/python/iutest_compile_error_test.py -c g++
コンパイラーの標準エラー出力を iutest_compile_error_test.py に食わせてあげます。今回は g++ の出力なので、 -c オプションで指定します。
対応しているコンパイラーは g++,clang,cl(Visual Studio) の3つです。
(この機能自体をちゃんとテストしていないので対応できてないケースがあるかもしれませんが…)

実行するとテスト結果が出力されます。
g++ -I../include -g -Wall -Wextra   -std=c++1y -Werror=undef -o static_assertion_failure_tests static_assertion_failure_tests.cpp   2>&1 | python ../tools/python/iutest_compile_error_test.py -c g++
[OK] IUTEST_TEST_COMPILEERROR( "static_assert_typeeq" ): static_assertion_failure_tests.cpp: 24
[OK] IUTEST_TEST_COMPILEERROR( "static_assert_typeeq" ): static_assertion_failure_tests.cpp: 29
[OK] IUTEST_TEST_COMPILEERROR( "static_assert" ): static_assertion_failure_tests.cpp: 35
[OK] IUTEST_TEST_COMPILEERROR( "static_assert" ): static_assertion_failure_tests.cpp: 41

失敗した場合はこんな感じ。
[OK] IUTEST_TEST_COMPILEERROR( "static_assert_typeeq" ): static_assertion_failure_tests.cpp: 24
[OK] IUTEST_TEST_COMPILEERROR( "static_assert_typeeq" ): static_assertion_failure_tests.cpp: 29
[OK] IUTEST_TEST_COMPILEERROR( "static_assert" ): static_assertion_failure_tests.cpp: 35
[NG] IUTEST_TEST_COMPILEERROR( "hogehoge" ): static_assertion_failure_tests.cpp: 41

テストが失敗したときのメッセージとかはまだしっかり作りこめてませんが、これでコンパイルエラーになるべきところをテストできるようになりました。
ライブラリとか作ってると、こういうテストをしたくなると思います。
もっとよさげなツールがあれば使っていきたいところですが…

では。

0 件のコメント:

コメントを投稿