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