CTest でのテスト実行時にファイルを渡す


ファイル内容を読み込む関数とか、まぁなんかファイルを必要とするテストケースがあると思うんだけどそれは次のようにすればいける。

読み込むファイルはテストケースを書いた cpp ファイルと同じ場所においておく。で、次のようなテストを書く。ポイントは main 関数の中で引数をグローバル変数に退避して、最後に RUN_ALL_TESTS を呼んでいるところ。

/*
 * ini.cpp
 * */

#include "gtest/gtest.h"

#include "filetype/ini.hpp"

char const * ini01;
char const * ini02;

int main (int argc, char * argv[]) {
    ::testing::InitGoogleTest(&argc, argv);
    assert(argc == 3);

    ini01 = argv[1];
    ini02 = argv[2];

    return RUN_ALL_TESTS();
}

TEST(Read, InSuccessWithValidFile) {
    auto settings = FileType::Ini::Read(ini01);
    // snip
}

TEST(Read, InFailureWithInvalidFile) {
    auto settings = FileType::Ini::Read(ini02);
    // snip
}

これを次のように設定してやる。何の事はない、 COMMAND に引数を追加しているだけなんだけど、 ${CMAKE_CURRENT_SOURCE_DIR} の下にあるファイルを指定することでテスト用ファイルが分散しないようにしてるのがちょっとした工夫。

cmake_minimum_required(VERSION 2.8)

add_executable(IniTest ini.cpp)
target_link_libraries(IniTest
    gtest
    gtest_main
    pthread
    gcov
    )

add_test(
    NAME Ini
    COMMAND $<TARGET_FILE:IniTest> "${CMAKE_CURRENT_SOURCE_DIR}/test01.ini" "${CMAKE_CURRENT_SOURCE_DIR}/test02.ini"
    )