ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

dotnet-test 插件完全指南:面向 .NET 与多语言的测试运行、生成、分析与改进技能集

dotnet-test 插件完全指南:面向 .NET 与多语言的测试运行、生成、分析与改进技能集 dotnet-test 插件完全指南面向 .NET 与多语言的测试运行、生成、分析与改进技能集【免费下载链接】skillsRepository for skills to assist AI coding agents with .NET and C#项目地址: https://gitcode.com/GitHub_Trending/skills17/skills导读本文是plugins/dotnet-test插件的完整技术指南。该插件为 AI 编码代理GitHub Copilot 自定义 Agent、Codex 插件提供一套覆盖测试全生命周期的技能与代理从运行测试.NET到多语言测试生成Research → Plan → Implement 多代理流水线再到测试质量审计、覆盖率与 CRAP 风险分析、可测试性改造。读完本文你将掌握插件的全部 20 技能与 10 个代理的职责划分、适用场景、底层判定逻辑与真实命令形态能够在自己的项目或 CI/PR 自动化中直接选用最合适的技能。一、插件定位一个插件两种能力半径dotnet-test插件的设计核心是按能力半径分层面向 .NETMSTest、xUnit、NUnit、TUnit与两大测试平台VSTest、Microsoft.Testing.Platform提供深度能力同时把测试生成流水线与六个测试分析技能做成**多语言polyglot**能力扩展到 Pythonpytest/unittest、TypeScript/JavaScriptJest/Vitest/Mocha/Jasmine/node:test、JavaJUnit 4/5/TestNG、Gotesting/testify、RubyRSpec/Minitest、Rust内置/proptest、SwiftXCTest/Swift Testing、KotlinJUnit/Kotest、PowerShellPester和 CGoogleTest/Catch2/doctest/Boost.Test。从 plugin.json 可以看到插件的元信息版本0.2.22skills指向./skills/agents列出 10 个 GitHub Copilot.agent.md定义8 个 code-testing-* 内部子代理 testability-migrationtest-quality-auditor。范围划分测试框架/平台迁移MSTest/xUnit 升级、xUnit → MSTest、VSTest → Microsoft.Testing.Platform不在本插件内而由独立的dotnet-test-migration插件承担。何时使用本插件场景能力半径说明运行测试仅 .NET用dotnet test执行 SDK 风格项目或保留经典项目的 MSBuild VSTest/MSTest 命令生成测试多语言通过多代理流水线为任意语言脚手架单元测试迁移测试仅 .NET转交dotnet-test-migration插件审计测试质量多语言检测反模式、测试坏味道、断言缺口.NET 额外支持覆盖率风险提升可测试性仅 .NET发现静态依赖、生成包装器、迁移调用点度量覆盖率仅 .NET收集覆盖率、计算 CRAP 分数、暴露风险热点二、测试执行.NET2.1 run-tests仓库级命令决策引擎run-tests是运行 .NET 测试的强制入口其 SKILL.md 明确定义了触发词run the tests、精确的dotnet test命令、单个测试/类/分类/trait/目标框架、组合过滤器、--filter-query、--no-build、--diag、诊断日志、TRX、覆盖率收集、崩溃/挂起转储、过滤器错误或无法识别的选项。仅做平台识别时不要用它应走platform-detection。其核心是四路决策表区分经典非 SDK、VSTest 模式、可执行 MTP 桥接VSTest→MTP、SDK 10 原生 MTP 命令模式检测到的模式/平台命令形态绝不使用经典非 SDK仓库脚本或完整 MSBuild 后接vstest.console.exe/MSTest.exe假定dotnet test兼容或隐式迁移VSTest 模式 / VSTestdotnet test [path] [VSTEST_OPTIONS]MTP 专属旗标如--report-trx、--treenode-filterVSTest 模式 / 可执行 MTP 桥dotnet test [path] [DOTNET_OPTIONS] -- [MTP_OPTIONS]遗漏--分隔符SDK 10 上亦然原生 MTP 模式SDK 10dotnet test --project path [DOTNET_OPTIONS] [MTP_OPTIONS]裸位置参数项目路径或桥接分隔符三个关键判定要点global.json控制命令模式不一定控制执行平台。SDK 10 上test.runner选择命令模式但一个 VSTest 模式项目若启用了 MTP runner、TestingPlatformDotnetTestSupporttrue且最终OutputTypeExe仍是需要--的桥接语法。--project只在 SDK 10 原生 MTP 命令模式下合法VSTest 模式与 SDK 8/9 桥接使用位置项目路径。dotnet test/MSBuild 选项--framework、--configuration、--no-build、--verbosity放在--之前桥接模式下只有 MTP 应用参数放在--之后。实际命令示例来自 run-tests/SKILL.md 工作流# VSTest 模式 dotnet test path/to/Tests.csproj # VSTest 模式桥接到 MTP dotnet test path/to/Tests.csproj -- MTP_OPTIONS # SDK 10 原生 MTP 模式 dotnet test --project path/to/Tests.csproj MTP_OPTIONS # 单目标框架位于桥接分隔符之前 dotnet test path/to/Tests.csproj --framework net9.0 -- MTP_OPTIONS经典非 SDK 项目packages.config、显式Compile Include、旧 MSTest/Moq 栈的典型回退命令是 Windows 工具链nuget restore MySolution.sln MSBuild.exe MySolution.sln /t:Build /p:ConfigurationDebug vstest.console.exe path\to\MyTests.dll /TestAdapterPath:path\to\adapter\build\tfm子集过滤时保留仓库 runner 的过滤器语法如/TestCaseFilter:TestCategoryIntegration不要用dotnet test的过滤器示例替换经典 runner。报告的 TRX、诊断、转储、覆盖率旗标同样按平台区分详见 run-tests/SKILL.md 第 4 步的对照表VSTest 用--logger trx;LogFileName...、--diag、--blame-crash、--blame-hang、--collect Code CoverageMTP 用--report-trx、--diagnostic、--crashdump、--hangdump、--coverage且依赖对应注册扩展。该技能还支持**仓库覆盖层repository overlay**机制当仓库根目录存在.agents/skill-overlays/dotnet-test/run-tests.md时须校验其 frontmatter 声明core: dotnet-test/run-tests、binding-revision: 1、mode: extend后才可应用否则报告不匹配并忽略。2.2 platform-detection判定谁在执行测试platform-detection/SKILL.md 回答三个问题测试平台VSTest 还是 MTP、测试框架MSTest/xUnit/NUnit/TUnit、命令模式。其纪律是Platform指实际执行测试的平台绝不能仅凭global.json的test.runner分类执行平台——即使显式VSTest值也可能桥接到可执行 MTP 应用。框架探测依据包/SDK 引用框架MSTest元包、Project SdkMSTest.Sdk[/version]、Sdk NameMSTest.SdkMSTestMSTest.TestFrameworkMSTest.TestAdapterMSTestv3/v4 亦有效xunit、xunit.v3、xunit.v3.mtp-v1/v2、xunit.v3.core.mtp-v1/v2xUnitNUnitNUnit3TestAdapterNUnitTUnitTUnit仅 MTP平台判定按序进行最终UseVSTesttrue选 VSTest若与全局原生 MTP 命令模式冲突则报告Platform: unavailableglobal.json原生 MTP 选择 最终OutputTypeExe才在 MTP 上执行SDK 8/9 上 runner 启用 TestingPlatformDotnetTestSupporttrueOutputTypeExe三者齐备才在 MTP 执行。注意区分runner 属性选择测试应用TestingPlatformDotnetTestSupporttrue让 SDK 8/9 的dotnet test能到达该应用OutputTypeExe提供可执行宿主形态——它不选择或启用 MTP。2.3 filter-syntax平台与框架双维过滤器参考filter-syntax/SKILL.md 是纯参考型技能disable-model-invocation: true由run-tests和mtp-hot-reload按需加载覆盖三套语法体系VSTest 表达式MSTest、xUnit v2、NUnitPropertyOperatorValue[|Expression]操作符精确、!排除、~包含、!~不包含组合符|OR、AND与括号分组(A|B)C。支持属性MSTest 用FullyQualifiedName/Name/ClassName/Priority/TestCategoryxUnit 用FullyQualifiedName/DisplayName/TraitsNUnit 用FullyQualifiedName/Name/Priority/TestCategory。无操作符的表达式按FullyQualifiedName~value处理。MTP xUnit v3 专属旗标--filter-class、--filter-not-class、--filter-method、--filter-not-method、--filter-namespace、--filter-not-namespace、--filter-trait、--filter-not-trait多值可单旗标指定如--filter-class Foo Bar复杂表达式用--filter-query的路径段语法/assembly/namespace/class/method[traitvalue]如--filter-query /*/*/*IntegrationTests*/*[CategorySmoke]。MTP TUnit 的--treenode-filter路径式/Assembly/Namespace/ClassName/TestName各段支持*通配测试名后可追加属性过滤例如/*/*/*/*[CategorySmoke]、/*/*/(LoginTests)|(SignupTests)/*。该技能还提供迁移翻译表VSTest → xUnit v3 MTP如FullyQualifiedName~ClassName→--filter-class *ClassName*CategoryValue→--filter-trait CategoryValue。run-tests的 eval见 tests/dotnet-test/run-tests/eval.yaml正是通过过滤命令场景覆盖 VSTest 表达式、MTP 参数传递、xUnit v3 原生过滤器与 TUnit 树节点过滤器的正确性。2.4 mtp-hot-reload编辑即重跑的迭代循环mtp-hot-reload/SKILL.md 面向 MTP 控制台宿主的长驻编辑/重跑循环。热重载只在 MTP 下可用VSTest 直接硬性停止绝不把设置请求变成隐式 VSTest→MTP 迁移只提供dotnet watch --project project-path test作为非 MTP 回退。配置三步# 1. 安装扩展MTP runner 经 Microsoft.Testing.Platform.MSBuild 传递引用时自动注册 dotnet add project-path package Microsoft.Testing.Extensions.HotReload # 2. 激活热重载设置环境变量 export TESTINGPLATFORM_HOTRELOAD_ENABLED1推荐把环境变量写进Properties/launchSettings.json以可重复使用{ profiles: { ProjectName: { commandName: Project, environmentVariables: { TESTINGPLATFORM_HOTRELOAD_ENABLED: 1 } } } }运行用dotnet run --project project-path不是dotnet test宿主启动后保持存活、侦听代码改动并自动重跑受影响测试。过滤语法按框架区分MSTest/NUnit 用--filter FullyQualifiedName~TestMethodNamexUnit v3 用--filter-method *TestMethodNameTUnit 用--treenode-filter /*/*/ClassName/TestMethodName。方法签名变更、新增类型等rude edits无法应用到活动进程——直接启动的宿主需CtrlC→dotnet build→ 重跑原宿主命令也可用DOTNET_WATCH_RESTART_ON_RUDE_EDIT1配合dotnet watch run实现自动重启。三、测试生成多语言3.1 code-testing-agentResearch → Plan → Implement 多代理流水线code-testing-agent/SKILL.md 是插件的生成入口用多代理流水线为任何语言生成可编译、可通过的单元测试。其不可协商执行契约要求先分类范围Broad项目/包级套件或多文件实现前须在不可暂存的TESTAGENT_DIR中创建research.md与plan.md最终质量复审后写status.md缺文件即视为流程不完整。Focused单函数/类/文件或单个缺失方法不创建中间状态文件、不派生子代理把需求清单保持在最终表格中仅读目标文件与相邻测试确定约定运行最窄测试命令内联自审断言。流水线结构见 SKILL.md 中的架构图code-testing-generator协调器→code-testing-researcher分析代码库→code-testing-planner制定分阶段计划→code-testing-implementer按阶段写测试→ 其下再派发code-testing-builder编译、code-testing-tester运行、code-testing-fixer修复编译错误、code-testing-linter格式化与 lint。这是两级扇出第一级 generator → researcher/planner/implementer第二级 implementer → builder/tester/fixer/linter。VS Code 的多级扇出门控VS Code 默认关闭嵌套委托第一级开箱即用第二级需在设置中开启chat.subagents.allowInvocationsFromSubagents: true未开启时code-testing-implementer仍会内联完成构建/测试/修复/lint只是不派发 worker 子代理结果不受影响GitHub Copilot CLI 无此门控始终扇出。完成契约每项都必须满足生成的测试以最窄测试命令编译并通过每个显式用户需求都有具体测试与断言支撑最终摘要逐项引用测试名可审计broad 范围下每个可观察等价划分与不变量至少一个 mutation-relevant 用例多模块请求下每个模块自身非平凡公开行为有直接测试证据最终响应必须包含紧凑的Requirement | Evidence表格逐行逐字引用用户需求并引用精确测试名——引用一次干净运行而非一次尝试。MSTest 场景须先检查固定包版本再选异常断言MSTest 3.5.x 用Assert.ThrowsExceptionT勿用[ExpectedException]、Assert.ThrowsT或Assert.ThrowsExactlyT。测试风格默认依据 unit-test-generation.prompt.md约定发现、参数化策略、约 80% 覆盖率目标、语言特定模式。多文件范围下 C#、Python、TS/JS、Go、Java、Rust、Ruby、Kotlin、Swift、PowerShell、C 都会调用一次find-untested-sources消费其配对与建议路径输出。3.2 scaffold-dotnet-test-project 与 writing-mstest-tests.NETscaffold-dotnet-test-project创建缺失的测试项目或修复其项目/解决方案/filter 装配.sln/.slnf/.slnx接线。eval 位于 tests/dotnet-test/scaffold-dotnet-test-project/eval.yamlfixtures 内含 7 个 csproj、3 个 sln 与 slnx/slnf 变体。writing-mstest-tests面向现代与经典项目的版本兼容 MSTest 写作含 MSTest 3.x/4.x API与code-testing-agent配合使用时在后者确立范围与项目约定后作为支撑指导加载。3.3 code-testing-extensions生成流水线的语言参考数据code-testing-extensions是供生成流水线加载的语言特定指导如extensions/dotnet.md等见 skills/code-testing-extensions。它与test-analysis-extensions、filter-syntax一样设置disable-model-invocation: true被 CLI 排除出模型可见技能菜单由消费者按名加载。四、测试质量与分析多语言4.1 六个 polyglot 分析技能这六个技能覆盖全部支持语言靠从test-analysis-extensions加载每语言参考文件工作技能描述test-anti-patterns快速务实扫描常见测试质量问题带严重性排序Critical → Lowtest-smell-detection用学术测试坏味道分类法做深度正式审计19 种坏味道assertion-quality度量断言多样性与深度发现几乎不验证任何东西的浅测试test-gap-analysis通过伪变异验证测试盲区可选地补充能杀死变异的聚焦测试test-tagging用标准化 traitssmoke、regression、boundary、critical-path 等打标签框架有规范语法时自动编辑否则仅报告grade-tests对精选测试方法逐个评分产出 PR 评论友好的字母等级A–F表格4.2 grade-tests逐测试评分的 PR 反馈机制grade-tests/SKILL.md 是唯一自带评分准则的技能它内嵌子分维度、权重与反模式目录保证跨调用评分一致。它不自动发现测试——调用方PR 自动化或持具体清单的人工评审必须提供测试方法、方法体或文件行区间模糊请求如grade my tests无范围直接拒绝并引导到test-quality-auditor或test-anti-patterns。评分模型每测试从A90–100起步仅对可观察问题扣分三个子分加权合成总分0.45 × Assertion 0.30 × Anti-pattern 0.25 × StructureA4、B3、C2、D1、F0映射区间≥3.5→A、≥2.8→B、≥2.0→C、≥1.2→D、1.2→F且总分封顶于最差子分。反模式子分用硬天花板 中等扣分两遍确定性计算每个 Critical/High 项设上限F/D/C中等项每项降一档可累积。输出为紧凑的Test | Grade | Band | Notes表格备注 ≤120 字符超 50 行时先展示 B 以下全部、其余折叠进details。4.3 test-analysis-extensions让技能保持语言中立的参考层test-analysis-extensions/SKILL.md 提供按语言组织的参考文件同类别测试标记、断言 API、sleep/延迟模式、skip 注解、mystery guest 指示符、集成标记、setup/teardown、tag 支持能力文件语言/框架extensions/dotnet.md.NETC#/F#/VB— MSTest、xUnit、NUnit、TUnitextensions/python.mdPython — pytest、unittestextensions/typescript.mdTS/JS — Jest、Vitest、Mocha、Jasmine、node:testextensions/java.mdJava — JUnit 4/5、TestNGextensions/go.mdGo — testing、testifyextensions/ruby.mdRuby — RSpec、Minitestextensions/rust.mdRust — 内置#[test]、cargo testextensions/swift.mdSwift — XCTest、Swift Testingextensions/kotlin.mdKotlin — JUnit 5、Kotest、MockKextensions/powershell.mdPowerShell — Pester v5extensions/cpp.mdC — GoogleTest、Catch2、doctest每文件声明tag 支持能力三选一auto-edit有规范语法可安全写入、report-only无规范语法仅出报告、convention-based仅名字/注释约定。test-tagging据此决定自动编辑还是报告test-quality-auditor的路由与能力矩阵同样依赖这一层。这些扩展技能是数据而非指导——它们告诉技能如何在各语言中检测而不是怎么想。五、覆盖率与风险.NETcoverage-analysis项目级覆盖率收集 CRAP 分数计算 风险热点报告。已有 Cobertura 报告时直接接受自动收集仅限 SDK 风格项目经典项目必须用仓库自有覆盖率命令不注入 SDK 风格覆盖包。crap-score为单个方法/类/文件计算 CRAPChange Risk Anti-Patterns分数。非 .NET 语言使用各生态原生覆盖率工具见 README.md 第 57 行清单Pythoncoverage.py/pytest-covJS/TSjest --coverage/c8/nyc/vitest --coverageJava JaCoCoGogo test -coverprofileRuby SimpleCovRustcargo-tarpaulin/cargo-llvm-covSwiftxcrun llvm-covKotlin KoverPowerShell Pester 内建覆盖率Cgcov/llvm-cov。六、可测试性改进.NET四个技能形成一条检测 → 生成包装 → 迁移调用点 → 定点解除障碍的链路技能职责detect-static-dependencies扫描 C# 中难测的静态依赖DateTime.Now、File.*、HttpClient等generate-testability-wrappers生成包装接口或引导采用内置抽象TimeProvider、IFileSystem/System.IO.Abstractionsmigrate-static-to-wrapper批量把静态调用点替换为包装调用并添加构造函数注入testability-obstacle解除一个具体的 ambient-dependency 阻塞点并用固定/内存依赖测试该行为该链路由testability-migration代理agents/testability-migration.agent.md编排四阶段流水线Detect → Generate → Migrate → Test另有一条targeted obstacle路径单类/单方法 缺失 seam 确定性测试三者齐备时跳过前三阶段直接使用testability-obstacle。其安全规则包括绝不修改生成代码*.Designer.cs、*.g.cs、obj/、bin/检测阶段绝不改测试代码每次改动后必须dotnet build通过包装必须直接委托静态零逻辑变化增量迁移单次一个作用域20 文件才可整解新测试不得触碰真实环境资源。若代码库用 .NET Framework 4.6TimeProvider不可用、静态位于生成代码、或类是 sealed 却想 mock——都应停止并警告。七、代理体系入口代理与内部子代理7.1 用户直接调用的入口代理代理用途test-quality-auditor运行多技能审计流水线产出综合测试套件评估报告testability-migration端到端可测试性改进检测 → 生成包装 → 迁移调用点 → 按需添加确定性测试test-quality-auditoragents/test-quality-auditor.agent.md是polyglot 诊断型代理先做语言检测按每种语言的 marker 扫描.NET 查 csproj 中 MSTest/xunit/NUnit/TUnit 引用Python 查 pytest 配置JS/TS 查 package.json 依赖等再用能力矩阵门控流水线步骤。推荐顺序①test-anti-patterns严重性排序→ ②assertion-quality→ ③test-gap-analysis→ ④coverage-analysis.NET only非 .NET 跳过并推荐原生工具→ 可选 ⑤test-smell-detection⑥exp-test-maintainability.NET only⑦exp-mock-usage-analysis.NET only⑧test-tagging。核心纪律被门控跳过的步骤必须在报告中显式说明原因与替代工具绝不静默丢弃对dotnet-experimental的技能exp-test-maintainability、exp-mock-usage-analysis须诚实标注其实验性与 .NET-only 属性。7.2 内部子代理user-invocable: false由流水线自动调用代理调用方用途code-testing-generatorcode-testing-agent 技能编排完整生成流水线code-testing-researchercode-testing-generator分析代码库结构、测试模式与可测试性code-testing-plannercode-testing-generator依据研究结果制定分阶段实现计划code-testing-implementercode-testing-generator按计划实现一个阶段运行 build-test-fix 循环code-testing-buildercode-testing-implementer运行构建/编译命令并报告code-testing-testercode-testing-implementer运行测试命令并报告通过/失败code-testing-fixercode-testing-implementer修复源文件或测试文件的编译错误code-testing-lintercode-testing-implementer运行格式化与 lintCodex 安装注意Codex 插件安装会暴露本插件的 skills但不会暴露这些.agent.md代理及其静态 handoff。八、前置条件与经典项目支持8.1 多语言技能/代理测试生成流水线、六个分析技能与test-quality-auditor覆盖上述所有语言只需目标语言有可用的测试运行时如pythonpytest、nodenpm test、mvn/gradle、go、bundle exec rspec、cargo test、swift test、pwsh Pester、cmake C 测试 runner。技能会自动检测框架。8.2 .NET 专属技能/代理已安装 .NET SDKdotnet在 PATH 上一个含既有测试框架MSTest、xUnit、NUnit 或 TUnit的项目用于执行、迁移、覆盖率、CRAP、可测试性与实验性dotnet-experimental技能8.3 经典非 SDK .NET 项目生成与分析启发式支持packages.config、显式Compile Include、旧 MSTest/Moq 栈与自定义 base fixture 的经典项目生成时会保留这些约定并把每个新测试文件注册进项目。执行要求仓库既有的 Windows/Visual Studio 工具链通常是完整 MSBuild vstest.console.exe或MSTest.exe覆盖率与 CRAP 分析接受既有 Cobertura 报告不向经典项目注入 SDK 风格覆盖包缺少所需 runner 或覆盖率工作流时技能报告限制而非迁移项目。可测试性包装与迁移是独立的显式 opt-in 工作流——测试生成与质量审计不会引入生产 seam且所有可测试性工作流必须遵守仓库禁止此类重构的规则。九、如何验证eval 与测试基建本插件的技能均有对应 eval 定义tests/dotnet-test/skill/eval.yaml共 20 个如 run-tests、grade-tests、platform-detection、mtp-hot-reload 等每个技能目录下还配有真实 fixtures如code-testing-agent的 51 文件多语言 fixture、scaffold-dotnet-test-project的多套 sln/slnf/slnx 方案。这些 eval 通过 eng/skill-validator 与 eng/run-skill-evals.sh 驱动。值得注意的测量策略三个参考技能code-testing-extensions、test-analysis-extensions、filter-syntax刻意没有直接的tests/dotnet-test/skill/eval.yaml——因为实验的技能组臂只加载单个技能而模型在此永远无法调用它们直接 eval 会得到两个相同臂并只度量 judge 噪声。它们通过消费方结果测量test-analysis-extensions由 polyglot 分析技能与grade-tests度量code-testing-extensions由code-testing-agent度量filter-syntax由run-tests与mtp-hot-reload的过滤场景度量run-testseval 覆盖 VSTest 表达式、MTP 参数传递、xUnit v3 原生过滤器与 TUnit 树节点过滤器。十、快速选型指南你的诉求选择运行/过滤 .NET 测试、要精确命令run-tests 需要时filter-syntax、platform-detection判断项目跑在 VSTest 还是 MTPplatform-detection编辑后快速重跑修复mtp-hot-reload为任意语言生成单元测试code-testing-agent技能 →code-testing-generator代理全套件健康审计test-quality-auditor代理单个 PR 测试逐个评分grade-tests找反模式/坏味道/断言浅/变异盲区/打标签对应六个分析技能之一.NET 覆盖率与 CRAPcoverage-analysis/crap-score让遗留代码可测试detect-static-dependencies→generate-testability-wrappers→migrate-static-to-wrapper或单点testability-obstacle由testability-migration代理编排迁移测试框架/平台转向dotnet-test-migration插件整套技能与代理的入口文档是 plugins/dotnet-test/README.md各技能细节以 plugins/dotnet-test/skills 下的 SKILL.md 为准代理定义在 plugins/dotnet-test/agents而每个技能的实测证据与 fixtures 可在 tests/dotnet-test 中按名对照查阅。【免费下载链接】skillsRepository for skills to assist AI coding agents with .NET and C#项目地址: https://gitcode.com/GitHub_Trending/skills17/skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表