2014-10-06 111 views
1

我以前見過這個討論過幾次,我不確定這是否對我來說是最好的事情,所以有任何改進的建議都會受到歡迎。獲取傳遞給方法的變量的聲明名稱C#

我想爲我的Selenium測試建立一些詳細的日誌記錄。

我有一個方法調用,它是:

Admin_Login.Username.SetText("MyUsername"); 

Admin_Login僅僅是一個標準的類。但是「用戶名」是傳遞到「的setText」方法的變量,如下圖所示:

public static void SetText(this By identifier, string value) 
{ 
    StackTrace stackTrace = new StackTrace(); 
    string methodName = stackTrace.GetFrame(1).GetMethod().Name; 
    string className = stackTrace.GetFrame(1).GetMethod().DeclaringType.FullName; 


    //I do some logging here for the manual testers so they can debug after a run 
    TestDriver.ResultsLog.LogComment("Class: " + className); 
    TestDriver.ResultsLog.LogComment("Calling Method: " + methodName); 
    TestDriver.ResultsLog.LogComment("Calling Element: " + identifier.toString()); 

    IWebElement element = WebDriver.driver.FindElementSafe(identifier); 
    ((IJavaScriptExecutor)WebDriver.driver).ExecuteScript("arguments[0].value = arguments[1]", element, value); 
} 

以供參考,在這裏是管理類:

public class Admin_Login 
{ 
    public static By Username = By.Id("ctl00_MainContent_ctlLoginView_ctlLogin_UserName"); 
} 

所以我可以登錄類名和方法名稱很好,但我需要找到的是傳入方法的「標識符」變量的聲明名稱。

所以在這種情況下,值應該是「用戶名」。

我已經嘗試了一些建議,產生標識符的名稱作爲「標識符」,但這真的不是我想要的。我需要知道哪個對象的SetText方法被關閉,如果這是有道理的。

正如我所說,也許我不會這樣做的正確方式,所以任何建議都會有所幫助。

+0

這也有助於有什麼用「手動測試人員「?如果他們有權訪問調試器並希望使用調試器,他們應該使用它。 – Arran 2014-10-06 16:32:23

+0

手動測試人員不是編碼人員,因此他們將分析HTML結果日誌,告訴他們測試失敗的原因以及原因。這樣他們就可以向自動化團隊或其團隊中的開發人員報告。 他們不希望使用調試器。 調試不一定要使用物理調試器工具:) – Festivejelly 2014-10-08 08:24:16

回答

1

我不能相信我居然建議,因爲該解決方案有多髒這個......但,這是一個解決方案... ... SOOOOO

class Program 
{ 
    static void Main() 
    { 
     var foo = new Foo(); 
     var bar = foo; 

     foo.Hit(); 
     bar.Hit(); 
    } 
} 

public static class Extensions 
{ 
    public static void Hit(this Foo foo, [CallerMemberName] string name = null, [CallerFilePath] string path = null, [CallerLineNumber] int lineNumber = -1) 
    { 
     string callerVariableName; 

     using (FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read)) 
     { 
      StreamReader reader = new StreamReader(stream); 
      string csharpFile = reader.ReadToEnd(); 
      string[] lines = csharpFile.Split('\n'); 
      string callingLine = lines[lineNumber - 1]; 

      Match matchVariableName = Regex.Match(callingLine, @"([a-zA-Z]+[^\.]*)\.Hit\(\)"); 

      callerVariableName = matchVariableName.Groups[1].Value; 
     } 

     Console.WriteLine("\n///////////////////////////////"); 
     Console.WriteLine("Caller method name: {0}", name); 
     Console.WriteLine("Caller variable name: {0}", callerVariableName); 
     Console.WriteLine("File Path:   {0}", path); 
     Console.WriteLine("Line number:   {0}", lineNumber); 

    } 
} 

public class Foo 
{ 
} 
+0

謝謝艾登,我會試試看。 有時候骯髒的解決方案是獨特的問題需要! :) – Festivejelly 2014-10-06 07:32:15

+0

這似乎爲我工作。我只是想知道這是否會運行在本地機器運行單元測試通過DLL,因爲它不會有權訪問C#文件? – Festivejelly 2014-10-06 08:15:14