2013-10-21 59 views
0

我一直在努力實現OpenCover在本地構建的一些我工作的各種API,以便爲我的團隊建立一個體面的測試報告結構。當試圖對我的NUnit測試運行覆蓋率時,我發現從生成的報告中省略了一些更重要的類,並且將訪問節點的各個對象設置爲false。OpenCover沒有在密封類上產生覆蓋率結果

我仍然收到適當的NUnit結果,並且知道我期望的覆蓋率結果是由於針對Visual Studio的內置工具進行驗證所致。這只是OpenCover無法正確報告。

這些對象中的任何一個都沒有報告,因爲我發現它們的共同線程似乎是密封。我猜OpenCover正在跳過這些類,併爲其報告結構使用某種反射類型,但由於我在一個非常嚴格的內部網絡上,我沒有機會查看源代碼來證明這一點。

有人遇到類似的事情或有任何提示來解決這個問題?當然,我不能從我的課程中刪除密封的關鍵字,因爲他們需要它。

編輯*這是我寫文章讚揚了類似的例子:

using System.Text; 
using NUnit.Framework; 

namespace OpenCover.Sealed.Test 
{ 
    using Helpers; 

    [TestFixture] 
    public class UtilityTest 
    { 
     [Test, Owner("Patrick Ramser")] 
     public void ConcatTest() 
     { 
      Utility utility = Utility.CreateNewUtility(); 

      string concatMsg = utility.Concat 
       ("1:{0} 2:{1} 3:{2}", "FIRST", "SECOND", "THIRD"); 

      Assert.AreEqual 
       (concatMsg, "1:FIRST 2:SECOND 3:THIRD", "Wrong message returned!"); 
     } 
    } 
} 

namespace OpenCover.Sealed.Helpers 
{ 
    public sealed class Utility 
    { 
     internal Utility() 
     { 

     } 

     public static Utility CreateNewUtility() 
     { 
      return new Utility(); 
     } 

     public string Concat(string message, params string[] lstStrings) 
     { 
      StringBuilder builder = new StringBuilder(message); 

      for (int i = 0; i < lstStrings.Length; i++) 
      { 
       builder.Replace("{" + i + "}", lstStrings[i]); 
      } 

      return builder.ToString(); 
     } 
    } 
} 

當同時使用NUnit的和新的試驗裝置,我只是引用:

D:\exes\OpenCover\OpenCover.Console.exe 
-target:"D:\TestRunners\nunit.console.exe" 
-targetargs:"/nologo /domain=Single /xml=C:\NUnit\Artifacts\nunit-results.xml 
D:\OpenCover.Sealed.Test\bin\Debug\OpenCover.Sealed.Test.dll" 
-output:"C:\NUnit\Artifacts\coverage.xml" 
-register 
-filter:"+[OpenCover.Sealed*]*" 
-returntargetcode 

沒有空格或格式化爲我運行的批處理腳本,我只是將它限制在行之間以使其更具可讀性。

內部結構是否會造成任何問題?

+0

OpenCover沒有密封類的已知問題,您是否能夠提供複製問題的示例。如果你使用nunit你使用的是什麼參數?你有沒有試過'-noisolation'開關?或者,您也可以嘗試使用'-mergebyhash'開關合並來自多個位置的覆蓋率結果。 –

+0

我的NUnit參數沒有什麼特別之處,只是:「/ nologo/domain = Single /xml=C:\NUnit\Artifacts\nunit-results.xml」。結果集也填寫正確,並有正確的結果顯示通過我的測試。 我對OpenCover本身使用-returntargetcode,-register和-filter屬性,它們看起來工作正常。實現沒有隔離和哈希合併似乎沒有影響我注意到的任何事情。我仍然相信這是程序化的東西,但我不能說出它是什麼,因爲OpenCover只是跳過代碼。 –

+0

嗨帕特里克,我已經把你的示例代碼,我不能重複你的問題(密封類的100%覆蓋率) - 我已將我編譯的項目放在[dropbox](https://dl.dropboxusercontent.com/u/ 16543630/OpenCover/Sealed.zip)供您查看。 我已經使用了相同的參數,但應用程序位置不同,我也使用了-register:user(但不應該有所作爲)。 程序集是否進行了任何可能影響opencover注入其代碼的修改(混淆),這些修改是基於從PDB收集的代碼? –

回答

0

我相信我可能已經想通了我的問題。這個問題並沒有最終成爲密封類,而是那些類沒有正確使用NUnit &被測試的庫。

我把我所有的資源都放在同一個目錄下&改變了NUnit在沒有應用程序的情況下運行。域(使用/domain = none參數)&似乎解決了我的問題。我猜測我的自定義NUnit代碼創建了另一個應用程序。域&我的大多數測試庫位於不同的位置,導致運行代碼OpenCover需要執行。

我收到的(我現在發現的)不好的結果是來自我的自定義亞軍,只能通過運行OpenCover,它不會觸及我的任何密封對象。我甚至沒有按照設置的方式使用測試庫。真的很抱歉誤解,肖恩!覆蓋面報告非常有效&結果現在正是我所需要的。

+0

我對你的設置很感興趣,爲什麼OpenCover沒有在其他應用程序域中找到代碼。如果您有機會創建可重複使用的場景,或者可以提供更多詳細信息,以便我可以重複一次,則可以創建修復程序。 –

+0

我已經從我的自定義NUnit代碼中刪除了應用程序域,現在唯一使用的就是NUnit本身。因此,看起來好像OpenCover,NUnit控制檯運行程序和我的測試庫都在單獨的目錄中,而NUnit使用單個或多個域時覆蓋率報告不會生成。在這種情況下,OpenCover只考慮我的NUnit Console Runner。 –

+0

有趣的是,我會看看我是否可以複製 - 您是否嘗試過在這些場景中使用'/ noshadow'開關? –

相關問題