65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 网站、应用程序的手动/自动化测试代码覆盖率

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2016年9月12日

Apache

8分钟阅读

viewsIcon

20761

downloadIcon

2

本文解释了如何从 ASP.NET 网站、Web 应用程序、Web 服务、独立可执行文件等获取代码覆盖率。

 

目录

    • 引言
    • 代码覆盖率步骤
      • 编译网站
      • 检测所有 DLL 或可执行文件
      • 启动 vsperfcmd
      • 运行应用程序
      • 停止应用程序
      • 停止 vsperfcmd
      • 将代码覆盖率文件转换为 XML
      • 使用 ReportGenerator 获取 HTML 格式的报告
    • 通过批处理脚本自动化代码覆盖率流程
    • 结论
    • 历史

引言

以下是代码覆盖率的定义(资料来源 – wikipedia
在计算机科学中,代码覆盖率是用于描述当特定测试套件运行时,程序的源代码被执行的程度的度量。代码覆盖率高的程序,以百分比衡量,在测试期间执行了更多的源代码,这表明与代码覆盖率低的程序相比,它包含未检测到的软件错误的几率较低。可以使用许多不同的指标来计算代码覆盖率;一些最基本的是测试套件执行期间调用的程序子例程的百分比和程序语句的百分比。

在我之前的项目中,我们过去会编写单元测试用例并从中获取代码覆盖率。但对于遗留项目,我们发现编写单元测试用例很困难,因为我们需要重构代码,这是一项耗时的任务。所以我们决定建立一个流程,从手动或自动测试网站中获取代码覆盖率。

以下是详细的步骤说明。

代码覆盖率实现。

在这里,我将解释如何为 ASP.NET 网站和独立可执行文件获取代码覆盖率。我选择 ASP.NET 网站而不是 Web 应用程序,因为

  • 在之前的项目中,我们有网站,并且我们还没有将其迁移到 Web 应用程序。
  • 对于 Web 应用程序,我们已经有了 DLL,所以更容易获得代码覆盖率(节省了整个过程中的一个步骤)。

对于 ASP.NET 网站,我们只有 .aspx 和 aspx.cs 或 aspx.vb 文件以及 .config 文件。如果您有任何项目引用,您还将拥有包含 DLL 的 bin 文件夹。

为了方便理解,我以网站为例。这是一个简单的计算器网站和独立可执行文件。它接受 3 个输入、运算符、2 个输入并计算值。

它有 3 个项目。

  • CalcDLL”,这是一个库项目。它包含从输入计算值的逻辑。它有一个公共函数“Calculate”,该函数接受运算符,其构造函数接受 2 个输入。“Calculate”函数返回结果。
  • 一个网站(“CalculateWebsite”),其中包含 2 个文本框和一个下拉列表。它接受用户输入并计算值。它有 CalcDLL 的项目引用。它有一个发布配置文件,该配置文件仅将文件复制到单独的位置。这里指向“C:\demo\”。
  • 一个控制台项目(“CalcConsole”),它接受 3 个命令行参数。例如,“CalcConsole.exe + 1 1″,输出将是 Result = 2。这不言而喻。

 

注意

  • 这个项目可以通过单元测试进行测试。我跳过了这一点,因为本文演示了通过应用程序的自动或手动测试(一种功能测试)来覆盖代码。
  •  我已经在我的环境变量中设置了每个所需工具的路径,因此我可以直接执行这些命令。

获取 DLL 和 EXEs 的预步骤。

网站

对于网站,首先,我们需要发布到本地目录。由于它不会复制依赖项目引用的“.pdb”文件,我们需要手动将该文件从网站项目的 bin 文件夹(位置 – \CalculateWebsite\bin\Calc.pdb)复制到发布目录(C:\demo\bin)。

这是网站的屏幕截图。
z2n4dqh

编译网站

对于网站,我们只有“.aspx.cs”和“.aspx”文件,并且由于检测仅在 DLL 或 exe 上工作,我们需要将网站转换为 Web 应用程序,或者我们需要预编译项目。以下是执行此操作的命令。

aspnet_compiler -p %original_dir% -v / %compiled_dir% -d
  • -p 表示物理路径
  • -v 表示虚拟目录
  • -d 表示调试版本。

这是编译后网站的屏幕截图。
x4nmvl6

此命令将生成一个 DLL,其名称类似于 App_Web_m55qrtmf.dll。并且它只会有一个“aspx”文件和配置文件。因为 .aspx.cs 文件被编译到该 DLL 中。

这是屏幕截图。

vmne3py

对于控制台项目
对于控制台,我们需要以调试模式构建。

注意:当我们进行代码覆盖率分析时,我们始终需要项目的调试版本。检测过程需要 DDL 和 PDB 文件。

检测 DLL

这是检测的命令。

vsinstr /coverage <file.dll>

vsinstr.exe 的位置是“C:\Program Files (x86)\Microsoft Visual Studio 12.0\Team Tools\Performance Tools”。您可以设置系统的PATH变量直接运行此命令。“vsinstr”代表 Visual Studio Instrumentation Tool。

由于我有 VS 2013,vsinstr 的路径如上所示,您可以尝试将 12.0 替换为您的版本。

对于网站或应用程序,我们可能有多个 DLL,所以我们需要对所有 DLL 执行此操作。

对于控制台项目,以下是确切的命令。

vsinstr /coverage Calc.dll
vsinstr /coverage CalcConsole.exe

对于网站,我们需要执行以下命令。

vsinstr /coverage C:\demo\compiled\bin\Calc.dll
vsinstr /coverage C:\demo\compiled\bin\App_Web_m55qrtmf.dll

这是 vsinstr 输出的屏幕截图。

pqw3igk

当您运行 vsinstr 时,它会在函数、条件块等处添加挂钩,这就是为什么 DLL 和 exe 的大小会增加。它会以“.orig”扩展名保留这些文件的备份。

这是运行 vsinstr 后文件的屏幕截图。与之前的相比,您可以看到 DLL 和 exe 的大小有所增长。

x6yjr2w

启动 vsperfcmd

接下来,我们将启动 vsperfcmd。“vsperfcmd”代表 Visual Studio Performance Command Line Tool。以下是运行 vsperfcmd 的命令。 vsperfcmd 的位置与 vsinstr 相同。如果您在环境变量中设置了路径,则执行它们会更容易。

vsperfcmd /start:coverage /output:C:\demo\compiled\demo.coverage.
  • /start:coverage – 我们指示它以覆盖率模式启动。
  • /output – .coverage 文件的位置。

这是输出的屏幕截图。

gqufoyw

运行应用程序

对于控制台项目,您可以直接从命令行开始测试。例如,假设我们要测试“+”和“-”。然后使用以下命令进行测试。

"CalcConsole.exe + 2 5" .

这里的“CalcConsole.exe”是 CalcConsole 控制台项目的输出。您需要从以下位置启动 exe – “\CalcConsole\bin\debug\CalcConsole.exe”。
对于网站项目,您需要启动 IISExpress 并从那里运行网站并开始手动测试。我已经将 IISExpress(C:\Program Files\IIS Express\)的路径设置到我的环境中。以下是运行 IISExpress 的命令。

iisexpress /path:C:\demo\compiled\ /port:8888 /clr:v4.0
  • /path – 网站位置的物理路径
  • /port – 监听的端口。
  • /clr – 使用的 CLR 版本。

这是命令的输出。要停止 IISExpress,您需要按“q”。

gfpk5qv

正如您所见,我只测试了“+”运算符。只有一个 POST 请求。

停止应用程序

对于网站,按“q”停止 Web 服务器。

对于控制台项目,只需停止测试🙂

停止 vsperfcmd

现在,我们需要停止 vsperfcmd。以下是执行此操作的命令。

vsperfcmd /shutdown

这将收集测试统计信息并生成“demo.coverage”文件,这是我们在覆盖率过程开始时使用的名称。

这是此的屏幕截图。

ysxyc9f

将代码覆盖率文件转换为 XML

此覆盖率文件可以在 Visual Studio 的 Ultimate 或 Premium 版本中打开。这是此的屏幕截图。

dr6jde7

要跳过此步骤,您可以使用 VS(具有所需版本)并导出为 XML 版本的文件。此覆盖率文件是二进制文件,因此需要将其转换为可读格式才能获得美观的 HTML 报告。

或者,您可以使用以下代码片段将其转换为 XML 文件。

 // args[0] - input path of demo.coverage file
 // args[1] - output directory for converted xml file
 string wspath = args[1] + "coverage.xml";
 CoverageInfo coverage = CoverageInfo.CreateFromFile(args[0]);
 DataSet data = coverage.BuildDataSet(null);
 data.WriteXml(wspath );
 data.Dispose();
 coverage.Dispose();

这里您需要“Microsoft.VisualStudio.Coverage.Analysis.dll”的 DLL 依赖项,它是 Visual Studio*的一部分。那些依赖 DLL 的位置是“C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\PrivateAssemblies”。

* – 同样,这些是上面指定的要求的 VS 版本的一部分。

我用上面的代码片段编写了一个简单的实用程序,它将其转换为 XML 文件。以下是执行该命令。

coveragereport C:\demo\compiled\demo.coverage C:\demo\compiled\

这将在那里创建一个“coverage.xml”文件。

HTML 报告生成器

为此,您需要一个开源工具 “ReportGenerator”。它会将 XML 报告转换为外观精美的 HTML 报告。以下是执行命令。

reportgenerator -reports:C:\demo\compiled\coverage.xml -targetdir:C:\demo\compiled\report

这是此的屏幕截图。

nwgccrc

如果您检查目录,它会在“C:\demo\compiled\report”中创建 HTML 文件用于报告。您可以通过打开 HTML 文件(index.htm)来查看报告。

现在,您可以看到“SumEvaluator”有 100% 的覆盖率。

这是 HTML 文件的屏幕截图。

ri6jznt

通过批处理脚本自动化代码覆盖率流程

为了自动化此过程,我创建了一个批处理文件“start-coverage.bat”,它接受一个输入,即网站的路径。它将接收网站位置的输入并计算代码覆盖率。您只需像这样执行批处理文件。

假设:已在执行系统的环境变量中设置了所需路径。“vsinstr”、“vsperfcmd”、“coverage_to_xml_tool”、“reportgenerator”的路径需要设置在环境变量中。

start-coverage.bat C:\demo

结论

此过程将简化从功能测试(无论是手动还是自动)中获取覆盖率报告。批处理文件将使此过程更容易完成。这里唯一的手动步骤是将 pdb 文件复制到发布位置。

这是代码位置的链接。它包含 3 个项目 + 1 个项目(用于将覆盖率文件转换为 XML 文件的工具)的源代码。

历史

我尝试了微软 MSDN 链接中的许多有用建议来实现这一点。以下是一些。

  • 将网站部署到 IIS 服务器并使用“vsperfclrenv /globaltraceon”开始获取覆盖率。
  • 将 w3wp 附加到 vsperfmon。
  • 使用 vsperfreport 获取 vsp 文件然后转换。

但遗憾的是,它们都对我不起作用。这促使我写这篇博客,并帮助其他正在寻找它的人。

参考文献

© . All rights reserved.