SSブログ

Google TestでDeathテストを使ってみる [Google Test]

Google TestにはDeathテストというのがある.
詳細は例によって,ドキュメントを参照してほしいんだけど,要はコード中のアサーションが正しく動作しているかどうかを確認するためのテストで,しかもアサーションが失敗してプログラムが処理を中断し終了するかどうかをテストするものだ.
ちなみにアサーションというのは日本語だと「表明」とかって訳されていて,そこには実行時に絶対に満たされているべき条件を記載してやる.つまり,条件に書かれてる内容が満たされてることを期待してますよ,と表明しているわけだ.なお,その条件が満たされないと以後の処理は続けられない(続けると回復できない重大な問題が発生ししてしまう)場合に使う.その場合ってのは,つまり致命的なエラーが起きたってことだ.

では,試してみよう.
例によってディレクトリ構成.
gtest_advanced_death_proj/
├── CMakeLists.txt
├── assertion_func.cpp
├── assertion_func.h
├── compiler_settings.cmake
├── main.cpp
└── test
    └── advanced_unittest.cpp


compiler_settings.cmakeは以前から変更が無いので省略して,それ以外は以下のようになる.

CMakeLists.txt
cmake_minimum_required(VERSION 2.6)
project(gtest_advanced_test)

include (compiler_settings.cmake)

enable_testing()
set(CMAKE_INCLUDE_CURRENT_DIR ON)
message(STATUS GTEST_DIR=$ENV{GTEST_DIR})

include_directories($ENV{GTEST_DIR}/include)
link_directories($ENV{GTEST_DIR}/lib)

cxx_executable(assert_main "" main.cpp assertion_func.cpp)
cxx_test(gtest_advanced_test "" assertion_func.cpp test/advanced_unittest.cpp)


assertion_func.cpp
#include <cassert>
#include "assertion_func.h"

void Func(bool is_true)
{
    assert(is_true);
}


assertion_func.h
#ifndef ASSERTION_FUNC_H
#define ASSERTION_FUNC_H

void Func(bool is_true);

#endif // ASSERTION_FUNC_H


main.cpp
#include <iostream>
#include "assertion_func.h"

int main()
{
    bool test = false;
    Func(test);

    return 0;
}


test/advanced_unittest.cpp
#include <gtest/gtest.h>
#include <cassert>
#include "assertion_func.h"

TEST(MyDeathTest, FuncDeath)
{
    ASSERT_DEATH({
            bool test = false;
            Func(test);
            }, "");
}


では,ざっくり説明.
とりあえず,ビルドして,assertion_mainを実行してみると,以下のような表示が出てプログラムは終了する.
gtest_advanced_death_proj/assertion_func.cpp:6: void Func(bool): Assertion `is_true' failed.

これはassertion_func.cpp:6にis_trueが「true」であることを期待してますよと表明しておいたにもかかわらず,実際は「false」だったため,アサーションが失敗しました,ということだ.
で,これをテストするために,Google Testでは例えばASSERT_DEATHというマクロを用意してくれてる.書式は,
ASSERT_DEATH(statement, regex);
となっていて,statementにはプログラムが「クラッシュ」する文を書く.ちなみにここで言うクラッシュとは,ドキュメントによれば「プロセスが exit() または _exit() を0ではない引数で呼び出した場合. あるいは,シグナルによって殺された場合」を指す.だから正常終了した場合なんかは当てはまらない.で,ここには式だけじゃなくて例にあるように文も書ける.
あと,regexには標準エラー出力とマッチする正規表現を書ける.

アサーション自体はとても重要だ.だからアサーションが正しく機能するかをテストすることもとても重要だ.
Deathテストを自分で作るとすると多分とてもめんどくさいはず.それをGoogle Testが用意してくれてるのはとても助かる.しかも簡単に使える.
ぜひお試しあれ.
タグ:Deathテスト
nice!(0)  トラックバック(0) 
共通テーマ:日記・雑感

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。