是否可以在互操作程序集上进行代码覆盖率分析?

时间:2020-03-06 14:24:38  来源:igfitidea点击:

我也在MSDN论坛上也提出了这个问题,但没有找到解决方法:

http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3686852&SiteID=1

正如我所看到的,这里的基本问题是互操作程序集实际上不包含任何可以检测的IL(也许有几个委托除外)。因此,尽管我可以组成一个测试互操作层的测试项目,但是我却无法理解我实际上调用了多少方法和属性。

计划B是要编写一个代码生成器,该代码生成器创建RCWW(运行时可调用包装器)库,并为代码覆盖目的而对其进行检测。

编辑:@Franci Penov,

是的,这正是我想要做的。提供给我们的COM组件构成了一个包含大约10个DLL的DLL库。 3000种。我们在应用程序中使用该库,并负责测试Interop层,因为将库交付给我们的小组进行的测试最少。代码覆盖率将使我们能够确保所有接口和共同类均得到行使。这就是我要尝试做的所有事情。我们有单独的测试项目,它们执行我们自己的托管代码。

是的,理想情况下,COM服务器团队应该测试和分析他们自己的代码,但是我们并不生活在理想的世界中,我必须根据他们的工作提供高质量的产品。如果可以产生一份测试报告,表明我已经测试了他们80%的代码接口,而50%的代码接口不按广告说明工作,那么我可以在需要完成修复的地方完成修复,而无需解决问题。

我们提到的模拟层将很有用,但最终不会实现测试Interop层本身的目标,我当然也不想手动维护它-我们在COM专家的支配下更改接口。

就像我上面提到的那样,下一步是为包装器生成包装器,并为测试目的对包装器进行检测。

解决方案

要回答问题,无法使用互操作程序集进行代码覆盖。它们仅包含元数据,并且不包含我们自己提到的可执行代码。

此外,在尝试覆盖互操作程序集的代码方面,我没有多大意义。我们应该测量所编写代码的代码覆盖率。

在我们提到的MDN论坛线程中,在我看来,我们实际上实际上是想衡量代码如何使用COM组件。除非代码目标是枚举并显式调用COM对象的所有方法和属性,否则我们无需测量代码覆盖率。我们需要进行单元/方案测试,以确保代码在正确的时间调用正确的方法/属性。

恕我直言,正确的方法是为COM对象编写一个模拟层,并测试我们是否按预期调用了所有方法/属性。

计划C:

使用Mono.Cecil之类的东西将简单的执行计数器编织到interop程序集中。例如,请查看常见问题解答中的这一部分:"我想向无法调试的程序集添加一些跟踪功能,是否可以使用Cecil?