私は巨大なソフトウェアをテストしており、このタスクに Catch を使用したいと考えています。私は「シングル インクルード」バージョン 1.9 を使用しており、それを Visual Studio 2012 update 4 に統合し、C++04 標準を使用しています。
以下に示すように、3 つの「.cpp」ファイルを使用します。それらのそれぞれは、次を参照します。
- 「抽象化」マクロを提供するインクルード ファイル (例:
#define Assert(x) REQUIRE(x)
)。 - テスト用のユーティリティを提供するユーティリティ ファイル。
- 特定のテスト ターゲット インクルード ファイル。
- いくつかの「名前空間を使用する」ステートメント、同じ名前空間を「使用する」すべての cpp ファイル。
- マクロで書かれた実際のテスト (例:
Assert(2 == getNumber())
)。
ファイルの内容の詳細については、以下をご覧ください。
この構成は機能しますが、テスト ファイルの 1 つが日ごとに大きくなっており、3 つ以上に分割したいと考えています。さて、私が次のことをするとしましょう:
- テストの内容の一部を取り、
test.cpp
それを新しいファイルに移動しますtest2.cpp
。 - 同じインクルードと定義を追加してコンパイルします。
- メインに新しいファイルを含める
テストを実行すると、このエラーがポップアップします。
=============================
No tests ran
error: TEST_CASE( "test 2" ) already defined.
First seen at c:\tests\catchtest2\catchtest2\test2.cpp(3)
Redefined at c:\tests\catchtest2\catchtest2\test2.cpp(3)
test2.cpp
新しいファイルはどこにありますか。コンテンツを元に戻すtest.cpp
とすべてうまくいきますが、数千行のテストを扱うのは、プロジェクト自体で作業するよりもほとんど難しく、次元はさらに 3、4 倍大きくなる可能性があります。テストを複数のファイルに分割する方法はありますか?
- ノート -
Catch をヘッダーにインクルードし、インクルード ヘッダーをcatch.cpp
直接ではなく使用することはお勧めできませんが、この構成を 3 つ (正確には 3 つ)のインクルード.cpp
テスト ファイルで使用することに成功しましたが、これを 4 つのファイルで使用することはできません。
コンポーネントが定義された行に何らかの関連があることを読んだことを覚えていますが、テストケースが別の行で定義され、動作が変わらないようにコードを移動することもできます。
また、コンパイラ/リンカーのキャッシュにダーティデータが保持されている可能性があるため、「クリーンアップと再構築」を試みましたが、役に立ちませんでした。
現在、実際の MWE を作成することはできませんでした。そのため、必要と思われる正確なテスト セットアップのスケッチを提供しました。追加の詳細を提供したり、実際の MWE を構築して共有したりできます。
どんなアイデアでも大歓迎です!
私の「作業」コードは次のようになります。
main.cpp
#define CATCH_CONFIG_RUNNER
#include "catch.hpp"
#include "test1.cpp"
#include "test2.cpp"
#include "test3.cpp"
int main( int argc, char* argv[] )
{
cleanDir("c:\\temp");
init (argv);
int result = Catch::Session().run( argc, argv );
return ( result < 0xff ? result : 0xff );
}
test1.cpp
#include "unitTestSuite.h"
#include "utils.h"
#include "systemundertest.h"
using namespace system::under::test;
my_test_case("test 1") {
my_section("does X") {
// tests...
}
}
my_test_case("test 2") {
my_section("does Y") {
// tests...
}
}
unitTestSuite.h
#ifndef UNIT_TEST_SUITE
#define UNIT_TEST_SUITE 1
#include "catch.hpp"
#define my_test_case(x) TEST_CASE("Testing: " x)
... // here is also a namespace with some unit test specific utils
#endif
ユーティリティ.h
#ifndef _UTILS_
#define _UTILS_
// some global variables declared here and defined in utils.cpp
// template functions defined in the header
// non-template functions defined in utils.cpp
// a test generation namespace with some template functions and some non-template functions defined in utils.cpp
#endif
「分割」後:
test1.cpp
#include "unitTestSuite.h"
#include "utils.h"
#include "systemundertest.h"
using namespace system::under::test;
my_test_case("test 1") {
my_section("does X") {
// tests...
}
}
test1.2.cpp
#include "unitTestSuite.h"
#include "utils.h"
#include "systemundertest.h"
using namespace system::under::test;
my_test_case("test 2") {
my_section("does Y") {
// tests...
}
}
main.cpp
#define CATCH_CONFIG_RUNNER
#include "catch.hpp"
#include "test1.cpp"
#include "test1.2.cpp"
#include "test2.cpp"
#include "test3.cpp"
int main( int argc, char* argv[] )
{
cleanDir("c:\\temp");
init (argv);
int result = Catch::Session().run( argc, argv );
return ( result < 0xff ? result : 0xff );
}
プログラム出力:
=============================
No tests ran
error: TEST_CASE( "test 2" ) already defined.
First seen at c:\tests\catchtest2\catchtest2\test1.2.cpp(3)
Redefined at c:\tests\catchtest2\catchtest2\test1.2.cpp(3)