我一直致力于在我工作的各种API的本地构建中实施 OpenCover ,以便为我的团队获得体面的测试报告结构。在尝试针对我的NUnit测试运行覆盖时,我发现生成的报告中忽略了一些更重要的类,并且将访问节点设置为false。
我仍然收到正确的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 :(得分:0)
我相信我可能已经弄清楚了我的问题。问题并没有最终成为密封的类,而是这些类没有正确使用NUnit&amp;经过测试的图书馆。
我将所有资源都放到同一目录中将NUnit更改为无应用程序运行。域名(使用 / domain = none 参数)&amp;这似乎解决了我的问题。我猜测我的自定义NUnit代码会创建另一个应用程序。域名和域名我的大多数测试库都位于不同的位置,导致运行代码 OpenCover 之间需要执行一些脱节。
我收到的糟糕结果(我现在发现的)来自我的自定义运行器,仅通过 OpenCover 运行,它不会触及我的任何密封对象。我甚至没有像设置它那样使用测试库。真的很抱歉这个误会,肖恩!覆盖率报告非常有效。结果现在正是我所需要的。