unit-testing-test-generate - SKILL
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 集成在流水线中运行测试的命令专注于生成可维护、全面的测试尽早捕获错误并为代码更改提供信心。限制仅在任务与上述范围明确匹配时使用此技能。不要将输出视为环境特定验证、测试或专家审查的替代品。如果缺少必要的输入、权限、安全边界或成功标准请停下来询问澄清。