Как взаимодействовать с исполняемым файлом в C ++ - PullRequest
1 голос
/ 17 июля 2010

У меня есть исполняемый файл, для которого мне нужно выполнить несколько тестов в C ++ - и тестирование будет проходить на всех Windows, Linux и Mac OS.

Я надеялся на ввод:

  • Как бы я взаимодействовал с ранее созданным исполняемым файлом из моего кода? Есть ли какая-то командная функциональность, которую я могу использовать? Кроме того, так как я думаю, что команды меняются между операционными системами, мне нужно некоторое руководство, чтобы выяснить, как я могу структурировать для всех трех операционных систем.

РЕДАКТИРОВАТЬ - Интерфейс = Мне нужно иметь возможность запустить исполняемый файл с аргументом командной строки из моего кода C ++.

  • Исполняемый файл при вызове из командной строки также выводит некоторый текст на консоль - как бы я мог получить этот выходной поток (мне нужно было бы записать эти выведенные значения как часть моих тестов).

Не стесняйтесь задавать мне дополнительные вопросы.

Ура!

Ответы [ 6 ]

3 голосов
/ 17 июля 2010

Если вы используете qt для разработки своего кода, вы обнаружите, что QProcess позволит вам запускать программу командной строки независимо от платформы.

По существу:

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

Затем вы можете читать из процесса с помощью различных вызовов функций, таких как readAllStandardOutput (), и записывать на вход процесса с помощью QProcess :: write (QString).

В качестве альтернативы, если вы предпочитаете Boost вместо 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', используя потоковые операторы << и >> для чтения и записи.

2 голосов
/ 17 июля 2010

Все эти ОС поддерживают некоторую форму метода вызова «подпроцесса», когда ваш тестер создает новый дочерний процесс и выполняет там тестируемый код.Вы можете не только передавать командную строку, но и иметь возможность присоединять каналы к стандартным потокам ввода и вывода дочернего процесса.

К сожалению, нет стандартного API C ++ для создания дочерних процессов.Вам нужно будет найти соответствующий API для каждой ОС.Например, в Windows вы можете использовать функцию CreateProcess: MSDN: создание процессов (Windows) .

См. Также Stackoverflow: как вы создаете другой процесс в C?

1 голос
/ 17 июля 2010

Как я понимаю, вы хотите:

  1. Создать новый процесс с аргументами, неизвестными во время выполнения.
  2. Получить информацию, напечатанную в stdout с помощьюновый процесс.

Библиотеки, такие как QProcess, могут порождать процессы, однако я рекомендовал бы делать это вручную для Windows и MacOS / Linux, так как использование QProcess для этого случая, вероятно, излишне.

Для MacOS / Linux вот что я бы сделал:

  1. Установите pipe в родительском процессе.Установите в конце чтения канала новый дескриптор файла в родительском элементе.
  2. fork.
  3. Во вновь созданном дочернем процессе установите stdout (дескриптор файла #1) в конец записи канала.
  4. execvp во вновь созданном дочернем процессе и передайте целевой исполняемый файл вместе с аргументами, которые вы хотите ему дать.
  5. Из родительского процесса, wait для дочернего (необязательно).
  6. Из родительского процесса считайте из дескриптора файла, который вы указали в шаге 1.
0 голосов
/ 17 июля 2010

Похоже на работу для popen () , доступной в Linux, Windows и OS X

0 голосов
/ 17 июля 2010

Звучит так, будто вы планируете проводить функциональное тестирование только на исполняемом уровне.Этого недостаточно.Если вы планируете провести тщательное тестирование, вам также следует написать модульные тесты.Для этого есть несколько отличных рамок.Мой предпочтительный (на сегодняшний день) для C ++ - BOOST :: Testing.

Если вы управляете исходным кодом, есть также общие приемы для функционального тестирования помимо запуска exe из внешнего процесса: встраивание функциональных тестов.Вы просто добавляете в свою программу опцию, которая выполняет тесты.Это круто, потому что тесты встроены в код, и автоматическая проверка может быть легко запущена в любой среде выполнения.

Это означает, что в среде тестирования, когда вы вызываете свою программу с некоторыми выделенными аргументами теста, ничто не мешает вам двигаться дальшеполный путь и перенаправить содержимое стандартного вывода и даже проверить результаты испытаний изнутри программы.Это сделает все тестирование намного проще, чем вызов с внешнего модуля запуска, а затем анализ результатов с этого модуля.

0 голосов
/ 17 июля 2010

Прежде всего, возможно ли, что вам просто нужно сделать свой исходный код повторно используемым?В этом случае вы можете собрать его как библиотеку и связать в новом приложении.

Если вы действительно хотите общаться с другим исполняемым файлом, вам может потребоваться запустить его как подпроцесс основного приложения.Я бы порекомендовал класс Process библиотек Poco C ++ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...