设置单元测试需要多少个项目
How many projects are needed to setup an Unit test
直接问题:我的工作区中必须有两个项目来测试一个应用程序吗?一个用于应用程序,另一个用于单元测试。或者我可以只有一个项目在一起吗?
问题描述:现在我正在使用MinGW在Eclipse C++中编写一个小应用程序,我想用Boost Test库和C/C++单元对其进行测试。我已经阅读了手册和教程,他们说 Boost 创建了一个主函数。这意味着我必须有 2 个不同的项目(一个是应用程序,另一个用于测试)。但是在这种情况下,当我对代码进行更改时,我必须执行两次(在两个项目中)。它看起来很烦人,所以我很难说也许我错了,并且有一种方法可以直接在单元测试中使用应用程序中的源代码,可能是使用唯一的项目或单元测试项目的某些特定配置。
有人有想法吗?
多谢!
首先,您可以将所有测试与代码放在同一个项目中,但这可能不是最佳计划。您的主要函数必须采用参数才能在测试和实际行为之间切换。
我经常以三个项目结束:一个库,我的主exe和测试项目。如果您不想制作第三个项目,您可以将相同的 cpp 文件添加到测试和主 exe 中,但从长远来看,制作第三个库项目可能是明智的。
其次,您可以构建提升测试,以便根据需要编写自己的 main。如果您两次更改相同的代码,这是自找麻烦。如果您试图维护代码的副本以对其进行测试,那么您将犯错误。别这样。
你所描述的是一个真正的灾难等待发生的问题。 单元测试需要测试应用程序的代码,而不是应用程序代码的副本。 但你也不应该把它们放在一个项目中。
想想将测试包含在主代码中会得到的坏事。 您可能会发生名称冲突,您的单元测试可能会意外地与生产可执行文件链接并附带在一起,并且您可能会执行一些完全使测试合法性无效的做法,例如 #ifdef UNIT_TEST
或 if (testing == true) {...}
等语句。如果单元测试没有测试实际编译并准备发布的生产代码,则它们不会帮助你证明代码已做好生产准备。
相反,你应该强烈希望拥有一种项目组织,使你的代码易于理解、易于测试、易于构建和易于维护。 为此,您应该需要单独的项目来隔离代码、单元测试和生产包装器。
我强烈建议遵循doctorlove的建议,实现一个包含所有程序逻辑的更大的库项目,然后创建一个包含非常薄的main()
函数的单独项目,该函数仅调用您的真实逻辑所在的静态库。 然后创建包含所有单元测试的第三个项目。 测试项目需要链接到您的库中,此外它还应该包含自己的main()
才能执行测试。
使用此结构,解决方案的一个生成应该可以为您做几件事。 它将首先编译库,然后编译和链接单元测试,然后运行单元测试,只有当它们全部通过时,它才会编译生产项目并将其链接到您的库。 这样的组织结构使您的代码非常容易测试(它在每次构建时都会自我测试!)并且构建起来非常高效(您只构建一次逻辑和测试),此外,它还可以帮助所有开发人员了解在哪里放置测试,在哪里放置代码。
如果您只有一个主 exe 项目,您可以通过为您的解决方案创建一个新目标"UnitTest"来执行一些单元测试,并将主 exe 项目的属性"配置类型"设置为"静态库 (.lib)"。
这种方法的缺点是,如果您想构建 exe 或进行一些单元测试,则必须切换目标。所以我也建议@doctorlove的答案。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 从链接列表c++中删除一个项目
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 既然存在危险,为什么项目要使用-I include开关
- cmake在我的项目中所需的所有静态库都不成功
- 复制列表初始化的隐式转换的等级是多少
- while循环中while循环的时间复杂度是多少
- QT通过C++添加映射QML项目
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在linux上调试巨大的C++项目
- 在其他文件中创建类时在 c++ 项目中不起作用
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 如何检查一个c++字符串中有多少相同的字符/数字
- 设置单元测试需要多少个项目