如何与C++中的可执行文件接口 我有一个可执行文件,我需要在C++中运行一些测试,测试将在所有的Windows、Linux和Mac OSES上进行。p>

如何与C++中的可执行文件接口 我有一个可执行文件,我需要在C++中运行一些测试,测试将在所有的Windows、Linux和Mac OSES上进行。p>,c++,operating-system,automated-tests,executable,C++,Operating System,Automated Tests,Executable,我希望得到以下方面的信息: 如何从代码中与先前构建的可执行文件交互?有什么命令功能我可以使用吗?此外,由于我认为命令在操作系统之间会发生变化,因此我需要一些指导来确定如何为所有三个操作系统构建结构。 < >编辑接口=我需要能够从C++代码中使用命令行参数运行可执行文件。p> 当从命令行调用时,可执行文件也会将一些文本输出到控制台上——我如何能够获取输出流?我需要记录这些输出值作为测试的一部分。 请随时问我后续问题 干杯 所有这些操作系统都支持某种形式的子进程调用技术,测试人员在其中创建一个新的子

我希望得到以下方面的信息:

如何从代码中与先前构建的可执行文件交互?有什么命令功能我可以使用吗?此外,由于我认为命令在操作系统之间会发生变化,因此我需要一些指导来确定如何为所有三个操作系统构建结构。 < >编辑接口=我需要能够从C++代码中使用命令行参数运行可执行文件。p> 当从命令行调用时,可执行文件也会将一些文本输出到控制台上——我如何能够获取输出流?我需要记录这些输出值作为测试的一部分。 请随时问我后续问题


干杯

所有这些操作系统都支持某种形式的子进程调用技术,测试人员在其中创建一个新的子进程并执行测试中的代码。您不仅可以传递命令行,还可以将管道连接到子进程的标准输入和输出流

遗憾的是,没有标准的C++ API来创建子进程。您必须为每个操作系统找到合适的API。例如,在Windows中,您可以使用CreateProcess函数:


另请参见

所有这些操作系统都支持某种形式的子进程调用技术,测试人员在其中创建一个新的子进程并执行测试中的代码。您不仅可以传递命令行,还可以将管道连接到子进程的标准输入和输出流

遗憾的是,没有标准的C++ API来创建子进程。您必须为每个操作系统找到合适的API。例如,在Windows中,您可以使用CreateProcess函数:


另请参见

如果您使用qt开发代码,您将发现它允许您以与平台无关的方式生成命令行程序

基本上:

 QObject *parent;
 QString program = "yourcommandlineprogram";
 QStringList arguments;
 QProcess *myProcess = new QProcess(parent);
 myProcess->start(program, arguments);
然后,您可以使用各种函数调用(如readAllStandardOutput)从流程中读取,并使用QProcess::writeQString写入流程的输入

或者,如果您更喜欢Boost而不是Qt,那么也可以让您启动进程。我承认我不太喜欢这个语法

boost::process::command_line cl("yourcommandlineprogram");
cl.argument("someargument");
boost::process::launcher l;
l.set_stdout_behavior(bp::redirect_stream);
l.set_merge_out_err(true);
l.set_work_directory(dir);
boost::process::child c = l.start(cl);

然后,您可以使用stream operators>读取和写入子流程“c”。

如果您使用qt开发代码,您将发现它将允许您以与平台无关的方式生成命令行程序

基本上:

 QObject *parent;
 QString program = "yourcommandlineprogram";
 QStringList arguments;
 QProcess *myProcess = new QProcess(parent);
 myProcess->start(program, arguments);
然后,您可以使用各种函数调用(如readAllStandardOutput)从流程中读取,并使用QProcess::writeQString写入流程的输入

或者,如果您更喜欢Boost而不是Qt,那么也可以让您启动进程。我承认我不太喜欢这个语法

boost::process::command_line cl("yourcommandlineprogram");
cl.argument("someargument");
boost::process::launcher l;
l.set_stdout_behavior(bp::redirect_stream);
l.set_merge_out_err(true);
l.set_work_directory(dir);
boost::process::child c = l.start(cl);

然后,您可以使用流操作符>来读写子流程“c”。

首先,您是否只需要使原始代码可重用?在这种情况下,您可以将其构建为库,并将其链接到新应用程序中


如果您真的想与另一个可执行文件通信,那么您需要将其作为主应用程序的子进程启动。我建议使用的类。

首先,您是否只需要使原始代码可重用?在这种情况下,您可以将其构建为库,并将其链接到新应用程序中


如果您真的想与另一个可执行文件通信,那么您需要将其作为主应用程序的子进程启动。我建议您选择。

据我所知,您希望:

生成一个在运行时参数未知的新进程。 检索新进程打印到的信息。 像QProcess这样的库可以生成进程,但是,我建议在Windows和MacOS/Linux上都手动生成,因为在这种情况下使用QProcess可能会有些过分

对于MacOS/Linux,我将做以下几点:

在父进程中设置。将管道的读取端设置为父级中的新文件描述符。 . 在新创建的子进程中,将stdout文件描述符1设置为管道的写入端。 在新创建的子进程中,传递目标可执行文件以及要给它的参数。 从父进程,子进程可选。 从父进程中,读取步骤1中指定的文件描述符。
据我所知,您希望:

生成一个在运行时参数未知的新进程。 检索新进程打印到的信息。 像QProcess这样的库可以生成进程,但是,我建议在Windows和MacOS/Linux上都手动生成,因为在这种情况下使用QProcess可能会有些过分

对于MacOS/Linux,我将做以下几点:

在父进程中设置。将管道的读取端设置为新的文件描述符 r在父对象中。 . 在新创建的子进程中,将stdout文件描述符1设置为管道的写入端。 在新创建的子进程中,传递目标可执行文件以及要给它的参数。 从父进程,子进程可选。 从父进程中,读取步骤1中指定的文件描述符。
听起来您只计划在可执行级别进行功能测试。这还不够。如果您计划进行彻底的测试,那么还应该编写单元测试。为此,有一些优秀的框架。我最喜欢的C++是Booost:: 如果控制源代码,除了从外部进程启动exe外,还有一些常见的功能测试技巧:嵌入功能测试。您只需向程序中添加一个执行测试的选项。这很酷,因为测试嵌入在代码中,并且可以在任何执行环境中轻松启动autocheck


这意味着在测试环境中,当您使用一些测试专用参数调用您的程序时,没有什么可以阻止您全力以赴,重定向stdout的内容,甚至从程序内部检查测试结果。这将使整个测试比从外部启动器调用,然后从than launcher分析结果容易得多。

听起来您只计划在可执行级别进行功能测试。这还不够。如果您计划进行彻底的测试,那么还应该编写单元测试。为此,有一些优秀的框架。我最喜欢的C++是Booost:: 如果控制源代码,除了从外部进程启动exe外,还有一些常见的功能测试技巧:嵌入功能测试。您只需向程序中添加一个执行测试的选项。这很酷,因为测试嵌入在代码中,并且可以在任何执行环境中轻松启动autocheck


这意味着在测试环境中,当您使用一些测试专用参数调用您的程序时,没有什么可以阻止您全力以赴,重定向stdout的内容,甚至从程序内部检查测试结果。这将使整个测试比从外部启动器调用,然后从than launcher分析结果容易得多。

看起来像Linux上可用的作业,而看起来像Linux上可用的作业,并且与以前构建的可执行文件的接口是什么意思?是否需要使用某些命令行参数启动并记录输出?如果不止这些,什么?接口是这样一个模糊的词。是的,只需从C++代码中调用可执行文件和命令行参数即可;在我的原始问题中还添加了一个编辑。您对以前构建的可执行文件的接口是什么意思?是否需要使用某些命令行参数启动并记录输出?如果不止这些,什么?接口是这样一个模糊的词。是的,只需从C++代码中调用可执行文件和命令行参数即可;在我的原始问题中还添加了一个编辑。这听起来很好,但在项目的这个阶段涉及Qt可能不会发生:我添加了一个关于使用boost的注释;作为一个只包含头的库,它可能更容易集成,并且您不需要重新组织任何现有代码。Boost是一个库,因此在以任何方式包含它时都没有任何怪癖,而且它与平台无关。这听起来很好,但在项目的这个阶段涉及到Qt可能不会发生:我添加了一个关于使用Boost的注释;作为一个只包含头的库,它可能更容易集成,并且您不需要重新组织任何现有代码。Boost是一个库,因此在以任何方式包含它时都没有任何怪癖,而且它与平台无关。那么,为什么您给我的步骤集只针对Mac/Linux?如果C++被构建,操作系统就不重要了,对吗?我对Windows不太了解,但我可以从脑海中想到什么。这一切都与Windows创建新进程的方式有关。早在80年代,Windows就以一种设计决策的方式创建了新进程:它们将fork和execvp合并为一个函数,因此在开始运行新进程之前,您不能修改子进程中的文件描述符。另外,我不确定Windows是如何处理管道的,或者它是否有管道。那么,为什么您给我的步骤集只针对Mac/Linux?如果C++被构建,操作系统就不重要了,对吗?我对Windows不太了解,但我可以从脑海中想到什么。这一切都与Windows创建新进程的方式有关。早在80年代,Windows就以一种设计决策的方式创建了新进程:它们将fork和execvp合并为一个函数,因此在开始运行新进程之前,您不能修改子进程中的文件描述符。另外,我不确定Windows如何处理管道,或者是否有管道
PopEN似乎是某种特定的nix,不是语言特定的,或者我错了吗?@ SpkfFrime:假设,根据语言特定,你指的是标准库的一部分,我认为进程产卵和流重定向是标准C++的一部分。但是POPON不是完全UNIX专用的,因为它也可以在Windows上使用。PopEN似乎是特定的nix特定的,不是语言特定的,或者我错了吗?@ SpkfFrime:假设,根据语言特定,您指的是标准库的一部分,我不认为进程产卵和流重定向是标准C++的一部分。但是popen并不是完全特定于unix的,因为它也可以在Windows上使用。我们没有太多的类要测试,只有一些核心功能。别误会。当您有许多类要测试时,单元测试不是您要做的事情。越少越好。如果您只需要测试一些核心功能,那么单元测试就更适合了。我仍然想知道你打算通过启动exe来测试什么。这些自动化测试通常很难编写,运行exe是最简单的步骤。我需要的测试级别目前处于功能级别。我们没有太多的类要测试,只有一些核心功能。别误会。当您有许多类要测试时,单元测试不是您要做的事情。越少越好。如果您只需要测试一些核心功能,那么单元测试就更适合了。我仍然想知道你打算通过启动exe来测试什么。这种自动测试通常很难编写,运行exe是最简单的步骤。