网站测试自动化系统—采集测试结果

优采云 发布时间: 2020-08-10 11:01

  在后面的文章执行测试用例里,已经解释了怎样通过命令行来编译和执行测试用例,这样我们才有机会通过批处理的方法来将执行测试用例自动化。而我在文章系统应当有的功能里,也提到了一个完整的自动化系统应当是能否手动搜集测试结果的—毕竟我们的远景是,测试人员在夜晚上班前将用例执行上去,然后在第二天上午就可以直接看测试报告了。

  一般来说,测试报告须要收录以下几个信息:

  1. 测试用例的通过率,通过率代表产品的稳定程度,当然这是在排除了测试用例本身的问题导致的测试失败(Test Failure)得到的通过率。前面执行测试用例里提及到的MsTest.exe生成的结果文件.trx文件就早已保存了这个信息,在资源管理器上面双击这个文件,就能见到类似右图的结果:

  

  在上图上面,可能会有悉心的读者发觉上面只有3个用例,但是红圈上面标出的文字却说:“6/6 passed”,这是因为这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安装在磁盘)。当你根据软件自动化测试—代码覆盖率里介绍的步骤执行自动化测试的时侯,VSTT背地里做了下边几件事情:

  1. 注入用于统计代码覆盖率的代码(instrument),注入的代码在文章软件自动化测试—代码覆盖率里早已有过讲解,这里不再说了。代码注入是通过vsinstr.exe来实现的,下面是使用它进行代码注入最简化的命令(接受任何.Net程序—即.dll和.exe文件,是否支持原生C++程序我还没有尝试过):

  Vsinstr.exe –coverage image.dll

  Vsinstr.exe不仅在程序上面注入代码以外,还要更改程序的符号文件(.pdb文件),之所以这样做,是因为程序被注入代码之后,就不和注入前的符号文件匹配了。使用不匹配的符号文件,将会造成前面浏览代码覆盖率结果时,我们没有办法查看详尽的代码覆盖信息—即什么行的代码被覆盖了,哪些代码没有覆盖。符号文件的作用请参考文章Visual Studio调试之符号文件。

  如果要给网站 bin文件夹上面所有的程序执行代码注入操作的话,可以使用下边这个简单的命令来完成:

  for %f in (*.dll) do 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

  上面的参数解释一下:

  参数

  说明

  /START:COVERAGE

  告诉vsperfmon进行代码覆盖率的搜集。

  /OUTPUT

  保存结果的文件路径,可以是绝对路径或则相对路径,最好将后缀名设置为.coverage,这样你可以直接通过资源管理器上面双击在Visual studio中打开这个文件。

  /CS

  CS是CrossSession的缩写。

  Session的意思有必要解释一下,Windows 从Windows 2000之后是一个多用户,多任务的操作系统(不知道NT是不是)。而Windows 95/98/Me不是多用户多任务操作系统,它们只是单用户多任务操作系统。多用户的意思是多个用户可以同时登陆同一台主机(通过远程登陆系统,mstsc.exe),操作系统会在这多个同时进行独立操作的用户当中执行有效的进程分离。虽然你可以在Windows 95/98/Me设置多个用户,但是这多个用户不能同时登陆同一台机器,必须要等另外一个用户注销(LogOff)才能登入这台机器。

  每个用户登入到Windows操作系统时,Windows以Session(会话)的概念来描述它,一个用户可以有多个Session,例如这个用户可以从数学上直接登陆主机,这个Session称作Console Session;这个用户同时也可以通过远程登陆来操作这台主机,这又是另外一个Session。

  之所以要在这里花很大的篇幅去描述Session,是因为假如我们在IIS上面启动网站时,IIS的应用程序池(Application Pool)需要你指定一个用户用于访问数据库、文件系统等资源,这个会话(Session)不会使用控制台会话(Console Session),因此一般来说,即使IIS的应用程序池使用的用户与当前执行测试用例的用户是同一个用户,也是在使用不同的会话。

  在Windows Vista和Windows Server 2008之后,大部分Windows服务(当然也包括IIS提供的W3C服务)都是在第0会话(Session 0)当中运行,目的是为了更好地将Windows服务与其他进程分隔开来。而第一个登陆Windows Vista或Windows Server 2008的用户的会话标示号是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:

  iisreset /stop

  (启动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运行网站的话,在命令行关掉这个程序的命令是(实际上是杀死这个程序):

  taskkill /im WebDev.WebServer.EXE

  4. VSTT执行下边的命令关掉vsperfmon.exe,vsperfmon.exe将采集到的代码覆盖率保存到指定的文件当中。

  vsperfmon.exe /shutdown

  备注:vsperfmon.exe默认情况下只能搜集同一个用户运行的进程的代码覆盖率信息,如果你是将网站放在iis上面进行测试,默认情况下,运行这个网站的应用程序池(application pool)的用户是NetworkService,这种情况下,要么用vsperfmon.exe的/USER选项指定NetworkService这个用户。要么将应用程序池的用户改成执行vsperfmon.exe的那种用户。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线