Visual Studio代码覆盖率未显示所有程序集

8

我在我的.SLN文件中有20个项目。我通过测试资源管理器运行单元测试并生成代码覆盖率。但只有其中的八个项目显示在覆盖率报告中(如屏幕截图所示)。我使用了一个runsettings文件,在该文件中我已注释掉所有的<exclude>标签内容,如下:

        <PublicKeyTokens>
          <!-- Exclude Visual Studio extensions: -->
          <Exclude>
            <!--
            <PublicKeyToken>^B77A5C561934E089$</PublicKeyToken>
            <PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken>
            <PublicKeyToken>^31BF3856AD364E35$</PublicKeyToken>
            <PublicKeyToken>^89845DCD8080CC91$</PublicKeyToken>
            <PublicKeyToken>^71E9BCE111E9429C$</PublicKeyToken>
            <PublicKeyToken>^8F50407C4E9E73B6$</PublicKeyToken>
            <PublicKeyToken>^E361AF139669C375$</PublicKeyToken>
            -->
          </Exclude>
        </PublicKeyTokens>

我不明白为什么其他12个项目在覆盖率结果中没有显示出来。有任何想法吗?
解决方案项目: Visual Studio Project Listing 代码覆盖率结果: enter image description here

在测试运行期间,其他项目的程序集是否被加载?如果没有,则这可能解释了为什么它们没有显示出来。 - Shaun Wilde
不,我认为他们不是。最简单的方法是什么?编写一个至少涵盖一个类的测试? - michaelkoss
那可能就可以了。 - Shaun Wilde
4个回答

11

在目标.csproj文件中添加 <DebugType>Full</DebugType> 对我有用

<PropertyGroup>
     <TargetFramework>netstandard2.0</TargetFramework>
     <DebugType>Full</DebugType>
</PropertyGroup>

1
在使用VS Enterprise 2017时遇到了这个问题,这个方法解决了它。 - Nathan
谢谢,谢谢,谢谢 - 这刚好解决了我的VS Pro 2019问题,使用DotCover(Resharper) - 我的一个项目拒绝出现在我的覆盖率报告中!! - yeti_c

11
装配件没有显示出来,因为它们在当前测试运行期间未加载。
添加一些简单的测试,使用其他每个装配件中的类型。

0

虽然这是古老的线程,但如果有人添加了一个项目并且没有添加任何测试甚至没有引用新的程序集来获取代码覆盖率数据,我需要做这个。上面的解决方案都不起作用...比我想象中还要麻烦,但这对我有效。

请注意,如果您不确保在非常结束时运行此操作,您将在此代码之后加载的库的CodeCoverage输出中获得重复项,因此如果您有多个测试项目,则不确定该如何处理,因为我不知道是否存在“TestRunCleanupAttribute”。

        [AssemblyCleanup]
        public static void LoadAllAssemblies()
        {
            var existingAssemblies = AppDomain.CurrentDomain.GetAssemblies().Where(x => !x.IsDynamic).Select(x => new FileInfo(x.Location).Name).ToList();

            var testAssembly = new FileInfo(Assembly.GetExecutingAssembly().Location);
            DirectoryInfo di = testAssembly.Directory.Parent.Parent.Parent; // specific to your solution structure
            var assemblies = di.GetFiles("*MyCommonDllName*.dll", SearchOption.AllDirectories);
            assemblies.Concat(di.GetFiles("*MyCommonDllName*.exe", SearchOption.AllDirectories));

            foreach (var assem in assemblies)
            {
                if (!existingAssemblies.Contains(assem.Name))
                {
                    Assembly.LoadFile(assem.FullName);
                    existingAssemblies.Add(assem.Name);
                }
            };
        }

-1

你能不能也加上呢:

      <CodeCoverage>
        <ModulePaths>
          <Include>
             <!--Include all loaded .dll assemblies and .exe executables-->
            <ModulePath>.*\.dll$</ModulePath>
            <ModulePath>.*\.exe$</ModulePath>
          </Include>
        </ModulePaths>            

      </CodeCoverage>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接