基于OpenCover进行代码覆盖率测试

介绍使用OpenCover和ReportGenerator进行代码覆盖率测试的方法。包括配置、命令行参数解释、常见问题解答等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  最近开始接触白盒测试,开发同事对OpenCover(开源C#代码覆盖率统计工具)、ReportGenerator(将XML报告转换成HTML的工具)二次开发出一个代码覆盖率的工具。下面基于该工具,记录对OpenCover、ReportGenerator等的理解。

 

未使用OpenCover时,被测程序的正常运行流程:

使用OpenCover、ReportGenerator后,被测程序的运行流程:

  OpenCover中的Profiler启动运行被测程序的程序或服务——>运行被测程序——>得到运行结果同时,也得到xml覆盖率结果——>ReportGenerator将xml转成HTML

  ——>命令行调用OpenCover.Console.exe——>使用SentrySdk收集崩溃报告——>解析命令行中传入的参数(被测程序路径、要打印使用说明、是否启动服务、过滤信息等)

  ——>处理过滤器信息,如果命令行中未传-filter参数,则默认匹配分析所有的类和方法——>创建性能计数器?

  ——>得到输出xml报告的全路径——>初始化封装了注入框架依赖的容器——>创建文件句柄,后续将覆盖率信息写入文件中。如果已经存在覆盖率xml文件,则合并

  ——>启动覆盖率分析进程。注册分析器,调用OpenCover.Profiler.dll——>启动被测程序——>

 

 

 

 

该工具使用及主要实现流程:(以测试站点程序为例)

——>配置好OpenCover、ReportGenerator、被测程序的路径、IIS Express config的路径

——>执行的时候就根据配置好的参数执行命令,即相当于在cmd中执行:

H:\白盒测试\Debug\Opencover\OpenCover.Console.exe -target:"C:\Program Files (x86)\IIS Express\iisexpress.exe" -targetdir:"D:\被测站点\xxx.xxx.com\bin" -targetargs:"/site:xxx_bh.xxx.com /config:\"C:\Users\ym\Documents\IISExpress\config\applicationhost.config\"" -register:ym -output:"H:\白盒测试\xml_ym\xxx_bh.xxx.com\xxx_bh.xxx.com.xml"

——>此时IIS Express已经启动,访问在通过IIS Express配置的站点,开始测试。

——>测试完成后,退出IIS Express,生成xml文件。

——>使用ReportGenerator生成HTML文档,相当于在cmd中执行命令:

H:\白盒测试\Debug\ReportGenerator\ReportGenerator.exe -reports:H:\白盒测试\xml\白盒测试.xml -targetdir:H:\白盒测试\xml\html

 

关于OpenCover:

  OpenCover是用于.NET 2.0及以上应用程序的代码覆盖的开源命令行工具。OpenCover使用PDB文件提供序列信息,确定哪行代码与每行源代码相关联,然后检测每个序列点以记录命中。因此必须要有的是PDB文件以及可执行文件和程序集,应该在调试模式下构建测试中的应用程序。如果未找到PDB文件,则不会收集任何覆盖数据。

  使用COM(组件对象模型)开发,profiler部分使用c++,

  OpenCover使用mono.Cecil来分析分支或IL以确定在何处检测代码。

  OpenCover在开始时要考虑的指标是:

  1. 声明范围即已涵盖的行数。
  2. 方法覆盖范围,即涵盖了哪些方法。
  3. 分支覆盖范围即采取了哪些分支。这与圈复杂度有关
OpenCover基本用法(命令行参数):
-target: 应用程序可执行文件或服务名称的路径  (我的理解:将被测程序运行起来的程序或服务。网上帖子中,大多用的NUnit。本文例子用的是IIS Express)
-filter应用于选择性地包括或排除coverage结果中的程序集和类的过滤器列表 (默认选择所有的类和方法)
      使用PartCover语法,在哪里(+|-)[Assembly-Filter]Type-Filter
      例如,+[Open*]*包括以Open开头的程序-[*]Core.*集中的所有类型,排除Core命名空间中的所有类型,而不管程序集如何。
      如果未提供过滤器,+[*]*则会自动应用默认的包含过滤器。
-output: 输出XML文件的路径,如果为空,则将在当前目录中创建results.xml -register [:user] - 注册和取消注册代码覆盖率分析器 -targetargs: - 要传递给目标进程的参数(可指定被测程序的路径) -targetdir: - 目标目录的路径或PDB文件的备用路径 (如果-
targetargs 已经指定了被测程序的路径,那么这里可作为查找PDB文件的依据。本文例子则作为查找PDB文件的路径

用法:https://github.com/OpenCover/opencover/wiki/Usage

文档:https://github.com/opencover/opencover/blob/master/main/OpenCover.Documentation/Usage.pdf

参考:http://www.cnblogs.com/binyao/category/477233.html

   http://www.cnblogs.com/tylerzhou/p/9076386.html

   http://blog.alantsai.net/posts/2017/01/devopsseries-opencover-intro

     https://www.codeproject.com/Articles/677691/Getting-code-coverage-from-your-NET-testing-using

 

什么是IIS Express:

  一个兼具Visual Studio的ASP.NET开发服务器和Windows的IIS Web服务器功能的轻量级web服务器。

  具体描述:https://stackify.com/what-is-iis-express/

  配置:https://blog.youkuaiyun.com/zhangjk1993/article/details/36671105

为什么用IIS Express:

文档中有这么一段描述:

Running against IIS
Normally I’d suggest running against IISEXPPRESS as I think it is easier to automate. However for those who really want to run against a full blown IIS then the following instructions (supplied by a user) will hopefully suffice.
“The trick is to start OpenCover to run the w3wp.exe process in debug mode e.g.
OpenCover.Console.exe -target:C:\Windows\System32\inetsrv\w3wp.exe -targetargs:-debug 
-targetdir:C:\Inetpub\wwwwoot\MyWebApp\bin\ -filter:+[*]* -register:user
There are some prerequisites though:
1.All applications running under the site must make use of the same app pool; you'll get errors in the EventLog otherwise.
2.inetserver needs to be stopped, before starting w3wp.exe in debug mode. You can use the following command:
net stop w3svc /y
After testing/code coverage completion you can close the w3wp.exe process and start the inetserver again:
net start w3svc
This procedure was tested on a Win2008 machine with IIS7.5”
You can also run multiple OpenCover instances against separate IIS sites by using the –s option when running IIS to choose the siteid e.g.
OpenCover.Console.exe -target:C:\Windows\System32\inetsrv\w3wp.exe 
    -targetargs:"-debug -s 1" 
    -targetdir:%WebSite_Path% 
    -filter:+[*]* 
    -register:user 
    -output:%CoverageResult_Path%
Then you can use ReportGenerator to merge the coverage results. 

大致意思就是用IIS Express更方便。

而如果要启动完整的IIS,那就要:

1)在调试模式下运行被测程序并启动OpenCover(将代码构建到调试模式获取PDB文件。或者直接获取源代码)

2)所有在站点下运行的应用程序都必须使用相同的应用程序池;否则,会报错

3)在调试模式下启动被测程序前,需要停止intserver(PS:intserver可能指的是启动被测程序的服务吧。)

  而结合实际需求,虽然也可以直接往-target传参为IIS的启动程序来进行监控测试情况,但是IIS还部署了其他非测试站点,会相互影响。所以实际应用还是采用IIS Express,每个测试人员部署自己的IIS Express,而不会相互影响。

 

关于PDB文件:

 

  PDB是Program Data Base 的缩写。顾名思义,它是一个存储库(持久性存储,如数据库),用于维护在调试模式下运行程序所需的信息。它包含调试代码时所需的许多重要相关信息(在Visual Studio中),例如,在您希望调试器在Visual Studio中中断的位置插入断点。

  这就是为什么如果*.pdb从调试文件夹中删除文件,Visual Studio很多次都无法达到断点的原因。Visual Studio调试器还能够通过文件的帮助告诉您堆栈跟踪中发生异常的代码文件的精确行号*.pdb。因此,有效的pdb文件在调试程序时对开发人员来说真的很有用。

  通常,建议不要排除*.pdb文件的生成。从生产发布的角度来看,您应该做的是创建pdb文件,但不要将它们发送到产品安装程序中的客户站点。将所有生成的PDB文件保留在符号服务器上,以备将来可以使用/引用它。特别适用于调试进程崩溃等问题的情况。当您开始分析故障转储文件时,如果*.pdb未保留在构建过程中创建的原始文件,则Visual Studio将无法确定导致崩溃的确切代码行

  如果您仍想*.pdb为任何版本完全禁用文件生成,请转到项目属性 - >构建选项卡 - >单击Advanced按钮 - > none从“调试信息”下拉框中选择 - >按OK下面的快照中所示。

无C#项目的调试信息设置

 

https://blogs.msdn.microsoft.com/vcblog/2016/02/08/whats-inside-a-pdb-file/

https://tpodolak.com/blog/2017/10/12/net-core-calculating-code-coverage-opencover-windows/

http://www.cnblogs.com/itech/archive/2011/08/15/2136522.html

https://blog.youkuaiyun.com/feihe0755/article/details/54233714

 

使用ReportGenerator 将xml生成HTML报告:

ReportGenerator用于将OpenCoverPartCoverVisual StudioNCover生成的XML报告转换为各种格式的友好可读报告。

使用指南可以在其主页上找到,最有用的命令是(命令行参数):

  • -reports: - 应该解析的覆盖率报告,分号分隔,允许使用通配符
  • -targetdir: - 应保存生成的报告的目录
  • -sourcedirs:[;] [;] - 包含相应源代码的目录,可选,分号分隔
  • -classfilters:<(+ | - )filter> [; <(+ | - )filter>] [; <(+ | - )filter>] - 报表中应包含或排除的类列表,可选,通配符被允许。

  

如下图,为报告部分截图,包含语句覆盖和分支覆盖情况。点击相应的页面,会进入对应程序,可看到具体覆盖到哪一行代码。

  

代码覆盖详情,绿色表示完全覆盖,橙色表示该行代码还有分支未覆盖到,红色则未覆盖。

 

补充:

1、如果是测试Windows服务的覆盖率:

1)执行如下命令启动服务:

G:\Opencover所在路径\OpenCover.Console.exe -service:byname -target:安装好的服务名 -register:ym -output:H:\白盒测试保存路径\xxx\xxx.xml 

2)测试完毕后,正常关闭服务,则可收集覆盖数据。

https://github.com/OpenCover/opencover/wiki/Service-Support

 

FAQ:

1)若提示

  原因有三: (1)未走到相关代码

        (2)缺少对应的pdb文件

        (3)未正确注册Profiler,添加参数-register:账号名

 

参考资料:https://www.cnblogs.com/tylerzhou/p/9076537.html

     https://www.cnblogs.com/SivilTaram/p/vs_opencover_unit_coverage.html

 

转载于:https://www.cnblogs.com/minerrr/p/9253960.html

<think>我们正在讨论如何使用FineCodeCoverage进行功能测试覆盖率统计。注意,用户强调是“功能测试”而非“自动化单元测试”。FineCodeCoverage(FCC)是一个Visual Studio扩展,主要用于在运行单元测试时收集代码覆盖率。但是,功能测试通常是指手动测试或者通过UI自动化工具(如Selenium)进行的测试,这些测试并不直接通过测试运行器(如MSTest、NUnit等)执行。 然而,FineCodeCoverage主要是为单元测试设计的。对于功能测试,我们可能需要一些变通方法。以下是一种可能的方法: 思路:将功能测试的执行与单元测试的运行关联起来,从而利用FCC收集覆盖率。具体来说,我们可以创建一个“测试容器”(比如一个空的单元测试项目),然后在运行功能测试之前启动覆盖率收集,运行结束后停止收集。但FCC本身并不直接支持这种模式。 另一种方法是:使用FCC的底层工具(如OpenCover)来手动收集功能测试的覆盖率。但是,用户要求使用FineCodeCoverage,所以我们尽量在FCC的框架内操作。 参考引用[2]中提到QT代码覆盖率测试使用了OpenCppCoverage,而FCC实际上也是基于OpenCover(针对.NET)的。因此,我们可以尝试通过配置FCC来收集功能测试的覆盖率,但需要一些额外的步骤。 操作步骤(假设使用Visual Studio和FineCodeCoverage): 1. **安装FineCodeCoverage**:通过Visual Studio的扩展管理器安装FCC。 2. **创建一个测试项目**:虽然我们要进行功能测试,但FCC需要依附于单元测试项目来运行。因此,我们可以创建一个单元测试项目(如MSTest项目),但不写任何单元测试。这个项目只是为了启动覆盖率收集。 3. **配置功能测试的启动**:我们需要在运行“单元测试”的同时启动我们的功能测试(例如,一个可执行程序或一个网站)。我们可以通过编写一个“启动器”单元测试来实现,这个单元测试会启动功能测试程序并等待其结束。 4. **编写启动器测试**:在单元测试项目中,编写一个测试方法,在该方法中启动功能测试程序(例如,使用`Process.Start`),然后等待功能测试程序结束。这样,FCC在运行这个单元测试时会收集整个过程中被执行的代码的覆盖率。 5. **运行测试并查看覆盖率**:运行这个启动器测试,FCC会自动收集覆盖率,并在Visual Studio中显示报告。 示例代码(在单元测试项目中): ```csharp using Microsoft.VisualStudio.TestTools.UnitTesting; using System.Diagnostics; namespace FunctionalTestCoverage { [TestClass] public class FunctionalTestLauncher { [TestMethod] public void RunFunctionalTests() { // 启动功能测试程序,这里假设功能测试是一个可执行文件 Process process = Process.Start(@"path\to\your\functional\test\program.exe"); process.WaitForExit(); // 等待功能测试结束 Assert.AreEqual(0, process.ExitCode, "Functional tests failed"); } } } ``` 6. **注意**:这种方法收集的覆盖率是功能测试程序运行过程中所涉及的所有代码(包括被测试的应用程序和功能测试框架等)。但FCC默认会过滤掉测试项目的代码(只显示被测试项目的代码)。如果功能测试程序不是被测试项目的一部分,可能需要调整FCC的设置,将功能测试程序所在的目录包含进来。 7. **配置FCC**:在Visual Studio中,通过“工具”->“选项”->“Fine Code Coverage”可以设置。可能需要设置: - 包含哪些程序集(默认包含被测试项目,排除测试项目)。如果功能测试程序集也需要被覆盖,可以将其包含进来。 - 或者,如果功能测试程序启动的是另一个进程(如一个WPF应用程序),那么需要确保FCC能够监控该进程。FCC默认只监控测试进程及其子进程?这可能需要FCC支持监控其他进程。但当前版本的FCC可能不支持。 8. **局限性**:FCC主要设计用于单元测试,对于多进程的监控可能不够完善。如果功能测试程序是独立进程,可能无法被监控到。此时,可能需要考虑使用其他工具(如OpenCover的命令行)来手动收集。 替代方案:如果上述方法不奏效,可以考虑使用OpenCover命令行工具来收集功能测试的覆盖率。步骤如下: a) 安装OpenCover和ReportGenerator(可以通过NuGet安装到工具目录)。 b) 使用OpenCover运行功能测试程序: OpenCover.Console.exe -target:"path\to\functional\test\program.exe" -output:coverage.xml -register:user c) 使用ReportGenerator生成报告: ReportGenerator.exe -reports:coverage.xml -targetdir:coveragereport 但是,用户要求使用FineCodeCoverage,所以我们优先考虑在Visual Studio中集成的方法。 总结:使用一个启动器单元测试来启动功能测试程序,并利用FCC收集覆盖率。这种方法可能需要对FCC的配置进行调整,并且可能无法覆盖所有情况(特别是当功能测试程序以服务形式运行或涉及多个进程时)。 如果用户的功能测试是Web应用程序的UI测试(如使用Selenium),那么启动器测试可以启动浏览器并运行测试脚本,然后等待测试脚本结束。同样,需要确保被测试的Web应用程序是在单元测试进程的子进程中启动,或者FCC能够监控到它。 由于FCC的底层是OpenCover,而OpenCover只能监控.NET应用程序,所以如果功能测试程序是非.NET程序,则无法使用。在这种情况下,可能需要使用其他工具(如OpenCppCoverage for C++)。 因此,在操作前,请确认: - 被测试的应用程序是.NET应用程序。 - 功能测试程序最好是.NET应用程序,或者能够被单元测试进程启动并监控。 如果用户的环境满足条件,则可以按照上述步骤操作。 相关问题: 1. 如何调整FineCodeCoverage的包含和排除规则? 2. 如果功能测试涉及多个进程,FineCodeCoverage能否正确收集覆盖率? 3. 除了FineCodeCoverage,还有哪些工具可以用于功能测试代码覆盖率收集? 4. 如何将FineCodeCoverage集成到持续集成(CI)流程中?</think>### 如何使用FineCodeCoverage进行功能测试覆盖率统计 FineCodeCoverage(FCC)是专为Visual Studio设计的代码覆盖率工具,主要面向单元测试场景。但通过以下步骤,也可用于**功能测试覆盖率统计**: #### 操作指南(无需单元测试代码) 1. **安装配置** - 在VS中通过`Extensions > Manage Extensions`安装FineCodeCoverage - 创建空测试项目(MSTest/NUnit/xUnit),仅作为覆盖率收集容器 2. **启动覆盖率收集** ```csharp // 在测试项目中添加空测试方法(仅触发FCC) [TestMethod] public void CoverageTrigger() { // 无实际测试代码 } ``` - 通过VS的`测试资源管理器`运行此空测试 - FCC自动开始监控所有关联进程 3. **执行功能测试** - **手动操作**:直接运行应用程序并执行功能测试用例 - **自动化UI测试**:启动Selenium/Appium等UI测试框架 - **关键要求**:确保被测进程与FCC监控进程相同(同解决方案中的项目) 4. **生成覆盖率报告** - 功能测试完成后,在VS的`Fine Code Coverage`窗口查看实时覆盖率 - 报告包含: - 行覆盖率(Line Coverage) - 分支覆盖率(Branch Coverage) - 未覆盖代码高亮显示 - 导出HTML报告功能 5. **配置优化** - 在`.runsettings`文件中指定监控范围: ```xml <FineCodeCoverage> <Include>[*YourApp*]*</Include> <Exclude>[*.Tests]*</Exclude> </FineCodeCoverage> ``` - 通过`工具 > 选项 > Fine Code Coverage`调整过滤规则 #### 注意事项 1. **进程限制**:FCC仅监控通过测试启动器运行的进程。若功能测试启动独立进程(如桌面应用),需在`.runsettings`中添加: ```xml <ModulePaths> <Include>YourApp.exe</Include> </ModulePaths> ``` 2. **覆盖率精度**:功能测试覆盖率通常低于单元测试,80%覆盖率已属优秀目标[^1] 3. **替代方案**:若遇多进程限制,可考虑: - 使用OpenCover+ReportGenerator命令行方案[^2] - 集成CoverageScanner等支持外部测试的工具[^3] > 示例报告:FCC生成的覆盖率报告会显示每个文件的执行情况,红色标记未覆盖代码,绿色标记已覆盖分支,帮助快速定位测试盲区。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值