网站自动采集系统(2.代码覆盖率告诉测试团队有哪些产品代码没有被覆盖)
优采云 发布时间: 2021-12-25 20:12网站自动采集系统(2.代码覆盖率告诉测试团队有哪些产品代码没有被覆盖)
在上一篇执行测试用例中,我们已经讲解了如何通过命令行编译和执行测试用例,让我们有机会通过批处理来自动化执行测试用例。而且在文章系统应该具备的功能中,我也提到了一个完整的自动化系统应该能够自动采集
测试结果——毕竟我们的愿景是测试人员在晚上下班前执行用例,然后第二天早上可以直接看检测报告。
一般来说,检测报告需要收录
以下信息:
1. 测试用例的通过率,通过率代表产品的稳定性,当然这是排除测试用例本身问题导致的测试失败后得到的通过率。前面执行测试用例中提到的MsTest.exe生成的结果文件.trx文件已经保存了这个信息。在资源管理器中双击该文件,可以看到类似下图的结果:
上图中,细心的读者可能会发现只有3个用例,但是红圈处的文字却写着:“6/6通过”。这是因为这3个用例中有数据驱动的用例,VSTT把每一行数据当做一个独立的测试用例。数据驱动测试可以参考我的文章:网站自动化测试系统-数据驱动测试。
2. 代码覆盖率信息,代码覆盖率告诉测试团队哪些产品代码没有被覆盖,未覆盖的产品代码意味着有一些我们没有考虑的用户场景,或者说存在一些漏洞测试覆盖率(Testing Hole)。如果测试用例是从 VSTT 用户界面执行的,VSTT 已经自动集成了采集
代码覆盖率的功能。详情请参考我的文章软件自动化测试-代码覆盖率。在本文中,我将告诉您如何使用命令行来采集
代码覆盖率。
至少有两种方法可以将采集
代码覆盖率的功能集成到自动化测试系统中。一种是直接编辑.testrunconfig 文件。这就是我们在 VSTT 用户界面上操作时 VSTT 在幕后为我们做的事情。testrunconfig文件的使用方法请参考执行测试用例一文。
另一种方法是更深入的分解。实际上,Visual Studio 通过一个名为 VsPerfMon.exe 的程序来采集
代码覆盖率,该程序位于 C:\Program Files\Microsoft Visual Studio 9.0 \Team Tools\Performance Tools(假设 VSTT 安装在 C 盘)。当你按照软件自动化测试-代码覆盖率中介绍的步骤进行自动化测试时,VSTT暗中做了以下几件事:
1. 注入用于计算代码覆盖率的代码(仪器)。注入的代码在Software Automation Test-Code Coverage一文中已经有说明,这里不再赘述。代码注入是通过 vsinstr.exe 实现的。下面是最简单的使用它进行代码注入的命令(接受任何.Net程序——也就是.dll和.exe文件,不管是否支持原生C++程序,我还没试过):
Vsinstr.exe –coverage image.dll
除了向程序注入代码外,Vsinstr.exe 还需要修改程序的符号文件(.pdb 文件)。原因是程序注入代码后,与注入前的符号文件不匹配。使用不匹配的符号文件会导致我们在后面浏览代码覆盖率结果时查看详细的代码覆盖率信息——即哪些代码行被覆盖,哪些代码没有被覆盖。符号文件的作用请参考Visual Studio调试符号文件一文。
如果要对网站bin文件夹下的所有程序进行代码注入操作,可以使用如下简单命令完成:
对于 (*.dll) 中的 %f,执行 vsinstr.exe –nowarn –coverage “%f”
for命令的使用请参考Windows帮助文件中的批处理章节;%f 用引号括起来,以避免出现 %f 代码的文件路径收录
空格的情况;-nowarn 参数告诉 vsinstr 不要输出警告信息,因为他们太懒了 看,:)
2. 代码注入完成后,启动vsperfmon.exe。在整个执行测试用例的过程中,vsperfmon.exe 会持续在后台运行以采集
代码覆盖率信息。你可能想知道,这个程序的名字怎么叫perfmon?没有使用covermon这样的名字,这是因为vsperfmon.exe原本是用来做性能测试的,只是*敏*感*词*采集
代码覆盖率。
启动 vsperfmon.exe 的命令很简单:
vsperfmon.exe /START:COVERAGE /OUTPUT:result.coverage /CS
解释一下上面的参数:
范围
操作说明
/开始:覆盖范围
告诉 vsperfmon 采集
代码覆盖率。
/输出
保存结果的文件路径可以是绝对路径,也可以是相对路径。最好将后缀设置为.coverage,这样就可以在资源管理器中双击直接在Visual Studio中打开文件。
/CS
CS 是 CrossSession 的缩写。
有必要解释一下Session的含义。从Windows 2000开始,Windows就是一个多用户、多任务的操作系统(不知道NT是不是)。而Windows 95/98/Me并不是多用户多任务操作系统,它们只是一个单用户多任务操作系统。多用户是指多个用户可以同时登录同一台主机(通过远程登录系统,mstsc.exe),操作系统会对这些同时进行独立操作的多个用户进行有效的进程分离时间。虽然您可以在 Windows 95/98/Me 中设置多个用户,但这些多个用户不能同时登录到同一台机器。您必须等待另一个用户注销 (LogOff) 才能登录到这台机器。
当每个用户登录 Windows 操作系统时,Windows 使用 Session 的概念来描述它。一个用户可以有多个会话。例如,该用户可以直接以物理方式登录主机。这个会话称为控制台会话;这个用户同时也可以通过远程登录来操作这个主机,也就是另一个Session。
之所以要在这里花大量篇幅来描述Session是因为如果我们在IIS中启动网站,IIS应用程序池(Application Pool)需要你指定一个用户来访问数据库、文件系统等资源. 此会话不使用控制台会话。因此,一般情况下,即使IIS应用程序池使用的用户和当前执行测试用例的用户是同一个用户,他们使用的会话也是不同的。
Windows Vista和Windows Server 2008之后,大部分Windows服务(当然包括IIS提供的W3C服务)都运行在第0个会话(Session 0),目的是为了更好地将Windows服务与其他进程分开。第一个登录Windows Vista或Windows Server 2008的用户的会话ID为1,而不是之前的0,如下图所示:
在 Vista 之前,Windows 服务(如运行 Asp.Net 网站的 IIS 的 W3C 服务)和普通用户进程(如 vsperfmon.exe)运行在同一个会话中。只有 SendMessage 或 PostMessage 用于在两个进程之间交换消息。这个 API 会做。
但是Vista之后,由于服务进程和普通用户进程不在同一个会话中,需要使用Named Pipeline等IPC机制进行交互。/CS 选项告诉 vsperfmon.exe 注意在其他会话中执行的进程的代码覆盖率信息。
3. 当所有测试用例都执行完毕后,VSTT 关闭正在测试的进程。因为在采集
代码覆盖率信息时,vsperfmon 直接与被统计的进程交互;保存覆盖率信息时,需要等待采集
到的进程关闭,然后再进行保存操作。如果您的网站在测试过程中运行在 IIS 中,则需要使用以下命令关闭 IIS:
iis重置/停止
(启动iis命令时,iisreset /start)
如果你没有安装IIS,但是你会发现当VSTS直接按F5运行网站时,网站依然可以运行。这是因为 VSTS 带有支持 Asp.Net 的 Web 服务器 WebDev.WebServer.EXE。这个程序保存在文件夹C:\Program Files\Common Files\microsoft shared\DevServer\9.0(假设你的系统盘是C盘并且安装了VSTS 2008版本)。
在 VSTS 中运行网站时,Visual Studio 使用以下命令启动网站:
Webdev.webserver /path: /port: /vpath:/
如果是使用webdev.webserver运行网站,在命令行关闭这个程序的命令是(其实就是kill掉这个程序):
taskkill /im WebDev.WebServer.EXE
4. VSTT执行以下命令关闭vsperfmon.exe,vsperfmon.exe将采集
到的代码覆盖率保存到指定文件中。
vsperfmon.exe /关机
注意:默认情况下,vsperfmon.exe 只能采集
同一用户运行的进程的代码覆盖率信息。如果把网站放在iis中进行测试,默认情况下,这个网站的应用程序池是运行的(应用程序池)用户是NetworkService。在这种情况下,要么使用 vsperfmon.exe 的 /USER 选项来指定用户 NetworkService。要么将应用程序池的用户更改为执行 vsperfmon.exe 的用户。
基本上,测试自动化系统大致相同。下一篇会讲如何复用已有的自动化测试代码来自动生成测试用例。
待续...