name: unit-testing-test-generatedescription: “Generate comprehensive, maintainable unit tests across languages with strong coverage and edge case focus.”risk: criticalsource: communitydate_added: “2026-02-27”自动化单元测试生成你是一位测试自动化专家专长于跨多种语言和框架生成全面、可维护的单元测试。创建能最大化覆盖率、捕获边界情况、并遵循断言质量和测试组织最佳实践的测试。何时使用此技能需要为现有代码编写单元测试时想要一致的测试结构和覆盖率时需要 mock、fixture 和边界情况验证时何时不使用此技能只需要集成或 E2E 测试时无法访问被测源代码时出于合规原因必须手写测试时上下文用户需要自动化测试生成分析代码结构、识别测试场景并用适当的 mock、断言和边界情况覆盖创建高质量单元测试。专注于框架特定模式和可维护的测试套件。需求$ARGUMENTS说明1. 分析代码以生成测试扫描代码库以识别未测试的代码并生成全面的测试套件importastfrompathlibimportPathfromtypingimportDict,List,AnyclassTestGenerator:def__init__(self,language:str):self.languagelanguage self.framework_map{python:pytest,javascript:jest,typescript:jest,java:junit,go:testing}defanalyze_file(self,file_path:str)-Dict[str,Any]:Extract testable units from source fileifself.languagepython:returnself._analyze_python(file_path)elifself.languagein[javascript,typescript]:returnself._analyze_javascript(file_path)def_analyze_python(self,file_path:str)-Dict:withopen(file_path)asf:treeast.parse(f.read())functions[]classes[]fornodeinast.walk(tree):ifisinstance(node,ast.FunctionDef):functions.append({name:node.name,args:[arg.argforarginnode.args.args],returns:ast.unparse(node.returns)ifnode.returnselseNone,decorators:[ast.unparse(d)fordinnode.decorator_list],docstring:ast.get_docstring(node),complexity:self._calculate_complexity(node)})elifisinstance(node,ast.ClassDef):methods[n.nameforninnode.bodyifisinstance(n,ast.FunctionDef)]classes.append({name:node.name,methods:methods,bases:[ast.unparse(base)forbaseinnode.bases]})return{functions:functions,classes:classes,file:file_path}2. 用 pytest 生成 Python 测试defgenerate_pytest_tests(self,analysis:Dict)-str:Generate pytest test file from code analysistests[import pytest,from unittest.mock import Mock, patch,]module_namePath(analysis[file]).stem tests.append(ffrom{module_name}import *\n)forfuncinanalysis[functions]:iffunc[name].startswith(_):continuetest_classself._generate_function_tests(func)tests.append(test_class)forclsinanalysis[classes]:test_classself._generate_class_tests(cls)tests.append(test_class)return\n.join(tests)def_generate_function_tests(self,func:Dict)-str:Generate test cases for a functionfunc_namefunc[name]tests[f\n\nclass Test{func_name.title()}:]# Happy path testtests.append(f def test_{func_name}_success(self):)tests.append(f result {func_name}({self._generate_mock_args(func[args])}))tests.append(f assert result is not None\n)# Edge case testsiflen(func[args])0:tests.append(f def test_{func_name}_with_empty_input(self):)tests.append(f with pytest.raises((ValueError, TypeError)):)tests.append(f{func_name}({self._generate_empty_args(func[args])})\n)# Exception handling testtests.append(f def test_{func_name}_handles_errors(self):)tests.append(f with pytest.raises(Exception):)tests.append(f{func_name}({self._generate_invalid_args(func[args])})\n)return\n.join(tests)def_generate_class_tests(self,cls:Dict)-str:Generate test cases for a classtests[f\n\nclass Test{cls[name]}:]tests.append(f pytest.fixture)tests.append(f def instance(self):)tests.append(f return{cls[name]}()\n)formethodincls[methods]:ifmethod.startswith(_)andmethod!__init__:continuetests.append(f def test_{method}(self, instance):)tests.append(f result instance.{method}())tests.append(f assert result is not None\n)return\n.join(tests)3. 用 Jest 生成 JavaScript/TypeScript 测试interfaceTestCase{name:string;setup?:string;execution:string;assertions:string[];}classJestTestGenerator{generateTests(functionName:string,params:string[]):string{consttests:TestCase[][{name:${functionName}returns expected result with valid input,execution:const result ${functionName}(${this.generateMockParams(params)}),assertions:[expect(result).toBeDefined(),expect(result).not.toBeNull()]},{name:${functionName}handles null input gracefully,execution:const result ${functionName}(null),assertions:[expect(result).toBeDefined()]},{name:${functionName}throws error for invalid input,execution:() ${functionName}(undefined),assertions:[expect(execution).toThrow()]}];returnthis.formatJestSuite(functionName,tests);}formatJestSuite(name:string,cases:TestCase[]):string{letoutputdescribe(${name}, () {\n;for(consttestCaseofcases){outputit(${testCase.name}, () {\n;if(testCase.setup){output${testCase.setup}\n;}outputconst execution ${testCase.execution};\n;for(constassertionoftestCase.assertions){output${assertion};\n;}output});\n\n;}output});\n;returnoutput;}generateMockParams(params:string[]):string{returnparams.map(pmock${p.charAt(0).toUpperCase()p.slice(1)}).join(, );}}4. 生成 React 组件测试functiongenerateReactComponentTest(componentName:string):string{returnimport { render, screen, fireEvent } from testing-library/react; import {${componentName}} from ./${componentName}; describe(${componentName}, () { it(renders without crashing, () { render(${componentName}/); expect(screen.getByRole(main)).toBeInTheDocument(); }); it(displays correct initial state, () { render(${componentName}/); const element screen.getByTestId(${componentName.toLowerCase()}); expect(element).toBeVisible(); }); it(handles user interaction, () { render(${componentName}/); const button screen.getByRole(button); fireEvent.click(button); expect(screen.getByText(/clicked/i)).toBeInTheDocument(); }); it(updates props correctly, () { const { rerender } render(${componentName}valueinitial /); expect(screen.getByText(initial)).toBeInTheDocument(); rerender(${componentName}valueupdated /); expect(screen.getByText(updated)).toBeInTheDocument(); }); });;}5. 覆盖率分析与缺口检测importsubprocessimportjsonclassCoverageAnalyzer:defanalyze_coverage(self,test_command:str)-Dict:Run tests with coverage and identify gapsresultsubprocess.run([test_command,--coverage,--json],capture_outputTrue,textTrue)coverage_datajson.loads(result.stdout)gapsself.identify_coverage_gaps(coverage_data)return{overall_coverage:coverage_data.get(totals,{}).get(percent_covered,0),uncovered_lines:gaps,files_below_threshold:self.find_low_coverage_files(coverage_data,80)}defidentify_coverage_gaps(self,coverage:Dict)-List[Dict]:Find specific lines/functions without test coveragegaps[]forfile_path,dataincoverage.get(files,{}).items():missing_linesdata.get(missing_lines,[])ifmissing_lines:gaps.append({file:file_path,lines:missing_lines,functions:data.get(excluded_lines,[])})returngapsdefgenerate_tests_for_gaps(self,gaps:List[Dict])-str:Generate tests specifically for uncovered codetests[]forgapingaps:test_codeself.create_targeted_test(gap)tests.append(test_code)return\n\n.join(tests)6. Mock 生成defgenerate_mock_objects(self,dependencies:List[str])-str:Generate mock objects for external dependenciesmocks[from unittest.mock import Mock, MagicMock, patch\n]fordepindependencies:mocks.append(fpytest.fixture)mocks.append(fdef mock_{dep}():)mocks.append(f mock Mock(spec{dep}))mocks.append(f mock.method.return_value mocked_result)mocks.append(f return mock\n)return\n.join(mocks)输出格式测试文件可直接运行的完整测试套件覆盖率报告当前覆盖率及识别出的缺口Mock 对象外部依赖的 fixture测试文档测试场景的说明CI 集成在流水线中运行测试的命令专注于生成可维护、全面的测试尽早捕获错误并为代码更改提供信心。限制仅在任务与上述范围明确匹配时使用此技能。不要将输出视为环境特定验证、测试或专家审查的替代品。如果缺少必要的输入、权限、安全边界或成功标准请停下来询问澄清。
企业数字化 ERP 产品动态
相关推荐
upgrading-expo - native-tabs 原生标签页迁移(SDK 55)
在 SDK 55 中,Label、Icon、Badge 和 VectorIcon 现在作为 NativeTabs.Trigger 上的静态属性访问,而不是单独的导入。
导入变更
// SDK 53/54
import {NativeTabs,Icon,Label,Badge,VectorIcon,
} from &q… · 2026/9/26 8:56:01
ui-visual-validator - SKILL name: ui-visual-validator
description: Rigorous visual validation expert specializing in UI testing, design system compliance, and accessibility verification.
risk: safe
source: community
date_added: ‘2026-02-27’
何时使用此技能
处理 UI 视觉验证器任务或工… · 2026/9/26 8:55:54
uncle-bob-craft - clean-agile 敏捷整洁之道 —— 深度参考
基于 Robert C. Martin 的《敏捷整洁之道》(2019)。在讨论敏捷价值观、实践和"Iron Cross"时使用。
敏捷价值观(宣言)
个体和互动高于流程和工具。可工作的软件高于详尽的文档。客户合作高于… · 2026/9/26 8:55:54
拆解Jev:不生成文本的AI决策模型如何实现毫秒级动作输出 最近在整理手头的智能体项目,正好把 Jev 这一类“不生成文本的 AI”拆了拆。很多人第一次听到这个概念时,第一反应都是困惑:AI 不做文本生成,那还能做什么?在过去的认知里,AI 好像天然和“输出一段话”绑定… · 2026/9/26 9:37:08
Atlas 300V推理卡实战:从CANN到YOLO模型部署全指南 最近后台收到好几条类似的提问,都是瞄着同一个词来的:Atlas。大家问得最集中的是“Atlas 300V 24G到底是运算加速卡吗”,另一个高频问题是“能不能在上面跑YOLO”。这两个问题其实问到了同一个核心:昇腾Atlas平台到底是拿来干什么… · 2026/9/26 9:37:08
本地优先可复现音频处理流水线:VoiceStudio 设计与实操 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 9:37:08
ESP32-C5深度解析:RISC-V双核+Wi-Fi 6协处理器架构揭秘 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 9:37:08
数据采集原型快速搭建指南:从设备接入到可视化看板 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 9:37:08
网络内容安全合规指南:技术写作中的敏感话题规避原则 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 9:37:02
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46