Как обработать NPM / сбой / зависание Ньюмена при исполнении через консоль C # - PullRequest
1 голос
/ 09 апреля 2019

У меня есть метод, созданный в C # (как показано ниже), который выполняет несколько команд npm / newman через консольное приложение C #.Текущий код обрабатывает, если cmd зависает / не удается, но не обрабатывает случай, если выполнение nmp / 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("newman run " +
            "\"C:\\Postman\\Test.postman.json\" " +
            "--folder \"TestSearch\" " +
            "--environment \"C:\\Postman\\postman_environment.json\" " +
            "--disable-unicode");
        pNpmRun.StandardInput.WriteLine("exit");

          var tenMin = 10 * 60 * 1000;
          if(pNpmRun.WaitForExit(tenMin)) {
             return pNpmRun.StandardOutput.ReadToEnd();
          } else {
             pNpmRun.Kill();
             throw new TimeoutException("Command didn't complete in 10 minute timeout");
          }
    }

1 Ответ

1 голос
/ 10 апреля 2019

Вы можете проверить код выхода ваших команд 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, возвращающих ненулевой код завершения при ошибке.

Это должно справиться с "неудачей". Обработка "зависания" была бы более сложной. На самом деле нет никакого способа узнать, вернется ли процесс когда-либо (читай: проблема остановки (одна вещь, которую я узнал в университете)).

...