重新定义的Catch单元测试

时间:2017-11-21 17:36:29

标签: c++ visual-studio-2012 catch-unit-test

我正在测试一大块软件,并希望使用Catch来完成这项任务。 我正在使用"单个包含"版本1.9,将其集成到Visual Studio 2012更新4和使用C ++ 04标准。

正如您将在下面看到的,我使用了三个" .cpp"文件。他们每个人都参考:

  • 提供"抽象的包含文件"宏(例如#define Assert(x) REQUIRE(x));
  • 为测试提供...实用程序的实用程序文件;
  • 特定测试目标包括文件;
  • some" using namespace"声明,所有cpp文件"使用"相同的命名空间;
  • 使用宏编写的实际测试(例如Assert(2 == getNumber()))。

有关下面文件内容的更多详细信息。

此配置有效,但其中一个测试文件日渐变大,我希望将其拆分为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个文件。

我记得读过它与某些组件定义的有关,但我也可以移动代码,以便在不同的行定义测试用例,并且行为不会&# 39;改变。

我还试图"清理和重建",因为很可能脏数据保存在编译器/链接器的缓存中,但无济于事。

我现在无法创建一个实际的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

utils.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

&#34;拆分&#34;:

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)

1 个答案:

答案 0 :(得分:2)

不要包含cpp文件,只需将它们添加到项目中即可。 你的main.cpp文件只需要前两行(一个define和一个include)。