はじめに
C++向けのユニットテストフレームワークdoctestをSiv3Dの開発で使い始める方法をメモしておきます。
doctestのインストール
作成手順
doctest.hをdoctest\doctest\doctest.hからコピーして、プロジェクトの直下に配置します。
テストコードを書きます
AddTest.h
#define DOCTEST_CONFIG_IMPLEMENT
#include "../doctest.h"
namespace
{
int add(int a, int b) { return a + b; }
}
TEST_CASE("testing the add function") { CHECK(add(1, 2) == 3); }
TEST_CASE("will fail") { CHECK(add(1, 2) == 0); }
Main.cppの void Main()の中でテストを実行するようにします
Main.cpp
#if USE_TEST
#include "Tests/AddTest.h"
class TestRunner
{
public:
static int run()
{
// コンソールを出す必要がある
Console.open();
doctest::Context context;
// overrides
context.setOption("no-breaks", true); // don't break in the debugger when assertions fail
int res = context.run(); // run
if (context.shouldExit()) // important - query flags (and --exit) rely on the user doing this
return res; // propagate the result of the tests
// テスト実行
bool testSuccess = res == 0;
if (!testSuccess)
{
// テスト失敗時
// 失敗に気づきやすいようにキー入力を待つようにする
// 失敗時にはゲーム画面は表示されず、コンソール画面のみ表示される
static_cast<void>(std::getchar());
}
return testSuccess;
}
};
#endif
void Main()
{
#if USE_TEST
TestRunner::run();
#endif
// 以下略
結果
テストが通っていないので、以下のようなコンソール画面のみが表示されます。
[doctest] doctest version is "2.4.11"
[doctest] run with "--help" for options
===============================================================================
(パス)\AddTest.h(13):
TEST CASE: will fail
(パス)\AddTest.h(13): ERROR: CHECK( add(1, 2) == 0 ) is NOT correct!
values: CHECK( 3 == 0 )
===============================================================================
[doctest] test cases: 2 | 1 passed | 1 failed | 0 skipped
[doctest] assertions: 2 | 1 passed | 1 failed |
[doctest] Status: FAILURE!
テストが通っている際には、テスト結果のコンソール画面とゲーム画面の両方が表示されます。
この例では、USE_TEST
のプリプロセッサによる条件分岐でテストを実行するかどうかを制御しています。
備考
・doctestはシングルヘッダーなので、使用するのが簡単です
・AddTest.hなどのテストコードを書いたファイルはヘッダーファイルである必要があります。cppファイルにすると、コンパイルの対象から外さない限り、インクルードした際に実装が2つあることになってしまいます。こちらの記事が大変参考になりました。
・追加でテストコードを書く際にはMain.cppにインクルードするヘッダファイルを増やしていきます。
参考記事
TestRunnerの書き方などを参考にさせていただきました。
テストコードなどを参考にさせていただきました。