WedX - журнал о программировании и компьютерных науках

Как заставить RedirectStandardOutput работать в NUnit?

Я работаю над стратегией автоматизации для нашей группы контроля качества, и мне нужно иметь возможность фиксировать выходные данные сценариев и 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-файла?


Ответы:


1

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

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

[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");
    }
}
02.12.2011

2

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

process.StartInfo.RedirectStandardOutput = true;

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

Хотя я не думаю, что проблема связана с разницей между файлом DLL и файлом EXE, поскольку я столкнулся с этим в тестовом проекте, скомпилированном как консольное приложение.

30.08.2013
Новые материалы

Как создать диаграмму градиентной кисти с помощью D3.js
Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


Для любых предложений по сайту: [email protected]