2010-07-16 97 views
1

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

我希望的输入上:

  • 我怎么会从我的代码之前生成的可执行接口?有什么样的命令功能可以使用吗?另外,因为我认为这些命令在操作系统之间会发生变化,所以我需要一些指导来确定如何构建所有三种操作系统。

编辑 - 接口=我需要能够使用我的C++代码中的命令行参数运行可执行文件。

  • 从命令行调用时的可执行文件也输出一些文本到控制台 - 我将如何能够获取输出流(我需要记录那些输出值作为我的测试的一部分)。

随意问我跟进questios。

干杯!

+0

你是什么意思“与之前生成的可执行接口”?你需要用特定的命令行参数来启动它并记录输出吗?如果不止于此,什么? “界面”就是这样一个模糊的词。 – 2010-07-16 20:42:02

+0

是的,只需要调用可执行文件以及来自C++代码的命令行参数;还在我的原始问题中添加了一个编辑。 – sparkFinder 2010-07-16 20:45:42

回答

1

据我了解,你想:

  1. 菌种在运行时不知道参数的新工艺。
  2. 通过新过程检索打印到stdout的信息。

像QProcess这样的库可以产生进程,但是,我建议用Windows和MacOS/Linux手动执行,因为这种情况下使用QProcess可能是矫枉过正的。

适用于MacOS/Linux的,这里就是我会做:

  1. 设置在父进程pipe。将管道的读取端设置为父级中的新文件描述符。
  2. fork
  3. 在新创建的子进程中,将stdout(文件描述符#1)设置为管道的写入结束。
  4. execvp在新创建的子进程中,并将目标可执行文件与您想要给它的参数一起传递。
  5. 从父进程,wait为子(可选)。
  6. 从父进程,从文件描述符读取了你在步骤1所示。
+0

那么为什么是你给我的只有Mac/Linux特有的一系列步骤吗?如果内置到C++中,操作系统应该不重要,对吧? – sparkFinder 2010-07-16 21:26:50

+0

我对Windows没有太多了解,但这里是我能想到的。这一切都与Windows创建新进程的方式有关(早在80年代,设计决定就是这样做的):他们将'fork'和'execvp'合并为一个函数,因此您不能修改子进程中的文件描述符它开始运行新的过程。 此外,我不知道Windows如何处理管道(或者如果它有它们)。 – advait 2010-07-16 21:35:52

2

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

不幸的是,没有标准的C++ API来创建子进程。您必须为每个操作系统找到适当的API。例如,在Windows中,您可以使用CreateProcess函数:MSDN: Creating Processes (Windows)

Stackoverflow: How do you spawn another process in C?

3

看到,如果你使用Qt来开发你的代码,你会发现QProcess将允许您在一个平台无关的方式产生一个命令行程序。

本质:

QObject *parent; 
QString program = "yourcommandlineprogram"; 
QStringList arguments; 
QProcess *myProcess = new QProcess(parent); 
myProcess->start(program, arguments); 

然后,您可以从各种功能的过程调用读如readAllStandardOutput(),并写入与另外,QProcess ::写(QString的)过程的输入。

或者,如果您更喜欢升级到Qt,Boost.Process也可以让您启动进程。我承认我不喜欢的语法一样多......

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”通过使用流运营商< <和>>读写然后工作。

+0

这听起来很不错,但在项目的这个阶段涉及Qt可能不会发生:( – sparkFinder 2010-07-16 20:56:48

+0

)我添加了一个关于使用boost的注释;作为仅包含头的(主要)库,它可能更易于集成,你不需要重新组织任何现有的代码 – 2010-07-16 21:02:58

+0

Boost可能是OP的一种方式,Boost是一个库,所以在任何方面都没有包含它的怪癖,并且它是平台不可知的所以 – 2010-07-16 21:31:21

0

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

如果您确实想与其他可执行文件进行通信,那么您可以将其作为主应用程序的子进程启动。我会推荐Poco C++ librariesProcess类。

0

听起来你只打算在执行层面做功能测试。这还不够。如果你想进行彻底的测试,你还应该编写单元测试。为此,有一些优秀的框架。我最喜欢的一个(到目前为止)用于C++的是BOOST :: Testing。

如果您控制源代码,除了从外部进程启动exe外,还有功能测试的常用技巧:嵌入功能测试。您只需在程序中添加一个执行测试的选项。这很酷,因为测试嵌入代码中,自动检测可以在任何执行环境中轻松启动。

这意味着在测试环境中,当您使用某些测试专用参数调用程序时,没有任何东西可以阻止您完全转向标准输出内容,甚至可以从程序中检查测试结果。它将使整个测试比从外部启动器调用更容易,然后从发射器分析结果。

+0

我需要的测试级别目前在功能级别上。我们没有太多的类来测试,只是一些核心功能。 – sparkFinder 2010-07-16 22:06:56

+0

不要误解我的意思。当你有很多课程要测试时,单元测试不是你要做的事情。越少越好。如果您只需要测试一些核心功能,则单元测试更适合。我仍然想知道你打算通过启动exe来测试什么。这些自动化测试通常很难编写,运行exe是最简单的步骤。 – kriss 2010-07-16 22:25:17

0

看起来像popen()工作,可用于Linux,WindowsOS X

+0

popen似乎是* nix特定的,而不是语言特定的 - 或者我误会了? – sparkFinder 2010-07-16 22:06:01

+0

@sparkFinder :(假设,通过“语言特定”,你的意思是“标准库的一部分”)我不认为进程产卵和流重定向是标准C++的一部分。但是popen并不完全是特定于unix的,因为它也可以在Windows上使用。 – 2010-07-19 13:53:41

相关问题