Nunit OpenCover未在密封类上生成覆盖率结果

Nunit OpenCover未在密封类上生成覆盖率结果,nunit,code-coverage,opencover,Nunit,Code Coverage,Opencover,为了为我的团队构建一个像样的测试报告结构,我一直在致力于在本地构建的各种API中实现OpenCover。但是,当尝试对NUnit测试运行覆盖率时,我发现生成的报告中忽略了一些更重要的类,并将相应对象的已访问节点设置为false 我仍然会收到正确的NUnit结果,并且知道我期望的覆盖率结果是由于使用Visual Studio的内置工具进行验证而产生的。只是OpenCover未能正确报告 正如我所发现的,这些未报告对象的共同点似乎是它们是密封的。我猜,OpenCover正在跳过这些类,并使用某种类型

为了为我的团队构建一个像样的测试报告结构,我一直在致力于在本地构建的各种API中实现OpenCover。但是,当尝试对NUnit测试运行覆盖率时,我发现生成的报告中忽略了一些更重要的类,并将相应对象的已访问节点设置为false

我仍然会收到正确的NUnit结果,并且知道我期望的覆盖率结果是由于使用Visual Studio的内置工具进行验证而产生的。只是OpenCover未能正确报告

正如我所发现的,这些未报告对象的共同点似乎是它们是密封的。我猜,OpenCover正在跳过这些类,并使用某种类型的反射作为它的报告结构,但我没有机会查看源代码来证明这一点,因为我在一个非常严格的内部网络上

有没有人遇到过类似的情况,或者有什么方法可以克服这个问题?一、 当然,不能从我的类中删除sealed关键字,因为它们需要它

Edit*下面是我写的一个类似的例子:

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&测试库一起正确使用

我把我所有的资源都放在同一个目录下&把NUnit改为不在任何应用程序中运行。domain(使用/domain=none参数)&这似乎解决了我的问题。我猜我的自定义NUnit代码创建了另一个应用程序。域&我的大多数测试库都位于不同的位置,这导致运行中的代码OpenCover需要执行的代码之间出现一些断开


我收到的坏结果(我现在发现)来自我的自定义runner,它只运行在OpenCover中,而OpenCover不接触我的任何密封对象。我甚至没有按照设置的方式使用测试库。真的很抱歉误会了,肖恩!“coverage”报告工作得很好&结果现在正是我所需要的。

OpenCover在密封类方面没有已知的问题,您是否能够提供一个复制该问题的示例。如果您使用nunit,您使用的参数是什么?您是否尝试过
-noisolation
开关?或者,您也可以尝试使用
-mergebyhash
开关来合并来自多个位置的覆盖率结果。我的NUnit参数没有什么特别之处,只是:“/nologo/domain=Single/xml=C:\NUnit\Artifacts\NUnit results.xml”。结果集也会正确填充,并具有正确的结果,显示我的测试通过。我为OpenCover本身使用了-returntargetcode、-register和-filter属性,它们似乎工作得很好。通过哈希实现无隔离和合并似乎并没有影响我注意到的任何事情。我仍然相信这是一个程序性的东西,但我不知道它是什么,因为OpenCover只是跳过了代码。嗨,Patrick,我已经获取了你的示例代码,不幸的是我不能重复你的问题(100%覆盖密封类)-我已经将我编译的项目放在上面让你看。我使用了相同的参数,但应用程序位置不同,我还使用了-register:user(但这不应该有什么区别)。程序集是否经过任何可能影响opencover根据从PDB收集的内容注入其代码的修改(模糊处理)?我对您的设置很感兴趣,因为opencover没有在这些其他AppDomain中找到代码。如果您有机会创建一个可重复的场景,或者可以提供更多详细信息以便我可以重复,我可能可以创建一个修复程序。我已经从自定义NUnit代码中删除了应用程序域,现在唯一使用它的似乎是NUnit本身。因此,如果OpenCover、NUnit控制台运行程序和我的测试库位于不同的目录中,而将NUnit用于单个或多个域,则覆盖率报告将不会生成。在本例中,OpenCover只考虑我的NUnit控制台运行程序。有趣的是,我将看看我是否可以复制-您在这些场景中也尝试过
/noshadow
开关吗?
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