StarWars代码覆盖率与持续集成:OpenCover、ReportGenerator与VSTS配置全记录
【免费下载链接】StarWarsGraphQL 'Star Wars' example using GraphQL for .NET, ASP.NET Core, Entity Framework Core项目地址: https://gitcode.com/gh_mirrors/st/StarWars
StarWars 是一个基于 GraphQL for .NET、ASP.NET Core 与 Entity Framework Core 构建的 GraphQL 示例项目,采用 Api / Core / Data 三层架构。本文完整记录它如何用 OpenCover 采集代码覆盖率、用 ReportGenerator 生成 HTML 报告,并在 VSTS(Visual Studio Team Services)上配置持续集成,让每次代码提交都自动构建并跑完全部测试。🚀
项目结构:两套测试,两条覆盖率流水线
项目由 4 个核心工程组成:
| 工程 | 职责 |
|---|---|
| StarWars.Api | ASP.NET Core 的 GraphQL 控制器与 Schema |
| StarWars.Core | 领域模型、仓储接口与业务逻辑 |
| StarWars.Data | EF Core 仓储实现与内存仓储 |
| Tests | 单元测试 + 集成测试两套工程 |
覆盖率脚本与测试一一对应,放在仓库根目录:
unit-tests.bat—— 针对 StarWars.Tests.Unit 的单元测试覆盖率integration-tests.bat—— 针对 StarWars.Tests.Integration 的集成测试覆盖率
两个脚本共用同一套命令行参数,只是测试工程与输出目录不同,这正是"一份配置、两类结果"的极简做法。
一键覆盖率脚本:unit-tests.bat 逐行拆解
打开根目录的unit-tests.bat,整个流水线只有 4 行:
mkdir coverage\unit OpenCover.Console.exe -target:"dotnet.exe" -targetargs:"test -f netcoreapp1.1 -c Release Tests/StarWars.Tests.Unit/StarWars.Tests.Unit.csproj" -hideskipped:File -output:coverage/unit/coverage.xml -oldStyle -filter:"+[StarWars*]* -[StarWars.Tests*]* -[StarWars.Api]*Program -[StarWars.Api]*Startup -[StarWars.Data]*EntityFramework.Workaround.Program -[StarWars.Data]*EntityFramework.Migrations* -[StarWars.Data]*EntityFramework.Seed*" -searchdirs:"Tests/StarWars.Tests.Unit/bin/Release/netcoreapp1.1" -register:user ReportGenerator.exe -reports:coverage/unit/coverage.xml -targetdir:coverage/unit -verbosity:Error start .\coverage\unit\index.htm各参数的作用如下:
| 参数 | 作用 |
|---|---|
-target:"dotnet.exe" | 让 OpenCover 包裹执行dotnet test,边跑测试边采集覆盖率 |
-output:coverage/unit/coverage.xml | 覆盖率原始数据(XML)输出位置 |
-hideskipped:File | 隐藏无法映射到源文件的程序集,避免报告出现"Unknown file"噪声 |
-filter | +[StarWars*]*纳入所有 StarWars 程序集;-前缀排除测试工程、Program/Startup、EF 迁移与种子数据等无需统计的代码 |
-searchdirs | 指定编译产物(DLL 与 PDB)所在目录,覆盖率靠 PDB 与源码对齐 |
-register:user | 将程序集注册到用户级 CLR 注册表,规避强名称加载问题 |
-oldStyle | 生成旧版 XML 格式,保证 ReportGenerator 兼容 |
最后一条ReportGenerator.exe把 XML 转成 HTML 报告,start命令直接帮你打开index.htm——从运行到看报告,一条命令链完成。📊
关键前置条件:DebugType 必须为 Full
OpenCover 依赖 PDB 文件把覆盖率数据对齐到源码行号,而默认生成的 PDB 可能不完整。所以三个核心工程都在 csproj 中显式写入了:
<DebugType>Full</DebugType>你可以在 StarWars.Api.csproj、StarWars.Core.csproj、StarWars.Data.csproj 中确认这一配置。
另外两个前置步骤:
- 安装OpenCover与ReportGenerator两个 NuGet 包(测试工程 StarWars.Tests.Unit.csproj 中已引用
OpenCover 4.6.519和ReportGenerator 2.5.6); - 把 OpenCover 的 tools 目录加入系统
Path环境变量,例如C:\Users\<你>/.nuget/packages/opencover/4.6.519/tools/,之后命令行才能直接调用OpenCover.Console.exe。
ReportGenerator:从 XML 到可视化 HTML 报告
OpenCover 产出的 XML 机器可读但不便阅读,ReportGenerator.exe一步将其渲染成带行级高亮的 HTML 站点:
-reports:coverage/unit/coverage.xml:输入 XML-targetdir:coverage/unit:输出目录-verbosity:Error:安静模式,出错才输出
执行完毕后浏览器自动打开index.htm,可逐文件查看哪些行被执行、哪些行被跳过,快速定位覆盖盲区。✅
VSTS 持续集成:8 步搭建指南
本地脚本之外,项目在 VSTS 上配置了持续集成,提交即自动构建、测试。完整步骤:
- 创建 VSTS 项目:在 VSTS 中新建一个项目作为团队容器;
- 创建构建定义:选择 "ASP.NET Core Preview" 模板,勾选 GitHub 来源、Hosted VS2017 默认代理队列和 Continuous Integration 触发;
- 添加 GitHub 服务连接:让 VSTS 有权拉取你的仓库;
- 设置仓库:在构建定义中指定仓库与分支;
- 切换 New Build Editor:使用新版可视化构建编辑器编排任务;
- 设置构建步骤:添加 .NET Core 还原、构建、测试任务;
- Test 步骤指定测试工程(注意用分号分隔两个 csproj):
**/Tests/StarWars.Tests.Unit/StarWars.Tests.Unit.csproj;**/Tests/StarWars.Tests.Integration/StarWars.Tests.Integration.csproj- 排队一次构建:确认构建成功且单元、集成测试全部通过后,开启 Build Badge,把构建状态徽章挂到 README 顶部。🏆
新手常见问题速查
- 报告里全是 Unknown file?没开
<DebugType>Full</DebugType>,或-searchdirs指向的目录与测试输出的 bin 目录不一致。 - 为什么排除 Program / Startup / Migrations / Seed?这些是启动入口与基础设施代码,统计它们只会拉低"业务代码覆盖率"的信噪比,
-filter的-前缀就是干这个的。 - 单元和集成覆盖率放哪看?互不干扰:
coverage/unit与coverage/integration各出一份 HTML 报告。 - CI 上没跑我的测试?检查 Test 步骤的 csproj 通配路径是否与仓库实际路径一致。
小结
StarWars 用两条 4 行的 bat 脚本就搭好了"OpenCover 采集 + ReportGenerator 报告"的覆盖率流水线,再叠加 VSTS 持续集成,实现了"提交即验证"的闭环。整套方案不引入任何重型工具链,参数全部透明可控,非常适合作为 .NET Core 项目落地代码覆盖率与 CI 的参考模板。🌌
【免费下载链接】StarWarsGraphQL 'Star Wars' example using GraphQL for .NET, ASP.NET Core, Entity Framework Core项目地址: https://gitcode.com/gh_mirrors/st/StarWars
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考