取决于。Google Test(主要)是一个单元测试框架(过于简化,测试类)。你完全可以将is用于其他类型的测试,但是它没有“内置”功能用于其他类型的测试,你必须自己编写它。 如果您正在尝试对可执行文件进行系统测试,则可以运行该进程。如果您使用的是多平台系统或者已经有了boost依赖项,我建议您使用Boost.Process。否则,看这里:launch an exe/process with stdin stdout and stderr? 您编写的“测试”将调用可执行文件,并可以相应地输入stdin或stdout。 例如:
std::string path_to_exectuable = "thepath";
TEST(FooTester,CheckHelpScriptReturns0)
{
using bp =::boost::process;
std::vector<std::string> args; args.push_back("--help");
bp::context ctx;
ctx.stdout_behavior = bp::capture_stream();
bp::child c = bp::launch(exec, args, ctx);
bp::status s = c.wait();
ASSERT_TRUE(s.exited())<<"process didn't exit!";
ASSERT_EQ(s.exit_status(),0)<<"Help didn't return 0";
}
...
// includes
// functions
// whatever
...
#ifdef TESTING
#include <gtest/gtest.h>
#endif
int main(int argc, char **argv) {
#ifdef TESTING
::testing::InitGoogleTest(&argc, argv);
int val = RUN_ALL_TESTS();
getchar(); // not necessary, but keeps the console open
return val;
#endif
// rest of main() as normal...
}
7条答案
按热度按时间b4lqfgs41#
根据您的评论,您有一个C++控制台应用程序(
MyApp)
),您已经为其开发了一些特定于应用程序的类,您希望在Visual Studio中使用googletest进行单元测试。怎么做?正如你所说,如果你想对一个库进行单元测试,方法是显而易见的。您将:
UnitTest
)。UnitTest
项目依赖于库项目,以便构建UnitTest
确保MyApp
是最新的。UnitTest
应用程序。但是由于您想要进行单元测试的类是特定于
MyApp
的,因此您没有任何库。一个教官的回答是:* 你没有一个包含你想要单元测试的类的库?那就做一个!*
这样你就可以使用3个项目:
MyAppLib
,生成包含所有要进行单元测试的功能的库。MyApp
,生成与当前相同的可执行文件,但链接MyAppLib
UnitTest
,生成一个可执行文件,对MyAppLib
进行单元测试,还链接MyAppLib
然而,如果你不喜欢教官的回答,你可以绕过它。
从通常的构建系统的Angular 来看(设计到Visual Studio中的Angular ),
MyApp
项目的重要输出是构建目标-.exe
。生成的.obj
文件只是中间副产品。VS不支持将这些副产品作为依赖项目的自动链接器输入,如果依赖项目也是相同类型的.exe
-就像您的情况一样-那么这样的自动链接无论如何都是不可能的,因为主入口点将被多重定义。但是从单元测试的Angular 来看,情况正好相反。对
.exe
不感兴趣,而(某些).obj
文件全部或部分包含您希望进行单元测试的类的实现。在教科书的情况下,类foo
在foo.h
中定义并在foo.cpp
中实现,在UnitTest
的链接中需要对象文件foo.obj
。为简单起见,假设
MyApp
只使用一个特定于应用程序的类foo
,该类在foo.h
中定义并在foo.cpp
中实现。然后,您有两个构建UnitTest
的选项。foo.cpp
添加到UnitTest
的源文件中。当然,不要“复制”它。只需从MyApp
的源文件夹中添加一个已有的项目即可。然后您就完成了,但是本课程的缺点是foo.cpp
在UnitTest
项目中暴露于不适当的编辑。foo.obj
视为UnitTest
链接所需的 * 静态库 *,并按照上面的步骤1)- 6)进行操作。这特别地意味着在步骤3)中,{调试|UnitTest
的{Release}版本配置了包含\path\to\MyApp\{Debug|Release}
(以相对或绝对形式)的库搜索目录。实际上,对于选项B),很可能有多个来自
MyApp
的.obj
文件必须链接到UnitTest
中,并且它们的数量很可能会随着时间的推移而增加。保持UnitTest
的正确链接可能会成为一件苦差事,你可能会得出这样的结论:教官毕竟是对的。1cklez4t2#
取决于。Google Test(主要)是一个单元测试框架(过于简化,测试类)。你完全可以将is用于其他类型的测试,但是它没有“内置”功能用于其他类型的测试,你必须自己编写它。
如果您正在尝试对可执行文件进行系统测试,则可以运行该进程。如果您使用的是多平台系统或者已经有了boost依赖项,我建议您使用Boost.Process。否则,看这里:launch an exe/process with stdin stdout and stderr?
您编写的“测试”将调用可执行文件,并可以相应地输入stdin或stdout。
例如:
kcugc4gi3#
我也遇到过类似的情况,我设置的方式有效地实现了Mike Kinhan的答案,就编译器而言,但从用户的Angular 来看,它的方式不同。
我所做的是创建一个自定义配置,我称之为“测试”。通过打开项目设置,选择“Configuration Manager...”并在配置选择框中选择“New...”,可以创建新配置。
当出现提示时,我选择从默认的“Debug”配置中复制设置,这样我就可以在测试中使用调试器,就像我在“Debug”配置中一样。
在新的Testing配置下,我设置了编译器和链接器的选项,使其像往常一样使用google test。
属性中重要的变化是我定义了一个预处理器变量,我称之为“TESTING”。
我重写了我的“main.cpp”,看起来像这样:
我想指出的是,我只修改了
main
定义位置附近的几行,我不必在整个文件中进行大的修改。现在一切都设置好了,我简单地为我的测试创建了一个新的源文件夹,并在其中创建“.cpp”文件。为了避免普通可执行文件膨胀,我用TESTING变量的检查来 Package 这些文件,所以我有这样的东西:
tests/Test.cpp:
我认为这些文件在调试和发布配置下仍然会被编译器“命中”,所以有大量的这些文件可能会减慢构建速度,但是调试和发布对象不会因为测试代码而变得臃肿。
两个要点是:
.obj
文件可能会成为一件苦差事,但是通过使用这种方法,默认的Visual Studio设置可以为您管理这一点。一个缺点是,所有对象文件的冗余副本将在“Testing”输出目录中创建。有了更多的配置,肯定有一种方法可以“共享”Debug对象文件,但我没有理由走那么远。
这是一个非常简单的方法,可能比将应用程序重构为单独的库和主库要容易得多。我不喜欢使用预处理器,但在这种情况下,它相当简单,没有太多的代码膨胀,并完全完成了它需要的。您总是可以用另一种方式触发测试,而不使用预处理器。
c86crjj04#
如果您对在不同的项目中进行测试不是很严格,那么您可以在应用程序项目中编写测试。然后只要让应用程序在接收到某些命令行参数时执行测试,否则执行正常的应用程序逻辑,即
这避免了为测试的唯一目的而创建不必要的库,尽管如果结构正确,您仍然可以这样做。缺点是测试代码会进入您要发布的可执行文件。如果你不想这样,我想你需要一个额外的配置,指定一个预处理器指令来禁用测试。
调试测试或在构建后自动运行测试很容易,只需分别指定“--tests”作为调试参数或在构建后命令行中指定。
vshtjzan5#
如果你想测试一个控制台应用程序,你可以运行一个测试,打开一个控制台窗口,并运行第一个应用程序的exe文件。然后在你的googletest中捕获你刚刚运行的exe的标准输出。
[For对第一个应用程序的更多控制,您可能需要让第一个应用程序解析发送给它的参数,例如一些像-x或任何你需要的标志。
bvjveswy6#
我已经准备了一个github repo,包括Visual Studio 2015解决方案,与Mike的“drill-sergeant”建议并行。您可以直接使用它,而无需任何额外的要求或依赖。
https://github.com/fuatcoskun/GoogleTestVS2015
希望能帮上忙。。
svgewumm7#
另一种解决方案是为测试添加条件变量。然后在开发过程中将应用构建为库,当您想要发布它时,您可以禁用测试并生成可执行文件。例如,在主CMakeLists.txt中,可以添加
在您的应用程序中
然后在你的测试目标中
不要忘记对你的应用程序的主函数做同样的事情,以避免与你的测试框架中包含的主函数发生冲突