0

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

我仍然收到正确的 NUnit 结果,并且知道我期望的覆盖结果是由于运行 Visual Studio 的内置工具来验证的。只是OpenCover无法正确报告。

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

有人遇到类似的事情或有任何技巧来克服这个问题吗?当然,我不能只从我的类中删除sealed关键字,因为他们需要它。

编辑*这是我写的一个类似的例子:

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

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

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

4

1 回答 1

0

我相信我可能已经弄清楚了我的问题。问题并没有最终成为密封类,而是这些类没有与 NUnit 和测试库一起正确使用。

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

我收到的坏结果(我现在发现)来自我的自定义跑步者,它只通过OpenCover运行,它不会触及我的任何密封对象。我什至没有按照设置的方式使用测试库。真的很抱歉造成误会,肖恩!覆盖率报告效果很好,结果现在正是我所需要的。

于 2013-10-23T15:25:14.967 回答