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,98 @@
|
|
|
1
|
+
# Go 测试规则
|
|
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
|
+
### 标准库 testing(无需安装)
|
|
25
|
+
|
|
26
|
+
**运行命令:**
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
go test # 运行当前包的所有测试
|
|
30
|
+
go test ./... # 运行所有包的测试
|
|
31
|
+
go test -v # 详细输出
|
|
32
|
+
go test -run TestFunc # 运行特定测试函数
|
|
33
|
+
go test -cover # 显示覆盖率
|
|
34
|
+
go test -coverprofile=coverage.out # 生成覆盖率文件
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 你必须编写的测试示例
|
|
38
|
+
|
|
39
|
+
```go
|
|
40
|
+
// calculator_test.go
|
|
41
|
+
package calculator
|
|
42
|
+
|
|
43
|
+
import "testing"
|
|
44
|
+
|
|
45
|
+
func TestAdd(t *testing.T) {
|
|
46
|
+
result := Add(2, 3)
|
|
47
|
+
if result != 5 {
|
|
48
|
+
t.Errorf("Add(2, 3) = %d; want 5", result)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
func TestDivideByZero(t *testing.T) {
|
|
53
|
+
_, err := Divide(10, 0)
|
|
54
|
+
if err == nil {
|
|
55
|
+
t.Error("Divide(10, 0) should return error")
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// 表驱动测试(推荐使用)
|
|
60
|
+
func TestAddTable(t *testing.T) {
|
|
61
|
+
tests := []struct {
|
|
62
|
+
a, b, want int
|
|
63
|
+
}{
|
|
64
|
+
{2, 3, 5},
|
|
65
|
+
{0, 0, 0},
|
|
66
|
+
{-1, 1, 0},
|
|
67
|
+
}
|
|
68
|
+
for _, tt := range tests {
|
|
69
|
+
if got := Add(tt.a, tt.b); got != tt.want {
|
|
70
|
+
t.Errorf("Add(%d, %d) = %d; want %d", tt.a, tt.b, got, tt.want)
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## 测试文件规范
|
|
77
|
+
|
|
78
|
+
### 文件命名
|
|
79
|
+
|
|
80
|
+
- **必须**:测试文件以 `_test.go` 结尾
|
|
81
|
+
- **必须**:测试文件与被测试文件在同一包中
|
|
82
|
+
|
|
83
|
+
### 函数命名
|
|
84
|
+
|
|
85
|
+
- **必须**:测试函数以 `Test` 开头
|
|
86
|
+
- **必须**:测试函数接受 `*testing.T` 参数
|
|
87
|
+
|
|
88
|
+
## 测试执行检查清单
|
|
89
|
+
|
|
90
|
+
在提交代码前,你必须确认:
|
|
91
|
+
|
|
92
|
+
- [ ] **编写完成后立即运行了测试**
|
|
93
|
+
- [ ] **所有测试都通过了**
|
|
94
|
+
- [ ] **如果测试失败,已修复代码直到通过**
|
|
95
|
+
- [ ] 测试文件以 `_test.go` 结尾
|
|
96
|
+
- [ ] 测试函数以 `Test` 开头
|
|
97
|
+
- [ ] 使用表驱动测试覆盖多个场景(如适用)
|
|
98
|
+
- [ ] 测试覆盖了正常、边界和异常情况
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Java 测试规则
|
|
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
|
+
### JUnit 5(推荐使用)
|
|
25
|
+
|
|
26
|
+
**Maven 运行命令:**
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
mvn test # 运行所有测试
|
|
30
|
+
mvn test -Dtest=TestClass # 运行特定测试类
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Gradle 运行命令:**
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
gradle test # 运行所有测试
|
|
37
|
+
gradle test --tests TestClass # 运行特定测试类
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### JUnit 4
|
|
41
|
+
|
|
42
|
+
**运行命令:**
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
mvn test # 运行所有测试
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 你必须编写的测试示例
|
|
49
|
+
|
|
50
|
+
### JUnit 5 测试格式
|
|
51
|
+
|
|
52
|
+
```java
|
|
53
|
+
// src/test/java/CalculatorTest.java
|
|
54
|
+
import org.junit.jupiter.api.Test;
|
|
55
|
+
import static org.junit.jupiter.api.Assertions.*;
|
|
56
|
+
|
|
57
|
+
class CalculatorTest {
|
|
58
|
+
@Test
|
|
59
|
+
void testAdd() {
|
|
60
|
+
Calculator calc = new Calculator();
|
|
61
|
+
assertEquals(5, calc.add(2, 3));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@Test
|
|
65
|
+
void testDivideByZero() {
|
|
66
|
+
Calculator calc = new Calculator();
|
|
67
|
+
assertThrows(ArithmeticException.class, () -> {
|
|
68
|
+
calc.divide(10, 0);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### JUnit 4 测试格式
|
|
75
|
+
|
|
76
|
+
```java
|
|
77
|
+
import org.junit.Test;
|
|
78
|
+
import static org.junit.Assert.*;
|
|
79
|
+
|
|
80
|
+
public class CalculatorTest {
|
|
81
|
+
@Test
|
|
82
|
+
public void testAdd() {
|
|
83
|
+
Calculator calc = new Calculator();
|
|
84
|
+
assertEquals(5, calc.add(2, 3));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## 测试执行检查清单
|
|
90
|
+
|
|
91
|
+
在提交代码前,你必须确认:
|
|
92
|
+
|
|
93
|
+
- [ ] **编写完成后立即运行了测试**
|
|
94
|
+
- [ ] **所有测试都通过了**
|
|
95
|
+
- [ ] **如果测试失败,已修复代码直到通过**
|
|
96
|
+
- [ ] 测试覆盖了正常情况
|
|
97
|
+
- [ ] 测试覆盖了边界情况
|
|
98
|
+
- [ ] 测试覆盖了异常情况
|
|
99
|
+
- [ ] 使用 @BeforeEach/@AfterEach 进行设置和清理(如需要)
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# JavaScript/TypeScript 测试规则
|
|
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
|
+
### Jest(推荐使用)
|
|
25
|
+
|
|
26
|
+
**安装命令:**
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install --save-dev jest
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**运行命令:**
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm test # 运行所有测试
|
|
36
|
+
npm test -- --watch # 监视模式
|
|
37
|
+
npm test -- file.test.js # 运行特定文件
|
|
38
|
+
npm test -- --coverage # 显示覆盖率
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Mocha + Chai
|
|
42
|
+
|
|
43
|
+
**安装命令:**
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install --save-dev mocha chai
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**运行命令:**
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm test # 运行所有测试
|
|
53
|
+
npx mocha test/**/*.js # 运行特定目录
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Vitest(Vite 项目推荐)
|
|
57
|
+
|
|
58
|
+
**安装命令:**
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
npm install --save-dev vitest
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**运行命令:**
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npm test # 运行所有测试
|
|
68
|
+
npm test -- --watch # 监视模式
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## 你必须编写的测试示例
|
|
72
|
+
|
|
73
|
+
### Jest 测试格式
|
|
74
|
+
|
|
75
|
+
```javascript
|
|
76
|
+
// test/calculator.test.js
|
|
77
|
+
const { add, divide } = require('../src/calculator');
|
|
78
|
+
|
|
79
|
+
describe('Calculator', () => {
|
|
80
|
+
test('adds two numbers', () => {
|
|
81
|
+
expect(add(2, 3)).toBe(5);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test('throws error on divide by zero', () => {
|
|
85
|
+
expect(() => divide(10, 0)).toThrow('Division by zero');
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### TypeScript + Jest 测试格式
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
// test/calculator.test.ts
|
|
94
|
+
import { add, divide } from '../src/calculator';
|
|
95
|
+
|
|
96
|
+
describe('Calculator', () => {
|
|
97
|
+
it('adds two numbers', () => {
|
|
98
|
+
expect(add(2, 3)).toBe(5);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
## 测试执行检查清单
|
|
104
|
+
|
|
105
|
+
在提交代码前,你必须确认:
|
|
106
|
+
|
|
107
|
+
- [ ] **编写完成后立即运行了测试**
|
|
108
|
+
- [ ] **所有测试都通过了**
|
|
109
|
+
- [ ] **如果测试失败,已修复代码直到通过**
|
|
110
|
+
- [ ] 测试覆盖了正常情况
|
|
111
|
+
- [ ] 测试覆盖了边界情况
|
|
112
|
+
- [ ] 测试覆盖了异常情况
|
|
113
|
+
- [ ] 使用了描述性的测试名称
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# PHP 测试规则
|
|
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
|
+
### PHPUnit(推荐使用)
|
|
25
|
+
|
|
26
|
+
**安装命令:**
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
composer require --dev phpunit/phpunit
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**运行命令:**
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
phpunit # 运行所有测试
|
|
36
|
+
phpunit tests/TestClass.php # 运行特定文件
|
|
37
|
+
phpunit --filter testMethod # 运行特定测试方法
|
|
38
|
+
phpunit --coverage-html coverage/ # 生成覆盖率报告
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Pest
|
|
42
|
+
|
|
43
|
+
**安装命令:**
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
composer require --dev pestphp/pest
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**运行命令:**
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
./vendor/bin/pest # 运行所有测试
|
|
53
|
+
./vendor/bin/pest --filter test_name # 运行特定测试
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 你必须编写的测试示例
|
|
57
|
+
|
|
58
|
+
### PHPUnit 测试格式
|
|
59
|
+
|
|
60
|
+
```php
|
|
61
|
+
// tests/CalculatorTest.php
|
|
62
|
+
use PHPUnit\Framework\TestCase;
|
|
63
|
+
|
|
64
|
+
class CalculatorTest extends TestCase
|
|
65
|
+
{
|
|
66
|
+
public function testAdd()
|
|
67
|
+
{
|
|
68
|
+
$calc = new Calculator();
|
|
69
|
+
$this->assertEquals(5, $calc->add(2, 3));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
public function testDivideByZero()
|
|
73
|
+
{
|
|
74
|
+
$calc = new Calculator();
|
|
75
|
+
$this->expectException(DivisionByZeroError::class);
|
|
76
|
+
$calc->divide(10, 0);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Pest 测试格式
|
|
82
|
+
|
|
83
|
+
```php
|
|
84
|
+
// tests/CalculatorTest.php
|
|
85
|
+
use Tests\TestCase;
|
|
86
|
+
|
|
87
|
+
test('adds two numbers', function () {
|
|
88
|
+
$calc = new Calculator();
|
|
89
|
+
expect($calc->add(2, 3))->toBe(5);
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## 测试类和方法规范
|
|
94
|
+
|
|
95
|
+
### PHPUnit 规范
|
|
96
|
+
|
|
97
|
+
- **必须**:测试类继承 `TestCase`
|
|
98
|
+
- **必须**:测试方法以 `test` 开头或使用 `@test` 注解
|
|
99
|
+
- **必须**:测试方法必须是 `public`
|
|
100
|
+
|
|
101
|
+
### Pest 规范
|
|
102
|
+
|
|
103
|
+
- **必须**:使用 `test()` 函数定义测试
|
|
104
|
+
- **必须**:使用描述性的测试名称
|
|
105
|
+
|
|
106
|
+
## 测试执行检查清单
|
|
107
|
+
|
|
108
|
+
在提交代码前,你必须确认:
|
|
109
|
+
|
|
110
|
+
- [ ] **编写完成后立即运行了测试**
|
|
111
|
+
- [ ] **所有测试都通过了**
|
|
112
|
+
- [ ] **如果测试失败,已修复代码直到通过**
|
|
113
|
+
- [ ] 测试类继承 TestCase(PHPUnit)
|
|
114
|
+
- [ ] 测试方法以 `test` 开头或使用 `@test` 注解
|
|
115
|
+
- [ ] 测试覆盖了正常情况
|
|
116
|
+
- [ ] 测试覆盖了边界情况
|
|
117
|
+
- [ ] 测试覆盖了异常情况
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# Python 测试规则
|
|
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
|
+
### pytest(推荐使用)
|
|
25
|
+
|
|
26
|
+
**安装命令:**
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
pip install pytest pytest-cov
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**运行命令:**
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pytest # 运行所有测试
|
|
36
|
+
pytest tests/test_file.py # 运行特定文件
|
|
37
|
+
pytest -v # 详细输出
|
|
38
|
+
pytest -x # 失败时停止
|
|
39
|
+
pytest --cov=src # 显示覆盖率
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### unittest(标准库,无需安装)
|
|
43
|
+
|
|
44
|
+
**运行命令:**
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
python -m unittest discover # 运行所有测试
|
|
48
|
+
python -m unittest -v # 详细输出
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 你必须编写的测试示例
|
|
52
|
+
|
|
53
|
+
### pytest 测试格式
|
|
54
|
+
|
|
55
|
+
```python
|
|
56
|
+
import pytest
|
|
57
|
+
from src.module import function
|
|
58
|
+
|
|
59
|
+
def test_function():
|
|
60
|
+
"""测试正常情况"""
|
|
61
|
+
assert function(2, 3) == 5
|
|
62
|
+
|
|
63
|
+
def test_error_case():
|
|
64
|
+
"""测试异常情况"""
|
|
65
|
+
with pytest.raises(ValueError):
|
|
66
|
+
function(-1, 0)
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### unittest 测试格式
|
|
70
|
+
|
|
71
|
+
```python
|
|
72
|
+
import unittest
|
|
73
|
+
from src.module import function
|
|
74
|
+
|
|
75
|
+
class TestModule(unittest.TestCase):
|
|
76
|
+
def test_function(self):
|
|
77
|
+
"""测试正常情况"""
|
|
78
|
+
self.assertEqual(function(2, 3), 5)
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## 测试执行检查清单
|
|
82
|
+
|
|
83
|
+
在提交代码前,你必须确认:
|
|
84
|
+
|
|
85
|
+
- [ ] **编写完成后立即运行了测试**
|
|
86
|
+
- [ ] **所有测试都通过了**
|
|
87
|
+
- [ ] **如果测试失败,已修复代码直到通过**
|
|
88
|
+
- [ ] 测试覆盖了正常情况
|
|
89
|
+
- [ ] 测试覆盖了边界情况
|
|
90
|
+
- [ ] 测试覆盖了异常情况
|
|
91
|
+
- [ ] 使用了有意义的测试名称
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Ruby 测试规则
|
|
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
|
+
### RSpec(推荐使用)
|
|
25
|
+
|
|
26
|
+
**安装命令:**
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
gem install rspec
|
|
30
|
+
# 或添加到 Gemfile
|
|
31
|
+
gem 'rspec'
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**运行命令:**
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
rspec # 运行所有测试
|
|
38
|
+
rspec spec/file_spec.rb # 运行特定文件
|
|
39
|
+
rspec -fd # 详细输出
|
|
40
|
+
rspec --format documentation # 文档格式输出
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Minitest(标准库,无需安装)
|
|
44
|
+
|
|
45
|
+
**运行命令:**
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
ruby -I test test/test_file.rb # 运行特定文件
|
|
49
|
+
rake test # 运行所有测试(Rake)
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## 你必须编写的测试示例
|
|
53
|
+
|
|
54
|
+
### RSpec 测试格式
|
|
55
|
+
|
|
56
|
+
```ruby
|
|
57
|
+
# spec/calculator_spec.rb
|
|
58
|
+
require_relative '../lib/calculator'
|
|
59
|
+
|
|
60
|
+
RSpec.describe Calculator do
|
|
61
|
+
describe '#add' do
|
|
62
|
+
it 'adds two numbers' do
|
|
63
|
+
calc = Calculator.new
|
|
64
|
+
expect(calc.add(2, 3)).to eq(5)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
describe '#divide' do
|
|
69
|
+
it 'raises error on divide by zero' do
|
|
70
|
+
calc = Calculator.new
|
|
71
|
+
expect { calc.divide(10, 0) }.to raise_error(ZeroDivisionError)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Minitest 测试格式
|
|
78
|
+
|
|
79
|
+
```ruby
|
|
80
|
+
# test/test_calculator.rb
|
|
81
|
+
require 'minitest/autorun'
|
|
82
|
+
require_relative '../lib/calculator'
|
|
83
|
+
|
|
84
|
+
class TestCalculator < Minitest::Test
|
|
85
|
+
def test_add
|
|
86
|
+
calc = Calculator.new
|
|
87
|
+
assert_equal 5, calc.add(2, 3)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## 测试执行检查清单
|
|
93
|
+
|
|
94
|
+
在提交代码前,你必须确认:
|
|
95
|
+
|
|
96
|
+
- [ ] **编写完成后立即运行了测试**
|
|
97
|
+
- [ ] **所有测试都通过了**
|
|
98
|
+
- [ ] **如果测试失败,已修复代码直到通过**
|
|
99
|
+
- [ ] 使用了描述性的测试名称
|
|
100
|
+
- [ ] 测试覆盖了正常情况
|
|
101
|
+
- [ ] 测试覆盖了边界情况
|
|
102
|
+
- [ ] 测试覆盖了异常情况
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Rust 测试规则
|
|
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
|
+
### 标准库 test(无需安装)
|
|
25
|
+
|
|
26
|
+
**运行命令:**
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
cargo test # 运行所有测试
|
|
30
|
+
cargo test --lib # 只运行库测试
|
|
31
|
+
cargo test --bin name # 运行特定二进制文件测试
|
|
32
|
+
cargo test test_name # 运行特定测试函数
|
|
33
|
+
cargo test -- --nocapture # 显示 println! 输出
|
|
34
|
+
cargo test -- --test-threads=1 # 单线程运行
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 你必须编写的测试示例
|
|
38
|
+
|
|
39
|
+
```rust
|
|
40
|
+
// src/lib.rs 或 src/calculator.rs
|
|
41
|
+
#[cfg(test)]
|
|
42
|
+
mod tests {
|
|
43
|
+
use super::*;
|
|
44
|
+
|
|
45
|
+
#[test]
|
|
46
|
+
fn test_add() {
|
|
47
|
+
assert_eq!(add(2, 3), 5);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#[test]
|
|
51
|
+
fn test_divide_by_zero() {
|
|
52
|
+
assert!(divide(10, 0).is_err());
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
#[test]
|
|
56
|
+
#[should_panic(expected = "Division by zero")]
|
|
57
|
+
fn test_panic() {
|
|
58
|
+
divide_unchecked(10, 0);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## 测试模块规范
|
|
64
|
+
|
|
65
|
+
### 模块标记
|
|
66
|
+
|
|
67
|
+
- **必须**:测试模块使用 `#[cfg(test)]` 属性
|
|
68
|
+
- **必须**:测试函数使用 `#[test]` 属性
|
|
69
|
+
|
|
70
|
+
### 断言宏
|
|
71
|
+
|
|
72
|
+
- **必须**:使用 `assert!` 进行布尔断言
|
|
73
|
+
- **必须**:使用 `assert_eq!` 进行相等断言
|
|
74
|
+
- **必须**:使用 `assert_ne!` 进行不等断言
|
|
75
|
+
|
|
76
|
+
## 测试执行检查清单
|
|
77
|
+
|
|
78
|
+
在提交代码前,你必须确认:
|
|
79
|
+
|
|
80
|
+
- [ ] **编写完成后立即运行了测试**
|
|
81
|
+
- [ ] **所有测试都通过了**
|
|
82
|
+
- [ ] **如果测试失败,已修复代码直到通过**
|
|
83
|
+
- [ ] 测试模块使用 `#[cfg(test)]` 属性
|
|
84
|
+
- [ ] 测试函数使用 `#[test]` 属性
|
|
85
|
+
- [ ] 使用 `assert!`, `assert_eq!`, `assert_ne!` 进行断言
|
|
86
|
+
- [ ] 测试覆盖了正常、边界和异常情况
|