Как мне заставить RedirectStandardOutput работать в NUnit? - PullRequest
0 голосов
/ 02 декабря 2011

Я работаю над стратегией автоматизации для нашей группы контроля качества, и мне нужно иметь возможность фиксировать вывод сценариев и EXE-файлов. Когда я запускаю этот код как консольное приложение, я могу успешно записать вывод plink.exe:

class Program
{
    static void Main(string[] args)
    {
        Process process = new Process();
        process.StartInfo.FileName = @"C:\Tools\plink.exe";
        process.StartInfo.Arguments = @"10.10.9.27 -l root -pw PASSWORD -m C:\test.sh";
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.Start();

        string output = process.StandardOutput.ReadToEnd();
        process.WaitForExit();

        output = output.Trim().ToLower(); // Output is successfully captured here

        if (output == "pass")
        {
            Console.WriteLine("Passed!");
        }
    }
}

Выполнение этой команды занимает около минуты, и я успешно записываю результаты в выходную переменную.

Однако, когда я компилирую тот же код, что и DLL, и запускаю через NUnit, код завершается немедленно и завершается неудачно со значением output == NULL:

[TestFixture]
public class InstallTest
{
    [Test]
    public void InstallAgentNix()
    {
        Process process = new Process();
        process.StartInfo.FileName = @"C:\Tools\plink.exe";
        process.StartInfo.Arguments = @"10.10.9.27 -l root -pw PASSWORD -m C:\test.sh";
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.Start();

        string output = process.StandardOutput.ReadToEnd();

        process.WaitForExit();

        output = output.Trim().ToLower();

        Assert.AreEqual("pass", output, "Agent did not get installed");
    }
}

Я сузил проблему до линии string output = process.StandardOutput.ReadToEnd(). Если я прокомментирую строку, время выполнения составляет около минуты, и операция успешно выполняется на удаленном компьютере (test.sh выполняется на удаленном компьютере linux).

Надеюсь, мне не хватает чего-то простого - я не хочу искать другой тестовый комплект.

РЕДАКТИРОВАТЬ: Похоже на (нерешенный) вопрос здесь: Почему процесс, запущенный в dll, работает при тестировании с помощью консольного приложения, но не при вызове другой dll?

Ответы [ 2 ]

0 голосов
/ 30 августа 2013

Как вы сами нашли, добавив строку

process.StartInfo.RedirectStandardOutput = true;

решает проблему. NUnit должен установить другой уровень косвенности. Спасибо за ваш собственный ответ, который спас меня от мучительного расследования.

Хотя я не думаю, что проблема связана с различием между dll / exe, поскольку я столкнулся с этим в тестовом проекте, скомпилированном как консольное приложение.

0 голосов
/ 02 декабря 2011

Хорошо, это заняло у меня всю ночь, но я понял это.Я должен RedirectStandardInput в дополнение к перенаправлению стандартного вывода, чтобы это работало.

Вот исправленный код, который работает в DLL.Как к сведению, это исправление решает проблему в приложении WinForms:

[TestFixture]
public class InstallTest
{
    [Test]
    public void InstallAgentNix()
    {
        Process process = new Process();
        process.StartInfo.FileName = @"C:\Tools\plink.exe";
        process.StartInfo.Arguments = @"10.10.9.27 -l root -pw PASSWORD -m C:\test.sh";
        process.StartInfo.UseShellExecute = false;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.RedirectStandardInput = true;
        process.Start();

        string output = process.StandardOutput.ReadToEnd();

        process.WaitForExit();

        output = output.Trim().ToLower();

        Assert.AreEqual("pass", output, "Agent did not get installed");
    }
}
...