OpenCover不会在密封类上生成覆盖结果

时间:2013-10-21 21:10:27

标签: nunit code-coverage opencover

我一直致力于在我工作的各种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

我运行的批处理脚本没有空格或格式,我只是在行之间限制它以使其更具可读性。

内部成员是否会造成任何问题?

1 个答案:

答案 0 :(得分:0)

我相信我可能已经弄清楚了我的问题。问题并没有最终成为密封的类,而是这些类没有正确使用NUnit&amp;经过测试的图书馆。

我将所有资源都放到同一目录中将NUnit更改为无应用程序运行。域名(使用 / domain = none 参数)&amp;这似乎解决了我的问题。我猜测我的自定义NUnit代码会创建另一个应用程序。域名和域名我的大多数测试库都位于不同的位置,导致运行代码 OpenCover 之间需要执行一些脱节。

我收到的糟糕结果(我现在发现的)来自我的自定义运行器,仅通过 OpenCover 运行,它不会触及我的任何密封对象。我甚至没有像设置它那样使用测试库。真的很抱歉这个误会,肖恩!覆盖率报告非常有效。结果现在正是我所需要的。