用VSPerfMon在测试ASP.NET程序的过程中收集代码覆盖率信息

前两篇文章介绍了VSTS性能分析工具Profiler如何用Profiler发现性能问题并且进行优化。今天想分享一下如何在测试ASP.NET程序的过程中获取代码覆盖率的信息。

设想如下场景,测试人员介入到项目的需求,分析,设计的阶段,得到了很多有用的文档和信息。接下来就到了编码的阶段,在这个时候测试工程师开始根据前面获得的信息来设计测试用例,做用例评审,力求测试用例覆盖能覆盖系统的每一个角落。不幸的是,系统实在是太大,没有人能确切地知道手上的测试用例对系统的覆盖(这里指定为代码的行覆盖)能达到什么样的程度。对于系统的关键部分,没有人希望在经过几轮测试以后,还有相当部分的代码是没有被执行过的。

解决这个问题的其中一个方法,就是对关键部分的代码进行代码覆盖率的统计。平时我做单元测试和接口测试的时候,得益于IDE的帮助,代码覆盖率信息很容易就能得到,但是对于部署在IIS上的ASP.NET代码,又如何去收集代码覆盖率信息呢?曾经找过好多.NET的代码覆盖率工具,没有合适的。不过就在最近,让我发现了VSPerfMon,VSTS自带的性能数据收集工具。真是众里寻他千百度,蓦然回首,那工具却在灯火阑珊处。

1. 首先要对需要进行代码覆盖率信息收集的二进制文件(DLL, EXE)用VSInstr进行处理,记得带上/COVERAGE参数

VSInstr “D:\Websites\somewhere\bin\MySpace.Web.UserHome.dll” /COVERAGE

2. 停掉IIS

iisreset /stop

3. 用VSPerfClrEnv 设置相关的环境变量

VSPerfClrEnv /globaltraceon

4. 启动VSPerfMon;参数/COVERAGE代表本次监控收集的数据是代码覆盖率;/user:”NETWORK SERVICE”,指定用户名;/CS 启用跨域会话分析;/output:”d:\magus\0422.coverage”,指定输出文件的名字和路径,记得用.coverage作为扩展名。

VSPerfMon /COVERAGE /user:”NETWORK SERVICE” /CS /output:”d:\magus\0422.coverage”

在运行完上面这条命令以后,CMD窗口就提示:

Started in Stand Alone Mode
Filename: d:\magus\0422.coverage

这时候需要打开一个新的CMD进行余下的操作(原来的CMD就叫CMD_A,新开的就叫CMD_B吧)

5. 停止收集代码覆盖率信息数据,因为不想让代码覆盖率信息受到影响。

VSPerfCmd /globaloff

6. 启动IIS

iisreset /start

7. 对ASP.NET程序进行预热

8. 重新开启代码覆盖率信息的收集

VSPerfCmd /globalon

9. 运行测试用例,手工OR自动都可以

10. 停止代码覆盖率信息的收集

VSPerfCmd /globaloff

11. 停止IIS

iisreset /stop

这时候在CMD_A中会提示“UnRegistering process (7784)”,还是保持CMD_A不动,继续操作CMD_B

12. 结束代码覆盖率的收集,并且生成.coverage文件

VSPerfCmd /shutdown

这时候在原来的CMD_A中就会出现如下信息:

Shutting Down Named Pipe Server
Shutting Down Buffer Writer
Shutting Down Process Deamon

如果没有看到错误提示信息,那么本次代码覆盖率收集就应该成功了。

13. 在VSTS IDE中打开刚才生成的.coverage查看代码覆盖率。

如图:

coverage

正如以前讨论过的,100%的代码覆盖率是不够的,那么我们在拿到代码覆盖率数据以后,应该看一下在运行完测试用例以后以后,系统的哪些代码还没有被执行过,然后回头设计一些新的测试用例来测试那些未被测试的代码。这就要求测试工程师要能看懂代码了。

本文思路得益于大半年前看到这篇博客“如何引入代码覆盖率度量提高测试质量”,一直惦记于心,终于找到了适用于.NET程序的解决方法了,呵呵。

2 thoughts on “用VSPerfMon在测试ASP.NET程序的过程中收集代码覆盖率信息”

Leave a Reply

Your email address will not be published. Required fields are marked *