jarvis-ai-assistant 0.7.8__py3-none-any.whl → 1.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- jarvis/__init__.py +1 -1
- jarvis/jarvis_agent/__init__.py +567 -222
- jarvis/jarvis_agent/agent_manager.py +19 -12
- jarvis/jarvis_agent/builtin_input_handler.py +79 -11
- jarvis/jarvis_agent/config_editor.py +7 -2
- jarvis/jarvis_agent/event_bus.py +24 -13
- jarvis/jarvis_agent/events.py +19 -1
- jarvis/jarvis_agent/file_context_handler.py +67 -64
- jarvis/jarvis_agent/file_methodology_manager.py +38 -24
- jarvis/jarvis_agent/jarvis.py +186 -114
- jarvis/jarvis_agent/language_extractors/__init__.py +8 -1
- jarvis/jarvis_agent/language_extractors/c_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/cpp_extractor.py +9 -4
- jarvis/jarvis_agent/language_extractors/go_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/java_extractor.py +27 -20
- jarvis/jarvis_agent/language_extractors/javascript_extractor.py +22 -17
- jarvis/jarvis_agent/language_extractors/python_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/rust_extractor.py +7 -4
- jarvis/jarvis_agent/language_extractors/typescript_extractor.py +22 -17
- jarvis/jarvis_agent/language_support_info.py +250 -219
- jarvis/jarvis_agent/main.py +19 -23
- jarvis/jarvis_agent/memory_manager.py +9 -6
- jarvis/jarvis_agent/methodology_share_manager.py +21 -15
- jarvis/jarvis_agent/output_handler.py +4 -2
- jarvis/jarvis_agent/prompt_builder.py +7 -6
- jarvis/jarvis_agent/prompt_manager.py +113 -8
- jarvis/jarvis_agent/prompts.py +317 -85
- jarvis/jarvis_agent/protocols.py +5 -2
- jarvis/jarvis_agent/run_loop.py +192 -32
- jarvis/jarvis_agent/session_manager.py +7 -3
- jarvis/jarvis_agent/share_manager.py +23 -13
- jarvis/jarvis_agent/shell_input_handler.py +12 -8
- jarvis/jarvis_agent/stdio_redirect.py +25 -26
- jarvis/jarvis_agent/task_analyzer.py +29 -23
- jarvis/jarvis_agent/task_list.py +869 -0
- jarvis/jarvis_agent/task_manager.py +26 -23
- jarvis/jarvis_agent/tool_executor.py +6 -5
- jarvis/jarvis_agent/tool_share_manager.py +24 -14
- jarvis/jarvis_agent/user_interaction.py +3 -3
- jarvis/jarvis_agent/utils.py +9 -1
- jarvis/jarvis_agent/web_bridge.py +37 -17
- jarvis/jarvis_agent/web_output_sink.py +5 -2
- jarvis/jarvis_agent/web_server.py +165 -36
- jarvis/jarvis_c2rust/__init__.py +1 -1
- jarvis/jarvis_c2rust/cli.py +260 -141
- jarvis/jarvis_c2rust/collector.py +37 -18
- jarvis/jarvis_c2rust/constants.py +60 -0
- jarvis/jarvis_c2rust/library_replacer.py +242 -1010
- jarvis/jarvis_c2rust/library_replacer_checkpoint.py +133 -0
- jarvis/jarvis_c2rust/library_replacer_llm.py +287 -0
- jarvis/jarvis_c2rust/library_replacer_loader.py +191 -0
- jarvis/jarvis_c2rust/library_replacer_output.py +134 -0
- jarvis/jarvis_c2rust/library_replacer_prompts.py +124 -0
- jarvis/jarvis_c2rust/library_replacer_utils.py +188 -0
- jarvis/jarvis_c2rust/llm_module_agent.py +98 -1044
- jarvis/jarvis_c2rust/llm_module_agent_apply.py +170 -0
- jarvis/jarvis_c2rust/llm_module_agent_executor.py +288 -0
- jarvis/jarvis_c2rust/llm_module_agent_loader.py +170 -0
- jarvis/jarvis_c2rust/llm_module_agent_prompts.py +268 -0
- jarvis/jarvis_c2rust/llm_module_agent_types.py +57 -0
- jarvis/jarvis_c2rust/llm_module_agent_utils.py +150 -0
- jarvis/jarvis_c2rust/llm_module_agent_validator.py +119 -0
- jarvis/jarvis_c2rust/loaders.py +28 -10
- jarvis/jarvis_c2rust/models.py +5 -2
- jarvis/jarvis_c2rust/optimizer.py +192 -1974
- jarvis/jarvis_c2rust/optimizer_build_fix.py +286 -0
- jarvis/jarvis_c2rust/optimizer_clippy.py +766 -0
- jarvis/jarvis_c2rust/optimizer_config.py +49 -0
- jarvis/jarvis_c2rust/optimizer_docs.py +183 -0
- jarvis/jarvis_c2rust/optimizer_options.py +48 -0
- jarvis/jarvis_c2rust/optimizer_progress.py +469 -0
- jarvis/jarvis_c2rust/optimizer_report.py +52 -0
- jarvis/jarvis_c2rust/optimizer_unsafe.py +309 -0
- jarvis/jarvis_c2rust/optimizer_utils.py +469 -0
- jarvis/jarvis_c2rust/optimizer_visibility.py +185 -0
- jarvis/jarvis_c2rust/scanner.py +229 -166
- jarvis/jarvis_c2rust/transpiler.py +531 -2732
- jarvis/jarvis_c2rust/transpiler_agents.py +503 -0
- jarvis/jarvis_c2rust/transpiler_build.py +1294 -0
- jarvis/jarvis_c2rust/transpiler_codegen.py +204 -0
- jarvis/jarvis_c2rust/transpiler_compile.py +146 -0
- jarvis/jarvis_c2rust/transpiler_config.py +178 -0
- jarvis/jarvis_c2rust/transpiler_context.py +122 -0
- jarvis/jarvis_c2rust/transpiler_executor.py +516 -0
- jarvis/jarvis_c2rust/transpiler_generation.py +278 -0
- jarvis/jarvis_c2rust/transpiler_git.py +163 -0
- jarvis/jarvis_c2rust/transpiler_mod_utils.py +225 -0
- jarvis/jarvis_c2rust/transpiler_modules.py +336 -0
- jarvis/jarvis_c2rust/transpiler_planning.py +394 -0
- jarvis/jarvis_c2rust/transpiler_review.py +1196 -0
- jarvis/jarvis_c2rust/transpiler_symbols.py +176 -0
- jarvis/jarvis_c2rust/utils.py +269 -79
- jarvis/jarvis_code_agent/after_change.py +233 -0
- jarvis/jarvis_code_agent/build_validation_config.py +37 -30
- jarvis/jarvis_code_agent/builtin_rules.py +68 -0
- jarvis/jarvis_code_agent/code_agent.py +976 -1517
- jarvis/jarvis_code_agent/code_agent_build.py +227 -0
- jarvis/jarvis_code_agent/code_agent_diff.py +246 -0
- jarvis/jarvis_code_agent/code_agent_git.py +525 -0
- jarvis/jarvis_code_agent/code_agent_impact.py +177 -0
- jarvis/jarvis_code_agent/code_agent_lint.py +283 -0
- jarvis/jarvis_code_agent/code_agent_llm.py +159 -0
- jarvis/jarvis_code_agent/code_agent_postprocess.py +105 -0
- jarvis/jarvis_code_agent/code_agent_prompts.py +46 -0
- jarvis/jarvis_code_agent/code_agent_rules.py +305 -0
- jarvis/jarvis_code_agent/code_analyzer/__init__.py +52 -48
- jarvis/jarvis_code_agent/code_analyzer/base_language.py +12 -10
- jarvis/jarvis_code_agent/code_analyzer/build_validator/__init__.py +12 -11
- jarvis/jarvis_code_agent/code_analyzer/build_validator/base.py +16 -12
- jarvis/jarvis_code_agent/code_analyzer/build_validator/cmake.py +26 -17
- jarvis/jarvis_code_agent/code_analyzer/build_validator/detector.py +558 -104
- jarvis/jarvis_code_agent/code_analyzer/build_validator/fallback.py +27 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/go.py +22 -18
- jarvis/jarvis_code_agent/code_analyzer/build_validator/java_gradle.py +21 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/java_maven.py +20 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/makefile.py +27 -16
- jarvis/jarvis_code_agent/code_analyzer/build_validator/nodejs.py +47 -23
- jarvis/jarvis_code_agent/code_analyzer/build_validator/python.py +71 -37
- jarvis/jarvis_code_agent/code_analyzer/build_validator/rust.py +162 -35
- jarvis/jarvis_code_agent/code_analyzer/build_validator/validator.py +111 -57
- jarvis/jarvis_code_agent/code_analyzer/build_validator.py +18 -12
- jarvis/jarvis_code_agent/code_analyzer/context_manager.py +185 -183
- jarvis/jarvis_code_agent/code_analyzer/context_recommender.py +2 -1
- jarvis/jarvis_code_agent/code_analyzer/dependency_analyzer.py +24 -15
- jarvis/jarvis_code_agent/code_analyzer/file_ignore.py +227 -141
- jarvis/jarvis_code_agent/code_analyzer/impact_analyzer.py +321 -247
- jarvis/jarvis_code_agent/code_analyzer/language_registry.py +37 -29
- jarvis/jarvis_code_agent/code_analyzer/language_support.py +21 -13
- jarvis/jarvis_code_agent/code_analyzer/languages/__init__.py +15 -9
- jarvis/jarvis_code_agent/code_analyzer/languages/c_cpp_language.py +75 -45
- jarvis/jarvis_code_agent/code_analyzer/languages/go_language.py +87 -52
- jarvis/jarvis_code_agent/code_analyzer/languages/java_language.py +84 -51
- jarvis/jarvis_code_agent/code_analyzer/languages/javascript_language.py +94 -64
- jarvis/jarvis_code_agent/code_analyzer/languages/python_language.py +109 -71
- jarvis/jarvis_code_agent/code_analyzer/languages/rust_language.py +97 -63
- jarvis/jarvis_code_agent/code_analyzer/languages/typescript_language.py +103 -69
- jarvis/jarvis_code_agent/code_analyzer/llm_context_recommender.py +271 -268
- jarvis/jarvis_code_agent/code_analyzer/symbol_extractor.py +76 -64
- jarvis/jarvis_code_agent/code_analyzer/tree_sitter_extractor.py +92 -19
- jarvis/jarvis_code_agent/diff_visualizer.py +998 -0
- jarvis/jarvis_code_agent/lint.py +223 -524
- jarvis/jarvis_code_agent/rule_share_manager.py +158 -0
- jarvis/jarvis_code_agent/rules/clean_code.md +144 -0
- jarvis/jarvis_code_agent/rules/code_review.md +115 -0
- jarvis/jarvis_code_agent/rules/documentation.md +165 -0
- jarvis/jarvis_code_agent/rules/generate_rules.md +52 -0
- jarvis/jarvis_code_agent/rules/performance.md +158 -0
- jarvis/jarvis_code_agent/rules/refactoring.md +139 -0
- jarvis/jarvis_code_agent/rules/security.md +160 -0
- jarvis/jarvis_code_agent/rules/tdd.md +78 -0
- jarvis/jarvis_code_agent/test_rules/cpp_test.md +118 -0
- jarvis/jarvis_code_agent/test_rules/go_test.md +98 -0
- jarvis/jarvis_code_agent/test_rules/java_test.md +99 -0
- jarvis/jarvis_code_agent/test_rules/javascript_test.md +113 -0
- jarvis/jarvis_code_agent/test_rules/php_test.md +117 -0
- jarvis/jarvis_code_agent/test_rules/python_test.md +91 -0
- jarvis/jarvis_code_agent/test_rules/ruby_test.md +102 -0
- jarvis/jarvis_code_agent/test_rules/rust_test.md +86 -0
- jarvis/jarvis_code_agent/utils.py +36 -26
- jarvis/jarvis_code_analysis/checklists/loader.py +21 -21
- jarvis/jarvis_code_analysis/code_review.py +64 -33
- jarvis/jarvis_data/config_schema.json +285 -192
- jarvis/jarvis_git_squash/main.py +8 -6
- jarvis/jarvis_git_utils/git_commiter.py +53 -76
- jarvis/jarvis_mcp/__init__.py +5 -2
- jarvis/jarvis_mcp/sse_mcp_client.py +40 -30
- jarvis/jarvis_mcp/stdio_mcp_client.py +27 -19
- jarvis/jarvis_mcp/streamable_mcp_client.py +35 -26
- jarvis/jarvis_memory_organizer/memory_organizer.py +78 -55
- jarvis/jarvis_methodology/main.py +48 -39
- jarvis/jarvis_multi_agent/__init__.py +56 -23
- jarvis/jarvis_multi_agent/main.py +15 -18
- jarvis/jarvis_platform/base.py +179 -111
- jarvis/jarvis_platform/human.py +27 -16
- jarvis/jarvis_platform/kimi.py +52 -45
- jarvis/jarvis_platform/openai.py +101 -40
- jarvis/jarvis_platform/registry.py +51 -33
- jarvis/jarvis_platform/tongyi.py +68 -38
- jarvis/jarvis_platform/yuanbao.py +59 -43
- jarvis/jarvis_platform_manager/main.py +68 -76
- jarvis/jarvis_platform_manager/service.py +24 -14
- jarvis/jarvis_rag/README_CONFIG.md +314 -0
- jarvis/jarvis_rag/README_DYNAMIC_LOADING.md +311 -0
- jarvis/jarvis_rag/README_ONLINE_MODELS.md +230 -0
- jarvis/jarvis_rag/__init__.py +57 -4
- jarvis/jarvis_rag/cache.py +3 -1
- jarvis/jarvis_rag/cli.py +48 -68
- jarvis/jarvis_rag/embedding_interface.py +39 -0
- jarvis/jarvis_rag/embedding_manager.py +7 -230
- jarvis/jarvis_rag/embeddings/__init__.py +41 -0
- jarvis/jarvis_rag/embeddings/base.py +114 -0
- jarvis/jarvis_rag/embeddings/cohere.py +66 -0
- jarvis/jarvis_rag/embeddings/edgefn.py +117 -0
- jarvis/jarvis_rag/embeddings/local.py +260 -0
- jarvis/jarvis_rag/embeddings/openai.py +62 -0
- jarvis/jarvis_rag/embeddings/registry.py +293 -0
- jarvis/jarvis_rag/llm_interface.py +8 -6
- jarvis/jarvis_rag/query_rewriter.py +8 -9
- jarvis/jarvis_rag/rag_pipeline.py +61 -52
- jarvis/jarvis_rag/reranker.py +7 -75
- jarvis/jarvis_rag/reranker_interface.py +32 -0
- jarvis/jarvis_rag/rerankers/__init__.py +41 -0
- jarvis/jarvis_rag/rerankers/base.py +109 -0
- jarvis/jarvis_rag/rerankers/cohere.py +67 -0
- jarvis/jarvis_rag/rerankers/edgefn.py +140 -0
- jarvis/jarvis_rag/rerankers/jina.py +79 -0
- jarvis/jarvis_rag/rerankers/local.py +89 -0
- jarvis/jarvis_rag/rerankers/registry.py +293 -0
- jarvis/jarvis_rag/retriever.py +58 -43
- jarvis/jarvis_sec/__init__.py +66 -141
- jarvis/jarvis_sec/agents.py +21 -17
- jarvis/jarvis_sec/analysis.py +80 -33
- jarvis/jarvis_sec/checkers/__init__.py +7 -13
- jarvis/jarvis_sec/checkers/c_checker.py +356 -164
- jarvis/jarvis_sec/checkers/rust_checker.py +47 -29
- jarvis/jarvis_sec/cli.py +43 -21
- jarvis/jarvis_sec/clustering.py +430 -272
- jarvis/jarvis_sec/file_manager.py +99 -55
- jarvis/jarvis_sec/parsers.py +9 -6
- jarvis/jarvis_sec/prompts.py +4 -3
- jarvis/jarvis_sec/report.py +44 -22
- jarvis/jarvis_sec/review.py +180 -107
- jarvis/jarvis_sec/status.py +50 -41
- jarvis/jarvis_sec/types.py +3 -0
- jarvis/jarvis_sec/utils.py +160 -83
- jarvis/jarvis_sec/verification.py +411 -181
- jarvis/jarvis_sec/workflow.py +132 -21
- jarvis/jarvis_smart_shell/main.py +28 -41
- jarvis/jarvis_stats/cli.py +14 -12
- jarvis/jarvis_stats/stats.py +28 -19
- jarvis/jarvis_stats/storage.py +14 -8
- jarvis/jarvis_stats/visualizer.py +12 -7
- jarvis/jarvis_tools/base.py +5 -2
- jarvis/jarvis_tools/clear_memory.py +13 -9
- jarvis/jarvis_tools/cli/main.py +23 -18
- jarvis/jarvis_tools/edit_file.py +572 -873
- jarvis/jarvis_tools/execute_script.py +10 -7
- jarvis/jarvis_tools/file_analyzer.py +7 -8
- jarvis/jarvis_tools/meta_agent.py +287 -0
- jarvis/jarvis_tools/methodology.py +5 -3
- jarvis/jarvis_tools/read_code.py +305 -1438
- jarvis/jarvis_tools/read_symbols.py +50 -17
- jarvis/jarvis_tools/read_webpage.py +19 -18
- jarvis/jarvis_tools/registry.py +435 -156
- jarvis/jarvis_tools/retrieve_memory.py +16 -11
- jarvis/jarvis_tools/save_memory.py +8 -6
- jarvis/jarvis_tools/search_web.py +31 -31
- jarvis/jarvis_tools/sub_agent.py +32 -28
- jarvis/jarvis_tools/sub_code_agent.py +44 -60
- jarvis/jarvis_tools/task_list_manager.py +1811 -0
- jarvis/jarvis_tools/virtual_tty.py +29 -19
- jarvis/jarvis_utils/__init__.py +4 -0
- jarvis/jarvis_utils/builtin_replace_map.py +2 -1
- jarvis/jarvis_utils/clipboard.py +9 -8
- jarvis/jarvis_utils/collections.py +331 -0
- jarvis/jarvis_utils/config.py +699 -194
- jarvis/jarvis_utils/dialogue_recorder.py +294 -0
- jarvis/jarvis_utils/embedding.py +6 -3
- jarvis/jarvis_utils/file_processors.py +7 -1
- jarvis/jarvis_utils/fzf.py +9 -3
- jarvis/jarvis_utils/git_utils.py +71 -42
- jarvis/jarvis_utils/globals.py +116 -32
- jarvis/jarvis_utils/http.py +6 -2
- jarvis/jarvis_utils/input.py +318 -83
- jarvis/jarvis_utils/jsonnet_compat.py +119 -104
- jarvis/jarvis_utils/methodology.py +37 -28
- jarvis/jarvis_utils/output.py +201 -44
- jarvis/jarvis_utils/utils.py +986 -628
- {jarvis_ai_assistant-0.7.8.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/METADATA +49 -33
- jarvis_ai_assistant-1.0.2.dist-info/RECORD +304 -0
- jarvis/jarvis_code_agent/code_analyzer/structured_code.py +0 -556
- jarvis/jarvis_tools/generate_new_tool.py +0 -205
- jarvis/jarvis_tools/lsp_client.py +0 -1552
- jarvis/jarvis_tools/rewrite_file.py +0 -105
- jarvis_ai_assistant-0.7.8.dist-info/RECORD +0 -218
- {jarvis_ai_assistant-0.7.8.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/WHEEL +0 -0
- {jarvis_ai_assistant-0.7.8.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/entry_points.txt +0 -0
- {jarvis_ai_assistant-0.7.8.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/licenses/LICENSE +0 -0
- {jarvis_ai_assistant-0.7.8.dist-info → jarvis_ai_assistant-1.0.2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# 性能优化规则
|
|
2
|
+
|
|
3
|
+
## 你必须遵守的优化原则
|
|
4
|
+
|
|
5
|
+
### 1. 先测量,后优化原则(必须遵守)
|
|
6
|
+
|
|
7
|
+
**执行要求:**
|
|
8
|
+
|
|
9
|
+
- **禁止**:在没有测量的情况下进行优化
|
|
10
|
+
- **必须**:使用性能分析工具找出瓶颈
|
|
11
|
+
- **必须**:基于实际数据决定优化方向
|
|
12
|
+
- **禁止**:过早优化(在性能问题未确认前)
|
|
13
|
+
|
|
14
|
+
**测量方法:**
|
|
15
|
+
|
|
16
|
+
- 使用性能分析工具(如 profiler)
|
|
17
|
+
- 测量关键路径的执行时间
|
|
18
|
+
- 测量资源使用情况(CPU、内存、I/O)
|
|
19
|
+
- 建立性能基准(benchmark)
|
|
20
|
+
|
|
21
|
+
**优化流程:**
|
|
22
|
+
|
|
23
|
+
1. 测量当前性能
|
|
24
|
+
2. 识别性能瓶颈
|
|
25
|
+
3. 优化瓶颈点
|
|
26
|
+
4. 再次测量,确认优化效果
|
|
27
|
+
5. 如果未达到目标,重复步骤 2-4
|
|
28
|
+
|
|
29
|
+
### 2. 算法和数据结构选择原则(必须遵守)
|
|
30
|
+
|
|
31
|
+
**执行要求:**
|
|
32
|
+
|
|
33
|
+
- **必须**:选择合适的数据结构
|
|
34
|
+
- **必须**:理解算法的时间复杂度
|
|
35
|
+
- **必须**:考虑空间换时间的权衡
|
|
36
|
+
- **必须**:根据数据规模选择算法
|
|
37
|
+
|
|
38
|
+
**选择标准:**
|
|
39
|
+
|
|
40
|
+
- 时间复杂度:O(1) > O(log n) > O(n) > O(n log n) > O(n²)
|
|
41
|
+
- 空间复杂度:考虑内存限制
|
|
42
|
+
- 数据特征:有序/无序、重复/唯一、大小等
|
|
43
|
+
- 操作频率:读多写少 vs 写多读少
|
|
44
|
+
|
|
45
|
+
### 3. 资源管理原则(必须遵守)
|
|
46
|
+
|
|
47
|
+
**执行要求:**
|
|
48
|
+
|
|
49
|
+
- **必须**:及时释放资源(文件、网络连接、数据库连接等)
|
|
50
|
+
- **必须**:使用连接池管理资源
|
|
51
|
+
- **必须**:避免内存泄漏
|
|
52
|
+
- **禁止**:持有资源不释放
|
|
53
|
+
|
|
54
|
+
**资源管理:**
|
|
55
|
+
|
|
56
|
+
- 使用 try-finally 或 with 语句确保资源释放
|
|
57
|
+
- 使用连接池复用连接
|
|
58
|
+
- 及时关闭文件、网络连接
|
|
59
|
+
- 清理不再使用的对象引用
|
|
60
|
+
|
|
61
|
+
## 你必须掌握的优化技巧
|
|
62
|
+
|
|
63
|
+
### 1. 缓存策略(必须考虑)
|
|
64
|
+
|
|
65
|
+
**何时使用:**
|
|
66
|
+
|
|
67
|
+
- 计算结果重复使用
|
|
68
|
+
- 数据读取频繁但变化少
|
|
69
|
+
- 网络请求结果可以缓存
|
|
70
|
+
|
|
71
|
+
**实施要求:**
|
|
72
|
+
|
|
73
|
+
- **必须**:使用适当的缓存策略(LRU、FIFO、TTL 等)
|
|
74
|
+
- **必须**:注意缓存失效和更新
|
|
75
|
+
- **必须**:考虑缓存大小限制
|
|
76
|
+
- **禁止**:缓存敏感数据(除非加密)
|
|
77
|
+
|
|
78
|
+
### 2. 批量处理(必须考虑)
|
|
79
|
+
|
|
80
|
+
**何时使用:**
|
|
81
|
+
|
|
82
|
+
- 数据库操作频繁
|
|
83
|
+
- 网络请求可以合并
|
|
84
|
+
- 循环中有重复计算
|
|
85
|
+
|
|
86
|
+
**实施要求:**
|
|
87
|
+
|
|
88
|
+
- **必须**:批量处理数据库操作(批量插入、更新)
|
|
89
|
+
- **必须**:批量发送网络请求
|
|
90
|
+
- **必须**:减少循环中的重复计算
|
|
91
|
+
- **必须**:使用批量 API 而非循环调用
|
|
92
|
+
|
|
93
|
+
### 3. 异步处理(必须考虑)
|
|
94
|
+
|
|
95
|
+
**何时使用:**
|
|
96
|
+
|
|
97
|
+
- I/O 操作(文件、网络、数据库)
|
|
98
|
+
- 独立任务可以并行
|
|
99
|
+
- 耗时任务不影响主流程
|
|
100
|
+
|
|
101
|
+
**实施要求:**
|
|
102
|
+
|
|
103
|
+
- **必须**:使用异步 I/O 处理阻塞操作
|
|
104
|
+
- **必须**:并行处理独立任务
|
|
105
|
+
- **必须**:使用消息队列处理耗时任务
|
|
106
|
+
- **必须**:合理控制并发数量
|
|
107
|
+
|
|
108
|
+
### 4. 数据库优化(必须考虑)
|
|
109
|
+
|
|
110
|
+
**优化要求:**
|
|
111
|
+
|
|
112
|
+
- **必须**:在查询字段上创建索引
|
|
113
|
+
- **必须**:避免 N+1 查询问题
|
|
114
|
+
- **必须**:使用分页而非加载全部数据
|
|
115
|
+
- **必须**:优化查询语句(避免全表扫描)
|
|
116
|
+
|
|
117
|
+
**查询优化:**
|
|
118
|
+
|
|
119
|
+
- 使用索引加速查询
|
|
120
|
+
- 使用 JOIN 而非多次查询
|
|
121
|
+
- 使用 LIMIT 限制返回数量
|
|
122
|
+
- 避免 SELECT *,只查询需要的字段
|
|
123
|
+
|
|
124
|
+
## 性能优化检查清单
|
|
125
|
+
|
|
126
|
+
在完成代码后,你必须确认:
|
|
127
|
+
|
|
128
|
+
**性能测量:**
|
|
129
|
+
|
|
130
|
+
- [ ] 已识别并优化了性能瓶颈
|
|
131
|
+
- [ ] 使用性能分析工具验证了优化效果
|
|
132
|
+
- [ ] 建立了性能基准并持续监控
|
|
133
|
+
|
|
134
|
+
**算法和数据结构:**
|
|
135
|
+
|
|
136
|
+
- [ ] 使用了合适的数据结构和算法
|
|
137
|
+
- [ ] 理解了算法的时间复杂度
|
|
138
|
+
- [ ] 考虑了空间换时间的权衡
|
|
139
|
+
|
|
140
|
+
**资源管理:**
|
|
141
|
+
|
|
142
|
+
- [ ] 资源被正确释放
|
|
143
|
+
- [ ] 使用了连接池(如适用)
|
|
144
|
+
- [ ] 没有内存泄漏
|
|
145
|
+
|
|
146
|
+
**优化技巧应用:**
|
|
147
|
+
|
|
148
|
+
- [ ] 避免了不必要的计算
|
|
149
|
+
- [ ] 使用了适当的缓存策略
|
|
150
|
+
- [ ] 实施了批量处理(如适用)
|
|
151
|
+
- [ ] 使用了异步处理(如适用)
|
|
152
|
+
|
|
153
|
+
**数据库优化:**
|
|
154
|
+
|
|
155
|
+
- [ ] 数据库查询被优化
|
|
156
|
+
- [ ] 使用了索引
|
|
157
|
+
- [ ] 避免了 N+1 查询
|
|
158
|
+
- [ ] 考虑了并发性能
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# 重构规则
|
|
2
|
+
|
|
3
|
+
## 你必须遵守的重构原则
|
|
4
|
+
|
|
5
|
+
### 1. 小步快跑原则(必须遵守)
|
|
6
|
+
|
|
7
|
+
**执行要求:**
|
|
8
|
+
|
|
9
|
+
- **必须**:每次重构只做小的改动
|
|
10
|
+
- **必须**:每次改动后立即运行测试
|
|
11
|
+
- **必须**:确认测试通过后再进行下一步重构
|
|
12
|
+
- **必须**:使用版本控制,每次小改动都提交,便于回滚
|
|
13
|
+
|
|
14
|
+
**禁止行为:**
|
|
15
|
+
|
|
16
|
+
- **禁止**:一次性进行大规模重构
|
|
17
|
+
- **禁止**:在测试未通过的情况下继续重构
|
|
18
|
+
|
|
19
|
+
### 2. 保持功能不变原则(必须遵守)
|
|
20
|
+
|
|
21
|
+
**执行要求:**
|
|
22
|
+
|
|
23
|
+
- **必须**:重构不应该改变代码的外部行为
|
|
24
|
+
- **必须**:重构前后,所有测试必须都能通过
|
|
25
|
+
- **必须**:如果有功能变更需求,必须单独提交,不要与重构混在一起
|
|
26
|
+
|
|
27
|
+
**验证方法:**
|
|
28
|
+
|
|
29
|
+
- 重构前运行所有测试,记录测试结果
|
|
30
|
+
- 重构后运行所有测试,确保结果一致
|
|
31
|
+
- 如果测试失败,立即回滚或修复
|
|
32
|
+
|
|
33
|
+
### 3. 识别代码异味(必须识别并处理)
|
|
34
|
+
|
|
35
|
+
**你必须识别并处理的代码异味:**
|
|
36
|
+
|
|
37
|
+
- [ ] 重复代码(违反 DRY 原则)
|
|
38
|
+
- [ ] 过长的方法或类(超过合理长度)
|
|
39
|
+
- [ ] 过深的嵌套(超过 3-4 层)
|
|
40
|
+
- [ ] 魔法数字和字符串(未命名的常量)
|
|
41
|
+
- [ ] 过度的参数列表(超过 3-4 个参数)
|
|
42
|
+
- [ ] 过长的方法链
|
|
43
|
+
- [ ] 过大的类(职责过多)
|
|
44
|
+
|
|
45
|
+
## 你必须掌握的重构技巧
|
|
46
|
+
|
|
47
|
+
### 1. 提取方法(Extract Method)
|
|
48
|
+
|
|
49
|
+
**何时使用:** 方法过长或包含重复逻辑
|
|
50
|
+
**操作步骤:**
|
|
51
|
+
|
|
52
|
+
1. 识别可以独立的方法块
|
|
53
|
+
2. 创建新方法,移动代码
|
|
54
|
+
3. 用方法调用替换原代码
|
|
55
|
+
4. 运行测试确认
|
|
56
|
+
|
|
57
|
+
### 2. 提取变量(Extract Variable)
|
|
58
|
+
|
|
59
|
+
**何时使用:** 复杂表达式难以理解
|
|
60
|
+
**操作步骤:**
|
|
61
|
+
|
|
62
|
+
1. 识别复杂表达式
|
|
63
|
+
2. 创建有意义的变量名
|
|
64
|
+
3. 用变量替换表达式
|
|
65
|
+
4. 运行测试确认
|
|
66
|
+
|
|
67
|
+
### 3. 重命名(Rename)
|
|
68
|
+
|
|
69
|
+
**何时使用:** 名称不清晰或误导
|
|
70
|
+
**操作步骤:**
|
|
71
|
+
|
|
72
|
+
1. 确定更清晰的名称
|
|
73
|
+
2. 使用 IDE 的重构工具进行重命名
|
|
74
|
+
3. 运行测试确认
|
|
75
|
+
|
|
76
|
+
### 4. 消除重复(Remove Duplication)
|
|
77
|
+
|
|
78
|
+
**何时使用:** 发现重复代码
|
|
79
|
+
**操作步骤:**
|
|
80
|
+
|
|
81
|
+
1. 识别重复模式
|
|
82
|
+
2. 提取公共逻辑到函数或类
|
|
83
|
+
3. 替换所有重复代码
|
|
84
|
+
4. 运行测试确认
|
|
85
|
+
|
|
86
|
+
### 5. 简化条件(Simplify Conditional)
|
|
87
|
+
|
|
88
|
+
**何时使用:** 条件表达式复杂难懂
|
|
89
|
+
**操作步骤:**
|
|
90
|
+
|
|
91
|
+
1. 提取条件到有意义的变量
|
|
92
|
+
2. 使用早期返回减少嵌套
|
|
93
|
+
3. 使用更清晰的条件表达式
|
|
94
|
+
4. 运行测试确认
|
|
95
|
+
|
|
96
|
+
### 6. 移动代码(Move Code)
|
|
97
|
+
|
|
98
|
+
**何时使用:** 代码位置不合适
|
|
99
|
+
**操作步骤:**
|
|
100
|
+
|
|
101
|
+
1. 确定代码应该存在的位置
|
|
102
|
+
2. 移动代码到合适位置
|
|
103
|
+
3. 更新引用
|
|
104
|
+
4. 运行测试确认
|
|
105
|
+
|
|
106
|
+
## 重构时机判断
|
|
107
|
+
|
|
108
|
+
### 你必须进行重构的情况
|
|
109
|
+
|
|
110
|
+
1. **添加新功能前**:
|
|
111
|
+
- 如果现有代码结构难以扩展
|
|
112
|
+
- **必须**:先重构现有代码,使其更容易扩展
|
|
113
|
+
- **然后**:再添加新功能
|
|
114
|
+
|
|
115
|
+
2. **修复 Bug 时**:
|
|
116
|
+
- 如果发现代码结构有问题导致 Bug
|
|
117
|
+
- **必须**:先重构代码结构
|
|
118
|
+
- **然后**:再修复 Bug
|
|
119
|
+
|
|
120
|
+
3. **代码审查时**:
|
|
121
|
+
- 如果发现可以改进的地方
|
|
122
|
+
- **必须**:建议重构
|
|
123
|
+
- **必须**:提供具体的重构建议
|
|
124
|
+
|
|
125
|
+
4. **定期清理**:
|
|
126
|
+
- **必须**:定期进行技术债务清理
|
|
127
|
+
- **必须**:识别并重构代码异味
|
|
128
|
+
|
|
129
|
+
## 重构执行检查清单
|
|
130
|
+
|
|
131
|
+
在完成重构后,你必须确认:
|
|
132
|
+
|
|
133
|
+
- [ ] 所有测试都能通过(重构前后测试结果一致)
|
|
134
|
+
- [ ] 代码更清晰、更易读
|
|
135
|
+
- [ ] 没有引入新的 bug
|
|
136
|
+
- [ ] 性能没有明显下降(如有下降,必须说明原因)
|
|
137
|
+
- [ ] 代码更易于扩展和维护
|
|
138
|
+
- [ ] 代码异味已消除或减少
|
|
139
|
+
- [ ] 重构已提交到版本控制
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# 安全编码规则
|
|
2
|
+
|
|
3
|
+
## 你必须遵守的核心安全原则
|
|
4
|
+
|
|
5
|
+
### 1. 输入验证原则(必须严格执行)
|
|
6
|
+
|
|
7
|
+
**执行要求:**
|
|
8
|
+
|
|
9
|
+
- **必须**:永远不要信任用户输入
|
|
10
|
+
- **必须**:验证所有输入数据的格式和范围
|
|
11
|
+
- **必须**:使用白名单而非黑名单进行验证
|
|
12
|
+
- **禁止**:直接使用未验证的用户输入
|
|
13
|
+
|
|
14
|
+
**验证要求:**
|
|
15
|
+
|
|
16
|
+
- 验证数据类型(字符串、数字、日期等)
|
|
17
|
+
- 验证数据格式(邮箱、URL、电话号码等)
|
|
18
|
+
- 验证数据范围(长度、数值范围等)
|
|
19
|
+
- 验证数据内容(不允许特殊字符、SQL 注入字符等)
|
|
20
|
+
|
|
21
|
+
### 2. 最小权限原则(必须遵守)
|
|
22
|
+
|
|
23
|
+
**执行要求:**
|
|
24
|
+
|
|
25
|
+
- **必须**:使用最小必要的权限
|
|
26
|
+
- **必须**:避免使用管理员权限运行应用
|
|
27
|
+
- **必须**:限制文件系统访问范围
|
|
28
|
+
- **禁止**:使用过高的权限运行应用
|
|
29
|
+
|
|
30
|
+
**权限管理:**
|
|
31
|
+
|
|
32
|
+
- 文件系统:只授予必要的目录访问权限
|
|
33
|
+
- 网络访问:只允许访问必要的服务
|
|
34
|
+
- 数据库:使用最小权限的数据库用户
|
|
35
|
+
- 系统资源:限制 CPU、内存等资源使用
|
|
36
|
+
|
|
37
|
+
### 3. 敏感数据保护原则(必须遵守)
|
|
38
|
+
|
|
39
|
+
**执行要求:**
|
|
40
|
+
|
|
41
|
+
- **禁止**:在代码中硬编码密码、密钥、API Key
|
|
42
|
+
- **必须**:使用环境变量或密钥管理服务存储敏感信息
|
|
43
|
+
- **必须**:加密存储敏感数据
|
|
44
|
+
- **必须**:使用 HTTPS 传输敏感数据
|
|
45
|
+
|
|
46
|
+
**敏感数据处理:**
|
|
47
|
+
|
|
48
|
+
- 密码:必须加密存储(使用哈希算法,如 bcrypt)
|
|
49
|
+
- API 密钥:存储在环境变量或密钥管理服务中
|
|
50
|
+
- 令牌:使用安全的令牌生成和验证机制
|
|
51
|
+
- 个人信息:遵守数据保护法规(如 GDPR)
|
|
52
|
+
|
|
53
|
+
## 你必须防范的常见安全问题
|
|
54
|
+
|
|
55
|
+
### 1. SQL 注入(必须防范)
|
|
56
|
+
|
|
57
|
+
**禁止行为:**
|
|
58
|
+
|
|
59
|
+
- **禁止**:拼接 SQL 语句
|
|
60
|
+
- **禁止**:直接将用户输入插入 SQL 语句
|
|
61
|
+
|
|
62
|
+
**必须行为:**
|
|
63
|
+
|
|
64
|
+
- **必须**:使用参数化查询
|
|
65
|
+
- **必须**:使用 ORM 框架的查询方法
|
|
66
|
+
- **必须**:验证和转义所有输入
|
|
67
|
+
|
|
68
|
+
**示例:**
|
|
69
|
+
|
|
70
|
+
```python
|
|
71
|
+
# ❌ 错误:SQL 注入风险
|
|
72
|
+
query = f"SELECT * FROM users WHERE id = {user_id}"
|
|
73
|
+
|
|
74
|
+
# ✅ 正确:参数化查询
|
|
75
|
+
query = "SELECT * FROM users WHERE id = ?"
|
|
76
|
+
cursor.execute(query, (user_id,))
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 2. XSS (跨站脚本攻击)(必须防范)
|
|
80
|
+
|
|
81
|
+
**必须行为:**
|
|
82
|
+
|
|
83
|
+
- **必须**:对用户输入进行转义
|
|
84
|
+
- **必须**:使用内容安全策略 (CSP)
|
|
85
|
+
- **必须**:验证和清理 HTML 内容
|
|
86
|
+
|
|
87
|
+
**防护措施:**
|
|
88
|
+
|
|
89
|
+
- 输出转义:对所有输出到 HTML 的内容进行转义
|
|
90
|
+
- CSP 头:设置内容安全策略,限制脚本执行
|
|
91
|
+
- 输入验证:拒绝包含脚本标签的输入
|
|
92
|
+
|
|
93
|
+
### 3. CSRF (跨站请求伪造)(必须防范)
|
|
94
|
+
|
|
95
|
+
**必须行为:**
|
|
96
|
+
|
|
97
|
+
- **必须**:使用 CSRF token
|
|
98
|
+
- **必须**:验证请求来源
|
|
99
|
+
- **必须**:对敏感操作使用 POST 请求
|
|
100
|
+
|
|
101
|
+
**防护措施:**
|
|
102
|
+
|
|
103
|
+
- 生成并验证 CSRF token
|
|
104
|
+
- 检查 Referer 头
|
|
105
|
+
- 使用 SameSite Cookie 属性
|
|
106
|
+
|
|
107
|
+
### 4. 敏感信息泄露(必须防范)
|
|
108
|
+
|
|
109
|
+
**禁止行为:**
|
|
110
|
+
|
|
111
|
+
- **禁止**:在日志中记录敏感信息(密码、密钥、令牌)
|
|
112
|
+
- **禁止**:在错误消息中暴露系统细节
|
|
113
|
+
- **禁止**:在代码注释中留下敏感信息
|
|
114
|
+
|
|
115
|
+
**必须行为:**
|
|
116
|
+
|
|
117
|
+
- **必须**:在记录日志前过滤敏感信息
|
|
118
|
+
- **必须**:使用通用的错误消息,不暴露内部细节
|
|
119
|
+
- **必须**:定期检查代码和配置文件中的敏感信息
|
|
120
|
+
|
|
121
|
+
## 安全编码检查清单
|
|
122
|
+
|
|
123
|
+
在提交代码前,你必须确认:
|
|
124
|
+
|
|
125
|
+
**输入验证:**
|
|
126
|
+
|
|
127
|
+
- [ ] 所有用户输入都经过验证
|
|
128
|
+
- [ ] 使用白名单而非黑名单
|
|
129
|
+
- [ ] 验证了数据类型、格式和范围
|
|
130
|
+
|
|
131
|
+
**敏感数据处理:**
|
|
132
|
+
|
|
133
|
+
- [ ] 没有硬编码的密码或密钥
|
|
134
|
+
- [ ] 敏感信息存储在环境变量或密钥管理服务中
|
|
135
|
+
- [ ] 敏感数据被加密存储
|
|
136
|
+
- [ ] 使用 HTTPS 传输敏感数据
|
|
137
|
+
|
|
138
|
+
**数据库安全:**
|
|
139
|
+
|
|
140
|
+
- [ ] 使用参数化查询(防止 SQL 注入)
|
|
141
|
+
- [ ] 使用最小权限的数据库用户
|
|
142
|
+
- [ ] 数据库连接使用加密
|
|
143
|
+
|
|
144
|
+
**输出安全:**
|
|
145
|
+
|
|
146
|
+
- [ ] 所有输出都经过转义(防止 XSS)
|
|
147
|
+
- [ ] 错误消息不泄露系统信息
|
|
148
|
+
- [ ] 日志中不包含敏感信息
|
|
149
|
+
|
|
150
|
+
**访问控制:**
|
|
151
|
+
|
|
152
|
+
- [ ] 实施了适当的访问控制
|
|
153
|
+
- [ ] 使用 CSRF token 保护表单
|
|
154
|
+
- [ ] 验证了用户权限
|
|
155
|
+
|
|
156
|
+
**依赖安全:**
|
|
157
|
+
|
|
158
|
+
- [ ] 定期更新依赖库
|
|
159
|
+
- [ ] 检查依赖库的安全漏洞
|
|
160
|
+
- [ ] 使用安全的随机数生成器
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# 测试驱动开发 (TDD) 规则
|
|
2
|
+
|
|
3
|
+
## 你必须遵循的工作流程
|
|
4
|
+
|
|
5
|
+
### 红-绿-重构循环(严格执行)
|
|
6
|
+
|
|
7
|
+
1. **🔴 红阶段(编写失败的测试)**:
|
|
8
|
+
- 在实现任何功能代码之前,必须先编写测试用例
|
|
9
|
+
- 测试必须描述期望的行为,而不是实现细节
|
|
10
|
+
- 运行测试,确认测试失败(红色)
|
|
11
|
+
|
|
12
|
+
2. **🟢 绿阶段(让测试通过)**:
|
|
13
|
+
- 编写最简单的代码让测试通过
|
|
14
|
+
- 不要过度设计,只实现让测试通过的最小代码
|
|
15
|
+
- 运行测试,确认测试通过(绿色)
|
|
16
|
+
|
|
17
|
+
3. **🔵 重构阶段(优化代码)**:
|
|
18
|
+
- 在测试通过的基础上,优化代码结构
|
|
19
|
+
- 重构后必须再次运行测试,确保所有测试仍然通过
|
|
20
|
+
- 如果重构导致测试失败,立即回滚或修复
|
|
21
|
+
|
|
22
|
+
## 你必须遵守的原则
|
|
23
|
+
|
|
24
|
+
### 测试优先原则
|
|
25
|
+
|
|
26
|
+
- **禁止**:在编写测试之前实现功能代码
|
|
27
|
+
- **必须**:为每个新功能编写测试用例
|
|
28
|
+
- **必须**:测试应该清晰、可读、可维护
|
|
29
|
+
- **必须**:使用描述性的测试名称,清楚表达测试意图
|
|
30
|
+
|
|
31
|
+
### 测试覆盖要求
|
|
32
|
+
|
|
33
|
+
- **必须**:为所有新功能编写对应的测试
|
|
34
|
+
- **必须**:测试覆盖以下三种情况:
|
|
35
|
+
- 正常情况(happy path)
|
|
36
|
+
- 边界情况(edge cases)
|
|
37
|
+
- 异常情况(error cases)
|
|
38
|
+
- **必须**:确保测试独立运行,不依赖其他测试
|
|
39
|
+
- **必须**:确保测试可重复执行,结果一致
|
|
40
|
+
|
|
41
|
+
## 实践指导
|
|
42
|
+
|
|
43
|
+
### 编写测试时的思考方式
|
|
44
|
+
|
|
45
|
+
- 问自己:"这个功能应该做什么?"而不是"这个功能如何实现?"
|
|
46
|
+
- 测试应该验证行为,而不是实现细节
|
|
47
|
+
- 一个测试只验证一个行为或场景
|
|
48
|
+
|
|
49
|
+
### 发现 Bug 时的处理流程
|
|
50
|
+
|
|
51
|
+
1. 先编写测试用例重现该 Bug
|
|
52
|
+
2. 运行测试,确认测试失败(重现问题)
|
|
53
|
+
3. 修复代码
|
|
54
|
+
4. 运行测试,确认测试通过(问题已解决)
|
|
55
|
+
|
|
56
|
+
## 代码示例
|
|
57
|
+
|
|
58
|
+
```python
|
|
59
|
+
# ✅ 正确做法:先写测试
|
|
60
|
+
def test_calculate_total():
|
|
61
|
+
assert calculate_total([1, 2, 3]) == 6
|
|
62
|
+
assert calculate_total([]) == 0
|
|
63
|
+
assert calculate_total([-1, 1]) == 0
|
|
64
|
+
|
|
65
|
+
# 然后实现功能
|
|
66
|
+
def calculate_total(numbers):
|
|
67
|
+
return sum(numbers)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 执行检查清单
|
|
71
|
+
|
|
72
|
+
在提交代码前,你必须确认:
|
|
73
|
+
|
|
74
|
+
- [ ] 所有新功能都有对应的测试用例
|
|
75
|
+
- [ ] 测试覆盖了正常、边界和异常情况
|
|
76
|
+
- [ ] 所有测试都能独立运行
|
|
77
|
+
- [ ] 所有测试都能通过
|
|
78
|
+
- [ ] 测试名称清晰描述测试意图
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# C/C++ 测试规则
|
|
2
|
+
|
|
3
|
+
## ⚠️ 你必须遵守的核心要求
|
|
4
|
+
|
|
5
|
+
**编写完成务必执行测试,直到修复完成为止!**
|
|
6
|
+
|
|
7
|
+
### 执行要求
|
|
8
|
+
|
|
9
|
+
- **必须**:每次代码修改后,立即运行测试
|
|
10
|
+
- **必须**:如果测试失败,修复代码直到所有测试通过
|
|
11
|
+
- **禁止**:提交未通过测试的代码
|
|
12
|
+
- **禁止**:在测试未通过的情况下继续开发
|
|
13
|
+
|
|
14
|
+
### 工作流程
|
|
15
|
+
|
|
16
|
+
1. 编写或修改代码
|
|
17
|
+
2. **立即**运行测试
|
|
18
|
+
3. 如果测试失败,修复代码
|
|
19
|
+
4. 重复步骤 2-3,直到所有测试通过
|
|
20
|
+
5. 确认所有测试通过后,才能提交代码
|
|
21
|
+
|
|
22
|
+
## 你必须使用的测试框架
|
|
23
|
+
|
|
24
|
+
### Google Test (gtest)(推荐使用)
|
|
25
|
+
|
|
26
|
+
**安装方式:**
|
|
27
|
+
|
|
28
|
+
- 使用包管理器安装(如 `apt-get install libgtest-dev`)
|
|
29
|
+
- 或从源码编译安装
|
|
30
|
+
|
|
31
|
+
**CMake 构建和运行:**
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
mkdir build && cd build
|
|
35
|
+
cmake ..
|
|
36
|
+
make
|
|
37
|
+
./test_runner # 运行所有测试
|
|
38
|
+
./test_runner --gtest_filter=TestClass.* # 运行特定测试
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
**直接编译运行:**
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
g++ -std=c++17 test.cpp -lgtest -lgtest_main -pthread
|
|
45
|
+
./a.out
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Catch2
|
|
49
|
+
|
|
50
|
+
**安装方式:**
|
|
51
|
+
|
|
52
|
+
- 下载单头文件版本
|
|
53
|
+
- 或使用包管理器安装
|
|
54
|
+
|
|
55
|
+
**编译运行:**
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
g++ -std=c++17 test.cpp -o test
|
|
59
|
+
./test
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## 你必须编写的测试示例
|
|
63
|
+
|
|
64
|
+
### Google Test 测试格式
|
|
65
|
+
|
|
66
|
+
```cpp
|
|
67
|
+
// test/calculator_test.cpp
|
|
68
|
+
#include <gtest/gtest.h>
|
|
69
|
+
#include "../src/calculator.h"
|
|
70
|
+
|
|
71
|
+
TEST(CalculatorTest, Add) {
|
|
72
|
+
Calculator calc;
|
|
73
|
+
EXPECT_EQ(5, calc.add(2, 3));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
TEST(CalculatorTest, DivideByZero) {
|
|
77
|
+
Calculator calc;
|
|
78
|
+
EXPECT_THROW(calc.divide(10, 0), std::invalid_argument);
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Catch2 测试格式
|
|
83
|
+
|
|
84
|
+
```cpp
|
|
85
|
+
// test/calculator_test.cpp
|
|
86
|
+
#include <catch2/catch.hpp>
|
|
87
|
+
#include "../src/calculator.h"
|
|
88
|
+
|
|
89
|
+
TEST_CASE("Calculator add", "[calculator]") {
|
|
90
|
+
Calculator calc;
|
|
91
|
+
REQUIRE(calc.add(2, 3) == 5);
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## 断言宏使用规范
|
|
96
|
+
|
|
97
|
+
### Google Test 断言
|
|
98
|
+
|
|
99
|
+
- **必须**:使用 `EXPECT_*` 进行非致命断言(测试继续执行)
|
|
100
|
+
- **必须**:使用 `ASSERT_*` 进行致命断言(测试立即终止)
|
|
101
|
+
- **常用断言**:`EXPECT_EQ`, `ASSERT_EQ`, `EXPECT_THROW`, `ASSERT_THROW`
|
|
102
|
+
|
|
103
|
+
### Catch2 断言
|
|
104
|
+
|
|
105
|
+
- **必须**:使用 `REQUIRE` 进行致命断言
|
|
106
|
+
- **必须**:使用 `CHECK` 进行非致命断言
|
|
107
|
+
|
|
108
|
+
## 测试执行检查清单
|
|
109
|
+
|
|
110
|
+
在提交代码前,你必须确认:
|
|
111
|
+
|
|
112
|
+
- [ ] **编写完成后立即运行了测试**
|
|
113
|
+
- [ ] **所有测试都通过了**
|
|
114
|
+
- [ ] **如果测试失败,已修复代码直到通过**
|
|
115
|
+
- [ ] 测试覆盖了正常情况
|
|
116
|
+
- [ ] 测试覆盖了边界情况
|
|
117
|
+
- [ ] 测试覆盖了异常情况
|
|
118
|
+
- [ ] 使用了适当的断言宏(EXPECT_EQ, ASSERT_EQ 等)
|