2017-02-27 10 views
0

Je suis très nouveau dans le framework d'automatisation de test CodedUI. Je suis tombé sur TestContext qui a les informations importantes concernant les sorties de résultats de test et les répertoires. En fait, j'ai créé une classe statique Logger qui écrit les données de sortie dans un fichier .txt. Maintenant, je veux le créer sous le dossier TestResults. Chaque fois que j'exécute la méthode de test, il crée un dossier suivi d'un horodatage. Je veux créer mon fichier Results.txt à cet endroit. Ci-dessous le code que je utilise:Pouvons-nous attribuer une valeur TextContext.TestDeploymentDir à un membre de données de classe statique?

public static class Logger 
{ 

    string logLocation = TestContext.TestDeploymentDir + "\\Results.txt"; 


    static Logger() { 
     File.Create(logLocation); 
     using (var fs = new FileStream(logLocation, FileMode.Truncate)) 
     { 
     } 
    } 

    public static void ResultLog(int testcasenum,String Expected,String Actual, String textResult) 
    { 

     FileInfo outtxt = new FileInfo(logLocation); 

     StreamWriter logline = outtxt.AppendText(); 


     logline.WriteLine("Test Case : " + testcasenum); 
     logline.WriteLine("{0},{1},{2}", "Expected - "+Expected, "Actual - "+Actual, "Result - "+textResult); 

     // flush and close file. 

     logline.Flush(); logline.Close(); 


    } 
} 

Maintenant, je reçois une erreur de compilation disant A field initializer cannot reference the non-static field, method, or property TestContext.TestDeploymentDir. Je ne sais pas comment résoudre cette erreur ou s'il est possible ou non?

+0

Que doit faire le constructeur? La portée de 'var fs' est limitée au bloc' using' vide, de sorte qu'il n'a aucun effet utile au-delà, éventuellement, de la vidange du flux de sortie. – AdrianHHH

+0

@AdrianHHH Je ne fais que tronquer le fichier journal. Aucune logique spécifiée pour faire quoi que ce soit. Juste vider le fichier ici. –

Répondre

0

Vous aurez besoin de marquer logLocation comme statique car il est contenu dans une classe statique. C'est un peu idiot mais tous les membres d'une classe statique doivent aussi être marqués statiques. Je crois que c'est pour éviter la confusion lors de la lecture de classes plus grandes où vous ne pouvez pas voir la déclaration de classe. Ensuite, votre message d'erreur actuel indique également TestContext. TestDeploymentDir n'est pas marqué comme statique et vous devrez également le modifier si possible. Sinon, vous devrez implémenter un modèle singleton pour fournir une copie statique d'une instance de cette classe. Selon la façon dont cette classe fonctionne, cela peut être possible ou non.

+0

'TestContext' est une classe abstraite de dll définie par le système. Je ne sais pas si je peux apporter des modifications à cela. Aussi j'ai essayé de rendre 'logLocation' comme statique mais il a quand même montré la même erreur. –

+0

Donc, vous aurez certainement besoin de garder la 'logLocation' statique à coup sûr. Vous n'obtenez tout de même pas cette erreur puisque le compilateur n'a pas été aussi loin. Si 'TestContext' est une classe abstraite et' TestDeploymentDir' est un membre d'instance (votre erreur le dit), vous devrez implémenter la classe abstraite (en hériter et implémenter tous les membres marqués abstract), puis créer un pattern singleton pour vous obtenir une instance statique. Vous pouvez ensuite accéder à cette instance statique dans votre initialiseur de champ. Peu agaçant, mais entièrement possible. – Licht

0

Enfin trouvé un moyen d'obtenir le chemin out du cadre Coded UI. Ci-dessous le code que je l'ai écrit:

public static class Logger 
{ 
    static string uripath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\Results.txt"; 
    public static string logLocation = new Uri(uripath).LocalPath; 

    static Logger() { 

     using (File.Create(logLocation)) 
     { } 
     using (var fs = new FileStream(logLocation, FileMode.Truncate)){} 
    } 
    public static void ResultLog(int testcasenum,String Expected,String Actual, String textResult) 
    { 

     FileInfo outtxt = new FileInfo(logLocation); 

     StreamWriter logline = outtxt.AppendText(); 


     logline.WriteLine("Test Case : " + testcasenum); 
     logline.WriteLine("{0},{1},{2}", "Expected - "+Expected, "Actual - "+Actual, "Result - "+textResult); 

     // flush and close file. 

     logline.Flush(); logline.Close(); 


    } 
} 

uripath contiendra le même chemin que celui de TestContext.TestDeploymentDir. Maintenant Results.txt viendra en pièce jointe dans Test Explorer et nous pouvons voir la sortie.