如何让RedirectStandardOutput在NUnit中工作?

时间:2011-12-01 23:56:20

标签: c# nunit processstartinfo redirectstandardoutput

我正在为QA小组制定自动化策略,并且需要能够捕获脚本和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运行时,代码立即完成并失败,输出值== 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盒子上执行)。

我希望我遗漏一些简单的东西 - 我不想找到不同的测试工具。

编辑:看起来类似于(未解决的)问题:Why does a process started in dll work when tested using console application but not when called by another dll?

2 个答案:

答案 0 :(得分:0)

好的,我花了一整夜,但我想通了。除了重定向标准输出之外,我还需要RedirectStandardInput才能工作。

这是在DLL中工作的固定代码。作为一个FYI,此修复程序也解决了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");
    }
}

答案 1 :(得分:0)

正如您自己找到的那样,添加一行

process.StartInfo.RedirectStandardOutput = true;

解决了这个问题。 NUnit必须设置另一个间接级别。感谢您自己的回答,这使我免于痛苦的调查。

虽然我认为问题不是来自dll / exe之间的区别,因为我在编译为控制台应用程序的测试项目中遇到了这个问题。