最佳实践 - 链接到单元测试中的lib或编译源代码

时间:2017-07-28 10:09:29

标签: c++ unit-testing cmake

我想问一下您在单元测试应用程序中获取测试源的经验。以下结构

NiceLib
|-src
   |- MyNiceClass.h
   |- MyNiceClass.cpp
   |- CMakeLists.txt
|-test
   |- tester_MyNiceClass.cpp
   |- main.cpp
   |- CMakeLists.txt

在src中编译一个库。在测试中,测试可执行文件被构建。在测试应用程序中实现MyNiceClass.cpp的最佳实践是什么?目前我知道两个选项。选项一是链接测试可执行文件中的库。 test \ CMakeLists.txt看起来像:

enable_testing()

include_directories(../src/)

add_executable(tester_NiceLib
   main.cpp
   tester_MyNiceClass.cpp
   )

add_test(NicLibTest tester_NiceLib)

target_link_libraries(tester_NiceLib NiceLib)

第二个解决方案是:

enable_testing()

include_directories(../src/)

add_executable(tester_NiceLib
   main.cpp
   tester_MyNiceClass.cpp

   ../src/MyNiceClass.h
   ../src/MyNiceClass.cpp
   )

add_test(NicLibTest tester_NiceLib)

您的经验是什么?您有任何最佳实践或其他解决方案吗?

1 个答案:

答案 0 :(得分:3)

  

您的经验是什么?您有任何最佳实践或其他解决方案吗?

我使用 两种变体 (成功),但 哪一种最适合取决于具体情况 。如果你只需要一个单独的课程,但是你的图书馆包含了相当多的其他内容,那么这可能是一种矫枉过正。没有一般的"最佳解决方案"

我个人建议您只选择最适合您需求的产品。以后在两者之间切换都没问题。

然而,更好的普通源文件集成到测试中,因为它们必须多次编译(对于每个测试+生产代码) 。您只需包含实际的对象文件,然后只编译一次。这也为您提供了更多的灵活性和更好的CMake依赖管理。

因此,我使用的是以下两种变体:

选项1:链接库

这与您的第一个选项相同。

构建库:

add_library(dependencies-lib Src1.cpp Src2.cpp)

链接到测试:

# create test target ...
add_executable(exampletest SomeTests.cpp)
target_link_libraries(exampletest dependencies-lib)

选项2:添加对象库

这与选项1 几乎相同,但您可以非常有选择性。但是,它会阻止多个编译普通源文件方法

构建对象库:

add_library(dependencies-lib OBJECT Src1.cpp Src2.cpp)
#                            ^^^^^^

将对象添加到测试中:

# create test target ...
add_executable(exampletest SomeTests.cpp 
                        $<TARGET_OBJECTS:dependencies-lib> # <-- !!
                        )

如您所见,您不将其作为库链接,而是使用编译的目标文件。即使许多其​​他目标需要这些目标,它们也仅编译一次。顺便说一句。您可以轻松地将它们打包到普通的库/可执行文件中(例如,用于生产二进制文件/ lib):

add_library(all-together-lib Source1.cpp
                Source2.cpp
                # ...

                $<TARGET_OBJECTS:dependencies-lib>
                $<TARGET_OBJECTS:dependencies-lib2>
                $<TARGET_OBJECTS:dependencies-lib3>
                $<TARGET_OBJECTS:dependencies-and-many-more>
                # ...

                # And some more source files ...
                Example1.cpp
                Example2.cpp
                # ...
                )

文档

相关问题