我在MSDN论坛上也提出了这个问题并且没有找到解决方案:
http://forums.microsoft.com/msdn/ShowPost.aspx?PostID=3686852&SiteID=1
我认为这里的基本问题是互操作程序集实际上并不包含任何可以检测的IL(可能只有少数代表除外)。所以,虽然我可以整理一个练习互操作层的测试项目,但我无法理解我实际调用的那些方法和属性中有多少。
计划B是去编写一个代码生成器,它创建一个RCWW库(Runtime Callable Wrapper Wrappers),并为了代码覆盖而设备。
编辑:@Franci Penov,
是的,这正是我想要做的。交付给我们的COM组件构成了一个包含大约几十个DLL的库。 3000种类型。我们在我们的应用程序中使用该库,并负责测试Interop层,因为向我们提供库的组进行了最少的测试。代码覆盖将允许我们确保行使所有接口和coclass。这就是我要做的一切。我们有单独的测试项目,可以使用我们自己的托管代码。
是的,理想情况下,COM服务器团队应该测试和分析他们自己的代码,但我们不是生活在一个理想的世界中,而是我必须根据他们的工作提供高质量的产品。如果可以生成测试报告,表明我已经测试了80%的代码接口,其中50%的代码接口没有像宣传的那样工作,我可以在需要修复的地方完成修复,而不是解决问题。
你提到的模拟层很有用,但最终不会达到测试Interop层本身的目的,我当然不希望手工维护它 - 我们受COM的支配关于接口变化的人。
就像我上面提到的那样 - 下一步是为包装器生成包装器并将其用于测试目的。
答案 0 :(得分:1)
要回答您的问题 - 无法检测互操作程序集以进行代码覆盖。它们只包含元数据,并且没有你自己提到的可执行代码。
此外,我没有看到尝试对互操作程序集进行代码覆盖的重点。您应该测量您编写的代码的代码覆盖率。
从您提到的MDN论坛主题中,我觉得您实际上想要衡量代码如何使用COM组件。除非您的代码的目标是枚举并显式调用COM对象的所有方法和属性,否则您无需测量代码覆盖率。您需要进行单元/场景测试,以确保您的代码在正确的时间调用正确的方法/属性。
Imho,正确的方法是为COM对象编写一个模拟层,并测试您是否按预期调用了所有方法/属性。答案 1 :(得分:0)
计划C:
使用Mono.Cecil之类的东西将简单的执行计数器编织到interop程序集中。例如,请查看Faq中的这一部分:“我想在程序集中添加一些无法调试的跟踪功能,是否可以使用Cecil?”