2017-02-27 82 views
0

我對CodedUI測試自動化框架非常陌生。我遇到了TestContext,它有關於測試結果輸出和目錄的重要信息。 其實我創建了一個靜態Logger類,它將輸出數據寫入.txt文件。現在我想在TestResults文件夾下創建它。每次我運行測試方法時,它都會創建一個文件夾,然後是一些時間戳。我想在該位置創建我的Results.txt文件。 下面是我使用的代碼:我們可以將TextContext.TestDeploymentDir值分配給靜態類數據成員嗎?

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(); 


    } 
} 

現在我得到一個編譯時錯誤說A field initializer cannot reference the non-static field, method, or property TestContext.TestDeploymentDir.不知道如何解決這個錯誤,或者是否有可能或沒有?

+0

構造函數打算做什麼? 'var fs'的範圍侷限於空'using'塊,所以除了可能清空輸出流之外,它沒有任何有用的作用。 – AdrianHHH

+0

@AdrianHHH我只是截斷日誌文件。沒有指定的邏輯來做任何事情。只需在這裏清空文件。 –

回答

0

您將需要將logLocation標記爲靜態,因爲它包含在靜態類中。這很愚蠢,但是靜態類的所有成員也需要被標記爲靜態。我相信這是爲了防止在閱讀較大的類時出現混淆,因爲您看不到類聲明。接下來您當前的錯誤消息也說TestContextTestDeploymentDir未標記爲靜態,並且如果可能的話,您還需要修改它。如果沒有,你需要實現一個單例模式來提供該類的一個實例的靜態副本。根據班級工作的方式,這可能會也可能不會。

+0

'TestContext'是系統定義的dll的抽象類。不知道我是否可以在那做任何修改。此外,我已經嘗試使'logLocation'爲靜態,但它仍然顯示相同的錯誤。 –

+0

所以你肯定會需要保持'logLocation'靜態。由於編譯器還沒有到那麼遠,你只是沒有得到那個錯誤。如果'TestContext'是一個抽象類,'TestDeploymentDir'是一個實例成員(你的錯誤是這麼說的),你將需要實現抽象類(從它繼承並實現標記爲抽象的任何成員),然後創建一個單例模式讓你成爲一個靜態實例。然後您可以在字段初始值設定項中訪問該靜態實例。有點煩人,但完全有可能。 – Licht

0

終於想出了一個辦法來獲得out路徑的Coded UI框架。下面是我寫的代碼:

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將包含爲的TestContext.TestDeploymentDir相同的路徑。現在Results.txt將作爲Test Explorer的附件,我們可以看到輸出。

相關問題