2013-12-16 30 views
1

我正在研究BDD式自動測試庫,如果我能在異常消息中包含源代碼的失敗測試,​​那就太好了。我可以找到特定C#函數的源代碼文件名和行號範圍嗎?

假設我可以爬棧跟蹤來找到最能代表測試的函數,我可以使用像Roslyn這樣的工具來找到該函數的源代碼嗎?

通過進一步的解釋,我有測試看起來像這樣:

 public void CannotChangePasswordIfCurrentPasswordIsIncorrect() { 
     Given(
      App.ChangePasswordDialog.IsVisible, 
      App.ChangePasswordDialog.CurrentPassword.Is("InvalidPassword"), 
      App.ChangePasswordDialog.NewPassword.Is("ValidNewPassword"), 
      App.ChangePasswordDialog.ConfirmPassword.Is("ValidNewPassword") 
     ); 

     When(
      I.Click(App.ChangePasswordDialog.ChangePasswordButton) 
     ); 

     Then(
      App.ChangePasswordDialog.Alert.IsVisible, 
      App.ChangePasswordDialog.Alert.HasKeywords("current", "not correct") 
     ); 
    } 

如果測試失敗,我想在異常消息提供儘可能多的背景下,因爲我認爲除了作爲測試用戶界面。我目前包括諸如截圖的鏈接和整個測試視頻的鏈接等內容,如果我還可以包含測試的源代碼(因爲它非常易讀),那將會很好。這是一件小事情,但是在調試測試失敗時涉及到很多心理上下文切換,並且這將幫助您不必去查看測試嘗試執行的操作。

注意:我對單元測試與集成測試的討論不感興趣。這些是集成測試,是的,我們也有單元測試。

你可以假設:

  • 我有機會獲得源代碼,並可以提供解決方案文件的路徑
  • 我可以爬上異常調用堆棧得到一個System.Reflection.MethodBase 對象的引用它代表函數CannotChangePasswordIfCurrentPasswordIsIncorrect()。
  • 如果需要

所以我基本上需要linenumbers的文件名和範圍,其中該功能的源代碼直播我能提供PDB的。

+0

你會與源代碼嗎? – ChaosPandion

+1

編譯後的代碼不包含源代碼。堆棧跟蹤顯示您在何處查看源代碼。堆棧跟蹤對PDB文件更好,但沒有源代碼。我不知道BDD與這裏的任何東西有什麼關係,但是您可以使用反射器等工具對.NET進行一定程度的逆向工程。然後使用堆棧跟蹤手動導航到正確的位置。除此之外,您需要創建一些自定義代碼。這將是一個大項目本身。 –

+0

您可以嘗試使用Mono.Cecil對代碼進行反編譯,但是我不確定這實際上是否可行(或有用),因爲反編譯後的代碼不會與源代碼相同。 – Rafael

回答

0

This question有我正在尋找的信息。

基本上它是可以使用羅斯林索要特定功能的源:

string GetMethod(string filename, string methodName) 
{ 
    var syntaxTree = SyntaxTree.ParseFile(filename); 
    var root = syntaxTree.GetRoot(); 
    var method = root.DescendantNodes() 
        .OfType<MethodDeclarationSyntax>() 
        .Where(md => md.Identifier.ValueText.Equals(methodName)) 
        .FirstOrDefault(); 
    return method.ToString(); 
} 
0

可以用

var stackTrace = Environment.StackTrace; 

編輯很容易地訪問的源代碼,通過堆棧跟蹤:

堆棧跟蹤包含的代碼成員和的執行堆棧的代碼行。 所以你有源代碼名稱。

如果您使用* resharper,您可以按ctrl-c將該字符串複製到剪貼板。 * 然後CTRL-E T裏面的Visual Studio和resharper將顯示一個formnatted堆棧跟蹤。
然後,您可以按下源代碼錯誤,並在問題上打開編輯器。

編輯2:所以,因爲你想要「源代碼提取」和堆棧跟蹤。我的回答可能沒有幫助。
但請考慮哪些更有用。我將堆棧跟蹤存儲在系統日誌(db表)中。它比我更願意承認更有幫助;-)
取決於你的代碼是如何封裝的。引發異常的實際代碼可能沒有那麼有用。無論如何,只是我的看法。

+3

Stacktrace與源代碼不一樣。 – MAV

+0

添加有關源代碼的評論 –

+2

這仍然是回答錯誤的問題。他問他是否可以從他的測試庫中訪問正在執行的編譯代碼。 –

2

我無法想象這是一個好主意。我也不認爲這是可能的。除非你使用尚未編譯的表達式樹,否則在運行時反編譯msil幾乎是不可能的。即使可以,由於優化,某些代碼可能會完全不同。

+0

他們可能會讀取文件名和行號,如果他們正在運行一個調試版本。 – ChaosPandion

+0

@ChaosPandion,這實際上很聰明,因爲你可以閱讀堆棧跟蹤並找到你正在尋找的圖層。仍然看起來像一個幾乎沒有任何好處的高階訂單。 –

+0

看到我對這個問題的評論。我們可能沒有考慮到這一點。 – ChaosPandion

1

做到這一點很簡單 - 讓你的圖書館用戶指點你的源代碼。這樣,您可以查看堆棧跟蹤,轉到正確的文件並從那裏顯示源代碼行。

+0

是的但這就是我問 - 如何「去適當的文件,並顯示源代碼行」 – dbruning

+0

嗯,堆棧跟蹤(在調試版本至少)包含文件名和行號。如果您知道源文件的位置(請求用戶指向那裏),其餘部分很容易。 – zmbq

+0

「其餘很簡單」並不是那麼有用。給定一個文件中的行號,如何才能提取包含該行號的函數的文本? – dbruning

相關問題