Question

Je travaille sur une stratégie d'automatisation pour notre groupe d'assurance qualité et doivent être en mesure de capturer la sortie des scripts et des fichiers EXE. Quand je lance ce code comme une application console, je suis en mesure de saisir avec succès la sortie de 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!");
        }
    }
}

Cette commande prend environ une minute pour exécuter et je réussi à capturer les résultats à la variable de sortie.

Cependant, quand je compile le même code que DLL et exécuter par NUnit, le code reprend immédiatement et échoue avec la valeur de sortie == 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");
    }
}

J'ai réduit le problème à la ligne string output = process.StandardOutput.ReadToEnd(). Si je commente la sortie de ligne, le temps d'exécution est d'environ une minute et l'opération est exécutée avec succès sur la machine distante (test.sh est exécuté sur une boîte de Linux à distance).

J'espère que je manque quelque chose simple - je ne veux pas avoir à trouver un harnais de test différent

.

EDIT: ressemble à la question (sans solution) ici: Pourquoi un processus a commencé en dll travail lors des tests en utilisant l'application de la console mais pas lorsqu'il est appelé par une autre dll?

Était-ce utile?

La solution

Ok, il m'a fallu toute la nuit, mais je compris. Je dois RedirectStandardInput en plus de rediriger la sortie standard pour que cela fonctionne.

Voici le code fixe qui fonctionne dans une DLL. En tant que votre information, ce correctif résout le problème dans une application WinForms ainsi:

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

Autres conseils

Comme vous l'avez trouvé par vous-même, en ajoutant la ligne

process.StartInfo.RedirectStandardOutput = true;

résout le problème. NUnit doit mettre en place un autre niveau d'indirection. Merci pour votre réponse qui m'a sauvé de l'enquête douloureuse.

Bien que je ne pense pas que la question vient de la différence entre dll / exe depuis que je rencontrais cela dans un projet de test compilé comme une application de la console.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top