Вы можете проверить код выхода ваших команд npm
и newman
и вернуть их вызывающему процессу:
public string Runner ()
{
var psiNpm = new ProcessStartInfo
{
FileName = "cmd",
RedirectStandardOutput = true,
RedirectStandardInput = true,
UseShellExecute = false
};
var pNpmRun = Process.Start(psiNpm);
pNpmRun.StandardInput.WriteLine("npm install -g newman");
pNpmRun.StandardInput.WriteLine("if not "%ERRORLEVEL%" == "0" exit 1");
pNpmRun.StandardInput.WriteLine("newman run " +
"\"C:\\Postman\\Test.postman.json\" " +
"--folder \"TestSearch\" " +
"--environment \"C:\\Postman\\postman_environment.json\" " +
"--disable-unicode");
pNpmRun.StandardInput.WriteLine("if not "%ERRORLEVEL%" == "0" exit 2");
pNpmRun.StandardInput.WriteLine("exit 0");
var tenMin = 10 * 60 * 1000;
if(pNpmRun.WaitForExit(tenMin)) {
var exitCode = pNpmRun.ExitCode;
if(exitCode != 0) {
throw new Exception("Command failed " + exitCode);
}
return pNpmRun.StandardOutput.ReadToEnd();
} else {
pNpmRun.Kill();
throw new TimeoutException("Command didn't complete in 10 minute timeout");
}
}
После каждой команды проверяйте errorlevel
, который является «переменной виртуальной среды», представляющей код завершения предыдущей команды. Если это не было 0 (обычно это успех), то процесс cmd
возвращается к вашему C # -коду. Ваш код C # проверяет ExitCode
процесса, и если он не успешен (0), он генерирует исключение, содержащее ExitCode, чтобы вы знали, какая из двух команд завершилась неудачно. Это зависит от процессов npm
и newman
, возвращающих ненулевой код завершения при ошибке.
Это должно справиться с "неудачей". Обработка "зависания" была бы более сложной. На самом деле нет никакого способа узнать, вернется ли процесс когда-либо (читай: проблема остановки (одна вещь, которую я узнал в университете)).