直接问题:我的工作区中是否必须有两个项目来测试一个应用程序?一个用于应用程序,另一个用于单元测试。或者我可以只有一个项目吗?
问题描述:现在我正在使用MinGW在Eclipse C ++中编写一个小应用程序,我想用Boost测试库和C / C ++单元测试它。我已经阅读了手册和教程,他们说Boost创建了一个主要功能。这意味着我必须有两个不同的项目(一个是app,另一个是测试)。但在这种情况下,当我对代码进行更改时,我必须做两次(在两个项目中)。它看起来很烦人,所以我很难,也许我错了,有一种方法可以直接在单元测试中使用应用程序中的源代码,可能是一个独特的项目或单元测试项目的一些特定配置。
有人有想法吗?
非常感谢!
答案 0 :(得分:3)
首先,您可以将所有测试放在与代码相同的项目中,但这可能不是最佳计划。您的主要功能必须采用参数来在测试和实际行为之间切换。
我经常最终得到三个项目:一个库,一个主要的exe和测试项目。 如果你不想制作第三个项目,你可以将相同的cpp文件添加到测试和主exe中,但从长远来看制作第三个库项目可能是明智的。
其次,您可以构建boost测试,以便您可以根据需要编写自己的main。如果您要更改相同的代码两次,则会遇到麻烦。如果您试图维护代码的副本以进行测试,那么您将犯错误。不要这样做。
答案 1 :(得分:1)
你所描述的是一个真正的灾难等待发生的问题。您的单元测试需要测试应用程序的代码,而不是应用程序代码的副本。但是你不应该只是将它们一起抨击到一个项目中。
考虑将测试包含在主代码中的不良后果。您可能会发生名称冲突,您可能会将您的单元测试意外地链接到生产可执行文件中并随其附带,并且您可能会执行一些操作,这些操作会使测试的合法性无效,例如#ifdef UNIT_TEST
或{{1}等语句}}。如果您的单元测试没有测试您的实际编译和准备发运的生产代码,那么它们无法帮助您证明您的代码已准备就绪。
相反,您应该非常希望拥有一种项目组织,使您的代码易于理解,易于测试,易于构建且易于维护。为此,您应该要求单独的项目隔离您的代码,单元测试和生产包装器。
我强烈建议遵循doctorlove的建议来实现一个包含所有程序逻辑的更大的库项目,然后创建一个包含非常精简的if (testing == true) {...}
函数的单独项目,该函数只调用您真实逻辑所在的静态库。然后创建一个包含所有单元测试的第三个项目。测试项目需要链接到您的库中,另外它还应包含自己的main()
以执行测试。
使用这种结构,您的解决方案的一个版本应该为您做几件事。它将首先编译库,然后它将编译和链接单元测试,然后它将运行您的单元测试,并且只有当它们全部通过时它才会编译并链接生产项目与您的库。这样的组织结构使您的代码非常容易测试(它可以在每次构建时自行测试!)并且构建非常高效(您只需构建一次逻辑和测试),此外它还可以帮助所有开发人员了解测试位置的位置。在哪里找到代码。