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 件のコメント:
コメントを投稿