5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Siv3DAdvent Calendar 2023

Day 1

OpenSiv3D開発でdoctestを利用する

Last updated at Posted at 2023-11-28

はじめに

C++向けのユニットテストフレームワークdoctestをSiv3Dの開発で使い始める方法をメモしておきます。

doctestのインストール

作成手順

doctest.hをdoctest\doctest\doctest.hからコピーして、プロジェクトの直下に配置します。

image.png

テストコードを書きます

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の書き方などを参考にさせていただきました。

テストコードなどを参考にさせていただきました。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?