10

私は単体テストに不慣れで、Catch フレームワークを使用することにしました。これは、1 つのヘッダー ファイルと統合するのが簡単に思えたからです。ただし、マルチファイルのバイナリ検索ツリー プログラムがあります (ファイルは次のとおりです: main.cpp、Tree.h、Tree.hxx、TreeUnitTests.cpp、catch.hpp)。main.cpp で int main() 関数をコメントアウトした場合にのみ、単体テストを実行できます。TreeUnitTests.cpp の '#define CATCH_CONFIG_MAIN' 宣言と競合していることは理解していますが、その宣言を含めないと単体テストを実行できません。単体テストを実行するたびに main() をコメントせずに両方を実行するにはどうすればよいですか?

これは私が使用しているヘッダー ファイルです: https://raw.githubusercontent.com/philsquared/Catch/master/single_include/catch.hpp

そして、私が見つけてガイドとして使用した Catch チュートリアル: https://github.com/philsquared/Catch/blob/master/docs/tutorial.md

参照用の関連ファイル: main.cpp:

//******************* ASSN 01 QUESTION 02 **********************

#include "Tree.h"
#include <iostream>

using namespace std;

/*
int main()
{

    //creating tree with "5" as root
    Tree<int> tree(5);
    tree.insert(2);
    tree.insert(88);
    tree.inorder();
    cout << "does tree contain 2?: ";
    cout << tree.find(2) << endl;
    cout << "does tree contain 3?: ";
    cout << tree.find(3) << endl;

    Tree<int> copytree(tree);
    cout << "copied original tree..." << endl;
    copytree.preorder();
    cout << "after deletion of 2:\n";
    copytree.Delete(2);
    copytree.postorder();


    return 0;
}
*/

TreeUnitTests.cpp:

#include <iostream>
#include "Tree.h"
#define CATCH_CONFIG_MAIN
#include "catch.hpp"

TEST_CASE("Pass Tests")
{
    REQUIRE(1 == 1);
}

TEST_CASE("Fail test")
{
    REQUIRE(1 == 0);
}

(私のテストは実際のテストではなく、Catch フレームワークが正しく機能していることを確認するためのものです。これはメタ テストであると言えます)

4

2 に答える 2

8

Visual Studio を使用しているため、適切なアプローチは構成マネージャー(ソリューション エクスプローラー ツール ウィンドウでソリューションを右クリックしてアクセス可能) を使用し、別のソリューション構成を作成することです。

[新しいソリューション構成] フォームで、構成にわかりやすい名前を指定します (例: UnitTesting)。「コピー元:」という名前のドロップダウン リストもあり、設定を新しい構成にコピーする構成を選択できます。これを のままにせず<Empty>、これまでソースをビルドするために使用したソース構成を選択します (インクルード フォルダーやその他の設定が正しく設定されるため)。[新しいプロジェクト構成を作成する] チェック ボックスをオンにして、ソリューション内のすべてのプロジェクトに一致するプロジェクト構成も作成してください。

構成を作成したら、ツールバーのドロップダウン リストを使用して、デバッグ構成とリリース構成を切り替えるのと同じ方法で構成を選択します。

クリックして新しい構成を選択します クリックして新しいUnitTesting構成を選択します

これで、特定のプロジェクトまたはそのプロジェクト内のファイルのプロパティ ページを開くと (ファイルまたはプロジェクトを右クリックして を選択Properties)、特定の構成を選択し (UnitTestingあなたの場合)、アクティブになる特定のオプションを指定できます。この単一の構成の場合。

プロパティ ページで選択All Configurationsして、明らかにすべての構成に設定を適用することもできます。これは、追加のインクルード ディレクトリと一般的なプリプロセッサ設定を追加する場合に重要です。誤ってインクルード ディレクトリをデバッグ構成のみに追加した場合、コンパイラは に切り替えた後にヘッダー ファイルを見つけることができませんUnitTesting

したがって、この構成を別の方法で動作させるには、次のようにします。

1.ビルド構成main.cppから除外するUnitTesting

たとえば、右クリックmain.cppして を開きProperties、この構成でのみビルドからファイルを除外できます。

ビルドからのファイルの除外 特定の構成のビルドからファイルを除外する

main()2. プリプロセッサ マクロを使用して、関数を条件付きで除外する

または、プロジェクトのプロパティを開いて、この構成でのみ定義される特定のプリプロセッサ マクロを設定することもできます。

ここに画像の説明を入力 UNIT_TESTING構成用のマクロを作成しUnitTestingます。ここでも MS ペイントを使用して図にセンスを追加します

したがって、後者のアプローチでは、実際の値は次のmain.cppように変更されます。

// remove if UnitTesting configuration is active
#ifndef UNIT_TESTING
int main(void)
{
    ...
}
#endif

最初のアプローチは、実稼働コードをまったく変更する必要がないため優れていますが、後者のアプローチは、Visual Studio でコードを見て疑いを持たない他の人々が、特定のコードが変更されていない理由を疑問に思い始めたときに、より明白になる可能性があります。まったくコンパイルされていません。ビルド構成に特定のファイルがないことを忘れて、しばらく奇妙なコンパイル エラーを見つめることがあります。

また、2 番目の方法では、同じ場所にカスタム Catch エントリ ポイントを簡単に提供することもできます。

#ifdef UNIT_TESTING

    // this is the main() used for unit testing

#   define CATCH_CONFIG_RUNNER
#   include <catch.hpp>

    int main(void)
    {
        // custom unit testing code
    }    

#else

    int main(void)
    {
        // actual application entry point
    }

#endif
于 2017-08-31T23:30:04.930 に答える