@ohos-cpf/3rdloop 0.0.1 → 0.0.3
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.
- package/README.md +245 -425
- package/bin/3rdloop.mjs +46 -46
- package/lib/cli.js +781 -740
- package/lib/config-cmd.js +452 -0
- package/lib/config.js +318 -317
- package/lib/doctor.js +113 -113
- package/lib/exit-codes.js +30 -30
- package/lib/opencode.js +155 -155
- package/lib/orch.js +426 -426
- package/lib/queries.js +263 -263
- package/lib/step.js +325 -325
- package/lib/ui.js +222 -222
- package/lib/update.js +280 -0
- package/lib/workflow.js +308 -290
- package/lib/workflows.js +131 -131
- package/package.json +50 -50
- package/vendor/Server/Agent/SkillSelector/README.md +343 -343
- package/vendor/Server/Agent/SkillSelector/core/Agent.js +207 -207
- package/vendor/Server/Agent/SkillSelector/index.js +14 -14
- package/vendor/Server/Agent/SkillSelector/llm/llmClient.js +313 -313
- package/vendor/Server/Agent/SkillSelector/llm/prompts.js +161 -161
- package/vendor/Server/Agent/SkillSelector/llm/reactSteps.js +144 -144
- package/vendor/Server/Agent/SkillSelector/matcher/fuzzyMatcher.js +433 -433
- package/vendor/Server/Agent/SkillSelector/scanner/skillScanner.js +382 -382
- package/vendor/Server/Agent/SkillSelector/utils/actionWords.js +59 -59
- package/vendor/Server/Brain/AnalysisStrategies.js +422 -422
- package/vendor/Server/Brain/Brain.js +686 -686
- package/vendor/Server/Brain/DecompositionStrategies.js +621 -621
- package/vendor/Server/Brain/PlanPersistence.js +196 -196
- package/vendor/Server/Brain/SkillExecutor.js +251 -251
- package/vendor/Server/Brain/index.js +11 -11
- package/vendor/Server/CLI/cli.js +275 -243
- package/vendor/Server/CLI/deveco-code/index.js +71 -0
- package/vendor/Server/CLI/deveco-code.js +5 -0
- package/vendor/Server/CLI/opencode/index.js +817 -804
- package/vendor/Server/CLI/opencode.js +5 -5
- package/vendor/Server/DbUse/MessageArchive.js +61 -61
- package/vendor/Server/DbUse/StorageManager.js +107 -107
- package/vendor/Server/DbUse/adapters/BaseAdapter.js +94 -94
- package/vendor/Server/DbUse/adapters/FileAdapter.js +138 -138
- package/vendor/Server/DbUse/adapters/JsonAdapter.js +138 -138
- package/vendor/Server/DbUse/adapters/JsonlAdapter.js +114 -114
- package/vendor/Server/DbUse/adapters/SqliteAdapter.js +157 -157
- package/vendor/Server/DbUse/index.js +160 -160
- package/vendor/Server/DbUse/stores/SessionStore.js +279 -279
- package/vendor/Server/DbUse/stores/TaskExecutionStore.js +133 -133
- package/vendor/Server/DbUse/stores/TaskRegistryStore.js +262 -262
- package/vendor/Server/DbUse/stores/TaskStepStore.js +279 -279
- package/vendor/Server/FlexRunner/FlexRunner.js +1759 -1759
- package/vendor/Server/FlexRunner/index.js +12 -12
- package/vendor/Server/Knowledge/KnowledgeImporter.js +523 -523
- package/vendor/Server/Knowledge/KnowledgeManager.js +341 -341
- package/vendor/Server/Knowledge/index.js +33 -33
- package/vendor/Server/LoopEngine/LoopEngine.js +1133 -1133
- package/vendor/Server/LoopEngine/index.js +11 -11
- package/vendor/Server/Orchestrator/Orchestrator.js +0 -3
- package/vendor/Server/Orchestrator/StepNode.js +312 -312
- package/vendor/Server/Orchestrator/index.js +13 -13
- package/vendor/Server/Routes/controllers/BrainController.js +241 -241
- package/vendor/Server/Routes/controllers/FlexRunnerController.js +1125 -1125
- package/vendor/Server/Routes/controllers/HealthController.js +44 -44
- package/vendor/Server/Routes/controllers/KnowledgeImportController.js +355 -355
- package/vendor/Server/Routes/controllers/LoopEngineController.js +788 -788
- package/vendor/Server/Routes/controllers/StatsController.js +57 -57
- package/vendor/Server/Routes/controllers/StreamController.js +67 -67
- package/vendor/Server/Routes/library/logger.js +179 -179
- package/vendor/Server/Routes/library/zipArchive.js +172 -172
- package/vendor/Server/Routes/router/Router.js +204 -204
- package/vendor/Server/Routes/routes/brain.js +47 -47
- package/vendor/Server/Routes/routes/flexrunner.js +72 -72
- package/vendor/Server/Routes/routes/health.js +28 -28
- package/vendor/Server/Routes/routes/index.js +57 -57
- package/vendor/Server/Routes/routes/knowledge.js +55 -55
- package/vendor/Server/Routes/routes/loopengine.js +58 -58
- package/vendor/Server/Routes/routes/orchestrator.js +61 -61
- package/vendor/Server/Routes/routes/registry.js +97 -97
- package/vendor/Server/Routes/routes/stats.js +23 -23
- package/vendor/Server/Routes/routes/stream.js +30 -30
- package/vendor/Server/Routes/server.js +203 -202
- package/vendor/Server/Routes/sse/SseHub.js +308 -308
- package/vendor/Server/Skills/acceptance-check/SKILL.md +191 -174
- package/vendor/Server/Skills/acceptance-check/references/PHASE1_ARTIFACT_COLLECTION.md +52 -52
- package/vendor/Server/Skills/acceptance-check/references/PHASE2_CRITERIA_EVALUATION.md +77 -77
- package/vendor/Server/Skills/acceptance-check/references/PHASE2_EVIDENCE_VERIFICATION.md +70 -0
- package/vendor/Server/Skills/arkts-code-check/SKILL.md +320 -313
- package/vendor/Server/Skills/arkts-code-check/references/CODE_CHECK_GUIDE.md +210 -159
- package/vendor/Server/Skills/arkts-code-check/references/FILE_TYPE_GUIDE.md +28 -28
- package/vendor/Server/Skills/arkts-code-check/references/PHASE1_INFO_COLLECTION.md +233 -222
- package/vendor/Server/Skills/arkts-code-check/references/REPORT_TEMPLATE.md +219 -219
- package/vendor/Server/Skills/arkts-library-compile-validate/SKILL.md +328 -328
- package/vendor/Server/Skills/arkts-library-compile-validate/scripts/build.ps1 +93 -93
- package/vendor/Server/Skills/arkts-library-compile-validate/scripts/code-linter.cjs +432 -432
- package/vendor/Server/Skills/arkts-library-compile-validate/scripts/migrate.cjs +851 -851
- package/vendor/Server/Skills/arkts-library-compile-validate/scripts/ohpm-switch.cjs +788 -788
- package/vendor/Server/Skills/arkts-library-demo-code/SKILL.md +291 -291
- package/vendor/Server/Skills/arkts-library-demo-code/references/API_SIGNATURE_CHECKS.md +68 -68
- package/vendor/Server/Skills/arkts-library-demo-code/references/BUILD_VALIDATION.md +184 -184
- package/vendor/Server/Skills/arkts-library-demo-code/references/CODE_STANDARDS.md +337 -337
- package/vendor/Server/Skills/arkts-library-demo-code/references/EXAMPLES.md +400 -400
- package/vendor/Server/Skills/arkts-library-demo-code/references/SYSTEM_API_LOOKUP.md +98 -98
- package/vendor/Server/Skills/arkts-library-demo-code/references/TEMPLATE.md +544 -544
- package/vendor/Server/Skills/arkts-library-demo-code/scripts/build.ps1 +93 -93
- package/vendor/Server/Skills/arkts-library-demo-code/scripts/code-linter.cjs +432 -432
- package/vendor/Server/Skills/arkts-library-demo-code/scripts/migrate.cjs +851 -851
- package/vendor/Server/Skills/arkts-library-demo-code/scripts/ohpm-switch.cjs +788 -788
- package/vendor/Server/Skills/arkts-library-demo-coverage/SKILL.md +174 -174
- package/vendor/Server/Skills/arkts-library-demo-scenario/SKILL.md +321 -321
- package/vendor/Server/Skills/arkts-library-demo-scenario/references/EXAMPLES.md +100 -100
- package/vendor/Server/Skills/arkts-library-demo-scenario/references/TEMPLATE.md +185 -185
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/SKILL.md +233 -233
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/assets/REPORT_TEMPLATE.md +102 -102
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/CHECK_DIMENSIONS.md +89 -89
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/COMPLIANCE_CHECKLIST.md +62 -62
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/KB_QUERY_GUIDE.md +107 -107
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/MCP_TOOL_DISCOVERY.md +124 -124
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/REPORT_TEMPLATE.md +90 -90
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/references/SCORING_FORMULA.md +57 -57
- package/vendor/Server/Skills/arkts-library-documentation-quality-check/scripts/validate-skill.cjs +259 -259
- package/vendor/Server/Skills/arkts-library-interface-spec/SKILL.md +97 -97
- package/vendor/Server/Skills/arkts-library-memory-leak-check/SKILL.md +391 -391
- package/vendor/Server/Skills/arkts-library-source-clone/SKILL.md +113 -113
- package/vendor/Server/Skills/arkts-library-stability-check/SKILL.md +312 -312
- package/vendor/Server/Skills/arkts-library-stability-check/assets/REPORT_TEMPLATE.md +154 -154
- package/vendor/Server/Skills/arkts-library-stability-check/references/CHECKLIST.md +165 -165
- package/vendor/Server/Skills/arkts-library-stability-check/references/CODE_EXAMPLES.md +308 -308
- package/vendor/Server/Skills/arkts-library-stability-check/references/SCORING_RULES.md +90 -90
- package/vendor/Server/Skills/arkts-library-stability-check/scripts/validate-skill.cjs +282 -282
- package/vendor/Server/Skills/arkts-library-test-coverage-check/SKILL.md +360 -360
- package/vendor/Server/Skills/arkts-library-test-coverage-check/assets/REPORT_TEMPLATE.md +145 -145
- package/vendor/Server/Skills/arkts-library-test-coverage-check/references/CHECKLIST.md +252 -252
- package/vendor/Server/Skills/arkts-library-test-coverage-check/references/MCP_TOOL_USAGE.md +114 -114
- package/vendor/Server/Skills/arkts-library-test-coverage-check/scripts/validate-skill.cjs +262 -262
- package/vendor/Server/Skills/arkts-library-xts-code/SKILL.md +455 -455
- package/vendor/Server/Skills/arkts-library-xts-code/assets/report-template.md +60 -60
- package/vendor/Server/Skills/arkts-library-xts-code/references/ACCESS_MODIFIER_PRECHECK.md +76 -76
- package/vendor/Server/Skills/arkts-library-xts-code/references/BUILD_VERIFICATION.md +200 -200
- package/vendor/Server/Skills/arkts-library-xts-code/references/CODE_STANDARDS.md +518 -518
- package/vendor/Server/Skills/arkts-library-xts-code/references/SUBAGENT_PROMPT_TEMPLATE.md +276 -276
- package/vendor/Server/Skills/arkts-library-xts-code/references/SYSTEM_API_LOOKUP.md +92 -92
- package/vendor/Server/Skills/arkts-library-xts-code/references/XTS_TEMPLATE.md +767 -767
- package/vendor/Server/Skills/arkts-library-xts-code/scripts/build.ps1 +93 -93
- package/vendor/Server/Skills/arkts-library-xts-code/scripts/code-linter.cjs +432 -432
- package/vendor/Server/Skills/arkts-library-xts-code/scripts/migrate.cjs +851 -851
- package/vendor/Server/Skills/arkts-library-xts-code/scripts/ohpm-switch.cjs +788 -788
- package/vendor/Server/Skills/arkts-library-xts-code/scripts/precheck-access-modifiers.cjs +221 -221
- package/vendor/Server/Skills/arkts-library-xts-code-fix/SKILL.md +228 -228
- package/vendor/Server/Skills/arkts-library-xts-coverage/SKILL.md +97 -97
- package/vendor/Server/Skills/arkts-library-xts-doc/SKILL.md +194 -194
- package/vendor/Server/Skills/arkts-library-xts-doc/references/EXAMPLES.md +575 -575
- package/vendor/Server/Skills/arkts-library-xts-doc/references/TEMPLATE.md +574 -574
- package/vendor/Server/Skills/arkts-library-xts-doc/references/TESTABILITY_GUIDE.md +182 -182
- package/vendor/Server/Skills/arkts-library-xts-execution/SKILL.md +490 -490
- package/vendor/Server/Skills/arkts-library-xts-execution/references/error-fixing-examples.md +217 -217
- package/vendor/Server/Skills/arkts-library-xts-execution/scripts/build.ps1 +93 -93
- package/vendor/Server/Skills/arkts-library-xts-execution/scripts/code-linter.cjs +432 -432
- package/vendor/Server/Skills/arkts-library-xts-execution/scripts/migrate.cjs +851 -851
- package/vendor/Server/Skills/arkts-library-xts-execution/scripts/ohpm-switch.cjs +788 -788
- package/vendor/Server/Skills/flutter-code-check/SKILL.md +299 -299
- package/vendor/Server/Skills/flutter-code-check/assets/OUTPUT_TEMPLATE.md +311 -311
- package/vendor/Server/Skills/flutter-code-check/references/CHECKLIST.md +190 -190
- package/vendor/Server/Skills/flutter-code-check/references/PLATFORMS.md +133 -133
- package/vendor/Server/Skills/flutter-code-check/scripts/validate-skill.cjs +259 -259
- package/vendor/Server/Skills/flutter-interface/README.md +75 -75
- package/vendor/Server/Skills/flutter-interface/SKILL.md +291 -291
- package/vendor/Server/Skills/flutter-interface/references/EXAMPLES.md +336 -336
- package/vendor/Server/Skills/flutter-interface/references/GIT_CLONE_GUIDE.md +190 -190
- package/vendor/Server/Skills/flutter-interface/references/SCRIPT_REFERENCE.md +258 -258
- package/vendor/Server/Skills/flutter-interface/references/TEMPLATE.md +254 -254
- package/vendor/Server/Skills/flutter-library-consistency-check/SKILL.md +517 -517
- package/vendor/Server/Skills/flutter-library-consistency-check/references/CHECKLIST.md +381 -381
- package/vendor/Server/Skills/flutter-library-consistency-check/references/FUNCTION_COMPARISON_GUIDE.md +341 -341
- package/vendor/Server/Skills/flutter-library-consistency-check/references/PLATFORM_LIMITATION_GUIDE.md +71 -71
- package/vendor/Server/Skills/flutter-library-documentation-quality-check/SKILL.md +518 -518
- package/vendor/Server/Skills/flutter-library-documentation-quality-check/references/CHECKLIST.md +406 -406
- package/vendor/Server/Skills/flutter-library-memory-leak-check/SKILL.md +652 -652
- package/vendor/Server/Skills/flutter-library-memory-leak-check/references/CHECKLIST.md +396 -396
- package/vendor/Server/Skills/flutter-library-stability-check/SKILL.md +744 -744
- package/vendor/Server/Skills/flutter-library-stability-check/references/CHECKLIST.md +720 -720
- package/vendor/Server/Skills/flutter-library-test-coverage-check/SKILL.md +414 -414
- package/vendor/Server/Skills/flutter-library-test-coverage-check/assets/REPORT_TEMPLATE.md +150 -150
- package/vendor/Server/Skills/flutter-library-test-coverage-check/references/CHECKLIST.md +304 -304
- package/vendor/Server/Skills/flutter-library-test-coverage-check/references/SCORING_RULES.md +265 -265
- package/vendor/Server/Skills/flutter-library-test-coverage-check/references/SCRIPT_USAGE.md +286 -286
- package/vendor/Server/Skills/knowledge-import/SKILL.md +383 -383
- package/vendor/Server/Skills/knowledge-import/references/MCP_TOOL_USAGE.md +165 -165
- package/vendor/Server/Skills/knowledge-import/references/SKILL_LOCATOR_GUIDE.md +91 -91
- package/vendor/Server/Skills/knowledge-import/references/SKILL_OPTIMIZATION_GUIDE.md +127 -127
- package/vendor/Server/Skills/ohos-lib-pr-push/SKILL.md +453 -301
- package/vendor/Server/Skills/ohos-lib-pr-push/assets/PR_CHECKLIST.md +151 -0
- package/vendor/Server/Skills/ohos-lib-pr-push/assets/PR_ISSUE_TEMPLATE.md +257 -105
- package/vendor/Server/Skills/ohos-lib-pr-push/references/GITCODE_API.md +191 -127
- package/vendor/Server/Skills/ohos-lib-pr-push/scripts/gitcode-api.cjs +317 -208
- package/vendor/Server/Skills/rn-code-check/SKILL.md +320 -320
- package/vendor/Server/Skills/rn-code-check/references/API-GUIDE.md +234 -234
- package/vendor/Server/Skills/rn-code-check/references/CHECKLIST.md +188 -188
- package/vendor/Server/Skills/rn-code-check/references/REPORT-TEMPLATE.md +246 -246
- package/vendor/Server/Skills/rn-lib-add-example/SKILL.md +198 -198
- package/vendor/Server/Skills/rn-lib-add-example/references/APP_RENAME_GUIDE.md +40 -40
- package/vendor/Server/Skills/rn-lib-add-example/references/SHELL_ADAPTATION_CHECKLIST.md +78 -78
- package/vendor/Server/Skills/rn-lib-add-example/references/TEMPLATE_REPO_GUIDE.md +70 -70
- package/vendor/Server/Skills/rn-lib-add-example/references/VERIFICATION_GUIDE.md +47 -47
- package/vendor/Server/Skills/rn-lib-add-example/scripts/create-example.cjs +252 -252
- package/vendor/Server/Skills/rn-lib-update-doc/SKILL.md +176 -176
- package/vendor/Server/Skills/rn-lib-update-doc/config.json +5 -5
- package/vendor/Server/Skills/rn-lib-update-doc/references/changelog-template.md +35 -35
- package/vendor/Server/Skills/rn-lib-update-doc/references/format-diff.md +137 -137
- package/vendor/Server/Skills/rn-lib-update-doc/references/link-registry.json +33 -33
- package/vendor/Server/Skills/rn-lib-update-doc/references/model-0.4.2-overview.md +40 -40
- package/vendor/Server/Skills/rn-lib-update-doc/references/model-0.4.2.md +429 -429
- package/vendor/Server/Skills/rn-lib-update-doc/scripts/detect-readme-format.cjs +105 -105
- package/vendor/Server/Skills/rn-lib-update-doc/scripts/find-usage-doc.cjs +90 -90
- package/vendor/Server/Skills/rn-lib-update-doc/scripts/link-verify.cjs +213 -213
- package/vendor/Server/Skills/rn-lib-update-doc/scripts/normalize-changelog.cjs +73 -73
- package/vendor/Server/Skills/rn-lib-update-doc/scripts/normalize-package-meta.cjs +258 -258
- package/vendor/Server/Skills/rn-lib-update-doc/scripts/normalize-readme-links.cjs +341 -341
- package/vendor/Server/Skills/rn-lib-update-doc/scripts/resolve-usage-docs.cjs +67 -67
- package/vendor/Server/Skills/rn-library-consistency-check/SKILL.md +299 -299
- package/vendor/Server/Skills/rn-library-consistency-check/assets/REPORT_TEMPLATE.md +293 -293
- package/vendor/Server/Skills/rn-library-consistency-check/references/ARKTS_COMPONENT_CHECK_GUIDE.md +857 -857
- package/vendor/Server/Skills/rn-library-consistency-check/references/ARKTS_TURBOMODULE_CHECK_GUIDE.md +856 -856
- package/vendor/Server/Skills/rn-library-consistency-check/references/CHECKLIST.md +157 -157
- package/vendor/Server/Skills/rn-library-consistency-check/references/CPP_COMPONENT_CHECK_GUIDE.md +801 -801
- package/vendor/Server/Skills/rn-library-consistency-check/references/CPP_TURBOMODULE_CHECK_GUIDE.md +683 -683
- package/vendor/Server/Skills/rn-library-consistency-check/references/FUNCTION_COMPARISON_GUIDE.md +233 -233
- package/vendor/Server/Skills/rn-library-consistency-check/references/NATIVE_COMPONENT_IDENTIFICATION.md +1373 -1373
- package/vendor/Server/Skills/rn-library-consistency-check/references/SCORING_STANDARD.md +220 -220
- package/vendor/Server/Skills/rn-library-consistency-check/scripts/validate-skill.py +245 -245
- package/vendor/Server/Skills/rn-library-documentation-quality-check/SKILL.md +263 -263
- package/vendor/Server/Skills/rn-library-documentation-quality-check/assets/MODEL.md +414 -414
- package/vendor/Server/Skills/rn-library-documentation-quality-check/assets/MODEL_en.md +413 -413
- package/vendor/Server/Skills/rn-library-documentation-quality-check/assets/REPORT_TEMPLATE.md +311 -311
- package/vendor/Server/Skills/rn-library-documentation-quality-check/references/CHECK_CHECKLIST.md +355 -355
- package/vendor/Server/Skills/rn-library-documentation-quality-check/references/CROSS_VALIDATION_GUIDE.md +115 -115
- package/vendor/Server/Skills/rn-library-documentation-quality-check/references/DOC_COLLECTION_GUIDE.md +139 -139
- package/vendor/Server/Skills/rn-library-documentation-quality-check/references/EXAMPLES.md +586 -586
- package/vendor/Server/Skills/rn-library-documentation-quality-check/references/GOTCHAS.md +57 -57
- package/vendor/Server/Skills/rn-library-documentation-quality-check/scripts/validate-skill.py +259 -259
- package/vendor/Server/Skills/rn-library-interface-analyzer/SKILL.md +301 -301
- package/vendor/Server/Skills/rn-library-interface-analyzer/assets/REPORT_TEMPLATE.md +148 -148
- package/vendor/Server/Skills/rn-library-interface-analyzer/references/DOC_ANNOTATION_GUIDE.md +118 -118
- package/vendor/Server/Skills/rn-library-interface-analyzer/references/SCRIPT_USAGE_GUIDE.md +168 -168
- package/vendor/Server/Skills/rn-library-interface-analyzer/references/URL_PARSING_RULES.md +176 -176
- package/vendor/Server/Skills/rn-library-issue-generalizer/SKILL.md +274 -274
- package/vendor/Server/Skills/rn-library-issue-generalizer/assets/case-template.md +45 -45
- package/vendor/Server/Skills/rn-library-issue-generalizer/assets/rule-template.md +25 -25
- package/vendor/Server/Skills/rn-library-issue-generalizer/references/PR_FETCH_GUIDE.md +61 -61
- package/vendor/Server/Skills/rn-library-issue-generalizer/references/RULE_TEMPLATE_GUIDE.md +165 -165
- package/vendor/Server/Skills/rn-library-issue-generalizer/scripts/fetch-pr-info.py +239 -239
- package/vendor/Server/Skills/rn-library-known-issue-check/SKILL.md +263 -263
- package/vendor/Server/Skills/rn-library-known-issue-check/assets/REPORT_TEMPLATE.md +96 -96
- package/vendor/Server/Skills/rn-library-known-issue-check/references/COMPLIANCE_CHECKLIST.md +57 -57
- package/vendor/Server/Skills/rn-library-known-issue-check/references/INSPECTION_GUIDE.md +99 -99
- package/vendor/Server/Skills/rn-library-known-issue-check/references/PRESCREEN_GUIDE.md +64 -64
- package/vendor/Server/Skills/rn-library-known-issue-check/references/SOURCE_PREP_GUIDE.md +74 -74
- package/vendor/Server/Skills/rn-library-known-issue-check/scripts/validate-known-issue-report.py +164 -164
- package/vendor/Server/Skills/rn-library-memory-leak-check/SKILL.md +356 -339
- package/vendor/Server/Skills/rn-library-memory-leak-check/assets/REPORT_TEMPLATE.md +85 -83
- package/vendor/Server/Skills/rn-library-memory-leak-check/references/CHECKLIST.md +905 -859
- package/vendor/Server/Skills/rn-library-memory-leak-check/references/HARMONY_CODE_PATTERNS.md +124 -122
- package/vendor/Server/Skills/rn-library-memory-leak-check/scripts/scan_harmony_code.py +287 -279
- package/vendor/Server/Skills/rn-library-stability-check/SKILL.md +273 -273
- package/vendor/Server/Skills/rn-library-stability-check/assets/REPORT_TEMPLATE.md +129 -129
- package/vendor/Server/Skills/rn-library-stability-check/references/CHECKLIST.md +581 -581
- package/vendor/Server/Skills/rn-library-stability-check/references/SCORING_RULES.md +138 -138
- package/vendor/Server/Skills/rn-library-stability-check/scripts/scan-harmony-code.py +168 -168
- package/vendor/Server/Skills/rn-library-test-coverage-check/SKILL.md +526 -506
- package/vendor/Server/Skills/rn-library-test-coverage-check/references/CHECKLIST.md +321 -280
- package/vendor/Server/Skills/rn-library-test-coverage-check/references/DEMO_LOCATION.md +221 -221
- package/vendor/Server/Skills/rn-library-test-coverage-check/references/REPORT_TEMPLATE.md +220 -209
- package/vendor/Server/Skills/rn-library-test-coverage-check/references/SCRIPT_USAGE.md +325 -325
- package/vendor/Server/Skills/rn-ohos-xts-generator/SKILL.md +279 -279
- package/vendor/Server/Skills/rn-ohos-xts-generator/assets/TEST_FILE_TEMPLATES.md +404 -404
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/BUILD_TROUBLESHOOTING.md +185 -185
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/BUILD_WORKFLOW.md +265 -265
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/COMMON_CONFIG.md +189 -189
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/CONFIG_GUIDE.md +203 -203
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/COVERAGE_ANALYZER.md +147 -147
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/DESIGN_DOC_GUIDE.md +148 -148
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/GENERATION_FLOW.md +165 -165
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/GENERATION_STRATEGY.md +195 -195
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/HARMONY_SCANNER.md +249 -249
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/JEST_FRAMEWORK.md +235 -235
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/PLATFORM_COMPAT.md +161 -161
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/RN_TEST_PATTERNS.md +413 -413
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/SOURCE_PARSER.md +235 -235
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/TEST_CONVENTIONS.md +245 -245
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/TROUBLESHOOTING.md +282 -282
- package/vendor/Server/Skills/rn-ohos-xts-generator/references/USAGE_GUIDE.md +251 -251
- package/vendor/Server/Skills/rnoh-cptf-api-test/SKILL.md +469 -469
- package/vendor/Server/Skills/rnoh-cptf-api-test/assets/CPTF_TEST_TEMPLATE.md +310 -310
- package/vendor/Server/Skills/rnoh-cptf-api-test/assets/DEMO_PAGE_TEMPLATE.md +303 -303
- package/vendor/Server/Skills/rnoh-cptf-api-test/references/CPTF_TEST_GENERATION_GUIDE.md +421 -421
- package/vendor/Server/Skills/rnoh-cptf-api-test/references/DEMO_GENERATION_GUIDE.md +358 -358
- package/vendor/Server/Skills/rnoh-cptf-api-test/references/QUALITY_CHECKLIST.md +114 -114
- package/vendor/Server/Skills/rnoh-cptf-api-test/references/SPEC_PARSING_GUIDE.md +274 -274
- package/vendor/Server/Skills/rnoh-cptf-api-test/scripts/validate-rnoh-cptf-api-test.sh +185 -185
- package/vendor/Server/Skills/rnoh-cptf-demo-test/SKILL.md +191 -191
- package/vendor/Server/Skills/rnoh-cptf-demo-test/assets/TEST_TEMPLATE.md +216 -216
- package/vendor/Server/Skills/rnoh-cptf-demo-test/references/CPTF_SETUP.md +107 -107
- package/vendor/Server/Skills/rnoh-cptf-demo-test/references/DEMO_ANALYSIS.md +120 -120
- package/vendor/Server/Skills/rnoh-cptf-demo-test/scripts/validate-rnoh-cptf-test.sh +108 -108
- package/vendor/Server/Skills/rnoh-cptf-test-run/SKILL.md +237 -237
- package/vendor/Server/Skills/rnoh-cptf-test-run/references/DEBUG_PLAYBOOK.md +261 -261
- package/vendor/Server/Skills/rnoh-cptf-test-run/scripts/validate-run-env.sh +112 -112
- package/vendor/Server/Skills/rnoh-lib-code-adapt/SKILL.md +497 -497
- package/vendor/Server/Skills/rnoh-lib-code-adapt/references/adapt-checklist.md +270 -270
- package/vendor/Server/Skills/rnoh-lib-code-adapt/references/api-migration-checklist.md +164 -164
- package/vendor/Server/Skills/rnoh-lib-code-adapt/references/common-compile-errors.md +556 -556
- package/vendor/Server/Skills/rnoh-lib-code-adapt/references/deveco-cli-tools.md +459 -459
- package/vendor/Server/Skills/rnoh-lib-code-adapt/references/edge-cases.md +65 -65
- package/vendor/Server/Skills/rnoh-lib-code-adapt/references/har-tgz-build.md +512 -512
- package/vendor/Server/Skills/rnoh-lib-code-adapt/references/version-compat-matrix.md +132 -132
- package/vendor/Server/Skills/rnoh-lib-code-adapt/scripts/auto-integrate.sh +424 -424
- package/vendor/Server/Skills/rnoh-lib-demo-coverage/SKILL.md +137 -137
- package/vendor/Server/Skills/rnoh-lib-demo-create/SKILL.md +306 -306
- package/vendor/Server/Skills/rnoh-lib-demo-create/assets/DEMO_PAGE_TEMPLATE.md +485 -485
- package/vendor/Server/Skills/rnoh-lib-demo-create/assets/INDEX_TEMPLATE.md +172 -172
- package/vendor/Server/Skills/rnoh-lib-demo-create/references/DEMO_CODE_RULES.md +422 -422
- package/vendor/Server/Skills/rnoh-lib-demo-create/references/QUALITY_CHECKLIST.md +95 -95
- package/vendor/Server/Skills/rnoh-lib-demo-create/references/SOURCE_EXPLORATION.md +169 -169
- package/vendor/Server/Skills/rnoh-lib-demo-doc/SKILL.md +554 -554
- package/vendor/Server/Skills/rnoh-lib-demo-doc/assets/DEMO_DOC_TEMPLATE.md +106 -106
- package/vendor/Server/Skills/rnoh-lib-demo-doc/references/COVERAGE_INCREMENTAL.md +216 -216
- package/vendor/Server/Skills/rnoh-lib-demo-doc/references/DEMO_DESIGN_RULES.md +413 -413
- package/vendor/Server/Skills/rnoh-lib-demo-doc/references/OUTPUT_FORMAT.md +269 -269
- package/vendor/Server/Skills/rnoh-lib-demo-doc/references/QUALITY_CHECKLIST.md +98 -98
- package/vendor/Server/Skills/rnoh-lib-func-test/SKILL.md +337 -337
- package/vendor/Server/Skills/rnoh-lib-rnt-search/SKILL.md +722 -722
- package/vendor/Server/Skills/rnoh-lib-rnt-search/assets/PORT_REPORT_TEMPLATE.md +219 -219
- package/vendor/Server/Skills/rnoh-lib-rnt-search/references/DEMO_PORTING_GUIDE.md +345 -345
- package/vendor/Server/Skills/rnoh-lib-rnt-search/references/PORT_VERIFICATION.md +269 -269
- package/vendor/Server/Skills/rnoh-lib-rnt-search/references/RNT_PROJECT_STRUCTURE.md +173 -173
- package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/analyze-demo-deps.cjs +267 -267
- package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/detect-rnoh-version.cjs +174 -174
- package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/find-rnt-demo.sh +111 -111
- package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/port-demo.sh +186 -186
- package/vendor/Server/Skills/rnoh-lib-rnt-search/scripts/read-lib-meta.cjs +150 -150
- package/vendor/Server/Skills/rnoh-lib-test-align/SKILL.md +296 -296
- package/vendor/Server/Skills/rnoh-lib-test-align/references/jest-troubleshooting.md +371 -371
- package/vendor/Server/Skills/rnoh-lib-test-align/references/port-test-demo-guide.md +212 -212
- package/vendor/Server/Skills/rnoh-lib-test-align/references/runtime-troubleshooting.md +345 -345
- package/vendor/Server/Skills/rnoh-lib-test-align/references/unit-test-template.md +223 -223
- package/vendor/Server/Skills/rnoh-lib-test-align/scripts/port-test-demo.sh +1053 -1053
- package/vendor/Server/Skills/rnoh-lib-version-diff/SKILL.md +295 -255
- package/vendor/Server/Skills/rnoh-lib-version-diff/references/OHOS_ADAPTATION.md +82 -77
- package/vendor/Server/Skills/rnoh-lib-version-diff/references/OHOS_API_LOOKUP.md +224 -224
- package/vendor/Server/Skills/rnoh-lib-version-diff/references/script-reference.md +175 -174
- package/vendor/Server/Skills/rnoh-lib-version-diff/scripts/detect-upstream-version.js +967 -967
- package/vendor/Server/Skills/rnoh-lib-version-diff/scripts/generate-diff.js +1798 -1798
- package/vendor/Server/Skills/rnoh-lib-version-diff/scripts/package.json +5 -5
- package/vendor/Server/Skills/rnoh-lib-version-diff/templates/report-template.md +180 -137
- package/vendor/Server/Skills/rnoh-lib-xts-coverage/SKILL.md +145 -145
- package/vendor/Server/Skills/skill-generator/SKILL.md +365 -365
- package/vendor/Server/Skills/skill-generator/assets/SKILL_TEMPLATE.md +183 -183
- package/vendor/Server/Skills/skill-generator/references/COMPLIANCE_CHECKLIST.md +82 -82
- package/vendor/Server/Skills/skill-generator/references/KB_QUERY_GUIDE.md +110 -110
- package/vendor/Server/Skills/skill-generator/references/MCP_TOOL_DISCOVERY.md +122 -122
- package/vendor/Server/Skills/skill-generator/references/SKILL_SPEC.md +121 -121
- package/vendor/Server/Skills/skill-generator/scripts/validate-skill.cjs +259 -259
- package/vendor/Server/Skills/task-analysis/SKILL.md +234 -234
- package/vendor/Server/Skills/task-analysis/assets/OUTPUT_EXAMPLES.md +160 -160
- package/vendor/Server/Skills/task-analysis/references/ACCEPTANCE_CRITERIA_GUIDE.md +190 -190
- package/vendor/Server/Skills/task-analysis/references/ANALYSIS_SCHEMA.md +224 -224
- package/vendor/Server/Skills/task-analysis/references/INTEGRATION_CONTEXT.md +162 -162
- package/vendor/Server/Skills/task-analysis/references/LESSONS_LEARNED.md +55 -55
- package/vendor/Server/Skills/task-analysis/references/REPLAN_CONTEXT_GUIDE.md +126 -126
- package/vendor/Server/Skills/task-analysis/scripts/validate-analysis-output.sh +256 -256
- package/vendor/Server/Skills/task-decomposition/SKILL.md +528 -528
- package/vendor/Server/Skills/task-decomposition/assets/OUTPUT_EXAMPLES.md +451 -451
- package/vendor/Server/Skills/task-decomposition/references/ACCEPTANCE_CRITERIA_GUIDE.md +179 -179
- package/vendor/Server/Skills/task-decomposition/references/DEPENDENCY_GRAPH_GUIDE.md +152 -152
- package/vendor/Server/Skills/task-decomposition/references/INTEGRATION_CONTEXT.md +175 -175
- package/vendor/Server/Skills/task-decomposition/references/REPLAN_CONTEXT_GUIDE.md +195 -195
- package/vendor/Server/Skills/task-decomposition/references/TASK_DECOMPOSITION_TEMPLATES.md +226 -226
- package/vendor/Server/Skills/task-decomposition/scripts/list-available-skills.cjs +263 -263
- package/vendor/Server/Skills/task-decomposition/scripts/skill-blacklist.json +29 -29
- package/vendor/Server/Skills/task-decomposition/scripts/validate-decomposition-output.cjs +376 -376
- package/vendor/Server/Skills/task-decomposition/scripts/validate-param-consistency.cjs +259 -259
- package/vendor/Server/Skills/task-decomposition/scripts/validate-specified-skills.cjs +216 -216
- package/vendor/Server/Skills/task-decomposition/scripts/validate-step-graph.cjs +424 -424
- package/vendor/Server/Skills/tpc-cpp-check/SKILL.md +427 -427
- package/vendor/Server/Skills/tpc-cpp-check/references/CHECKLIST.md +214 -214
- package/vendor/Server/Skills/tpc-cpp-check/references/HPKBUILD_GUIDE.md +235 -235
- package/vendor/Server/Skills/tpc-cpp-check/references/REPORT_TEMPLATE.md +250 -250
- package/vendor/Server/TestCheck/TestCheck.js +775 -775
- package/vendor/Server/TestCheck/index.js +11 -11
- package/vendor/Server/library/McpToolGuide.js +280 -280
- package/vendor/Server/library/StatsService.js +126 -126
- package/vendor/Server/library/cstTime.js +16 -16
- package/vendor/VERSION +3 -3
- package/workflows/pr-check.mjs +105 -105
- package/workflows/pr-push.mjs +193 -0
- package/vendor/Server/Agent/SkillSelector/types.js +0 -63
|
@@ -1,216 +1,216 @@
|
|
|
1
|
-
# CPTF 测试文件模板
|
|
2
|
-
|
|
3
|
-
> Phase 3 生成测试文件时复制此模板,替换 `{占位符}`。模板来自 react-native-get-random-values 实战验证版本(18 步骤全部通过的结构)。
|
|
4
|
-
|
|
5
|
-
## 1. 完整文件骨架
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
/*
|
|
9
|
-
* Copyright {year} {author}
|
|
10
|
-
* SPDX-License-Identifier: MIT
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import 'reflect-metadata';
|
|
14
|
-
import { Test, Step, FunctionalTest, NavigationStrategyFactory } from '@cptf/framework';
|
|
15
|
-
import type { UIElement } from '@cptf/framework';
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* {libName} (RNOH) 自动化功能测试
|
|
19
|
-
*
|
|
20
|
-
* 被测应用: {bundleId} (testerino 单页 Demo)
|
|
21
|
-
* 覆盖能力:
|
|
22
|
-
* 1. {能力分组 1}
|
|
23
|
-
* 2. {能力分组 2}
|
|
24
|
-
* ...
|
|
25
|
-
*
|
|
26
|
-
* 实现说明:
|
|
27
|
-
* - Demo 为单页应用(无 module-list 首页、无 deep link scheme),
|
|
28
|
-
* 注册自定义 'single-page' 导航策略:启动应用后直接等待 testerino
|
|
29
|
-
* 面板就绪,跳过框架默认的 deep link / 点击导航。
|
|
30
|
-
* - Demo 按钮未设置 testID,全部通过按钮文本(textContains)定位;
|
|
31
|
-
* 结果验证依赖点击后出现的业务文本。
|
|
32
|
-
* - {N} 个 TestCase 位于 ScrollView 中,屏幕外的按钮需智能滚动查找。
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
// ─── 单页应用导航策略 ───────────────────────────────────────────────
|
|
36
|
-
NavigationStrategyFactory.registerStrategy('single-page', () => ({
|
|
37
|
-
id: 'single-page',
|
|
38
|
-
async navigateToTestScene(ctx): Promise<void> {
|
|
39
|
-
ctx.logger.debug('[single-page] 单页应用,跳过场景导航,等待 testerino 面板就绪');
|
|
40
|
-
// 等待 testerino 统计面板出现(TOTAL 计数文本),最长 15s
|
|
41
|
-
const deadline = Date.now() + 15000;
|
|
42
|
-
while (Date.now() < deadline) {
|
|
43
|
-
const panel = await ctx.ui.findByText('TOTAL');
|
|
44
|
-
if (panel) {
|
|
45
|
-
ctx.logger.debug('[single-page] testerino 面板已就绪');
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
await ctx.ui.sleep(500);
|
|
49
|
-
}
|
|
50
|
-
ctx.logger.warn('[single-page] 未检测到 testerino 面板,继续执行');
|
|
51
|
-
},
|
|
52
|
-
async returnFromTestScene(_ctx): Promise<void> {
|
|
53
|
-
// 单页应用无需返回上级
|
|
54
|
-
},
|
|
55
|
-
}));
|
|
56
|
-
|
|
57
|
-
// ─── 用例定义 ───────────────────────────────────────────────────────
|
|
58
|
-
@Test({
|
|
59
|
-
id: '{lib-short-name}-func',
|
|
60
|
-
name: '{libName} 功能测试',
|
|
61
|
-
module: 'functional',
|
|
62
|
-
platform: 'harmony',
|
|
63
|
-
category: '{分类}',
|
|
64
|
-
description: '覆盖 {libName} 的 {能力概述}',
|
|
65
|
-
navigationStrategy: 'single-page',
|
|
66
|
-
captureScreenshots: true,
|
|
67
|
-
waitAfterAction: 300,
|
|
68
|
-
})
|
|
69
|
-
class {LibName}Test extends FunctionalTest {
|
|
70
|
-
/** 滚动查找并点击指定文本按钮(屏幕外元素自动滚动定位) */
|
|
71
|
-
private async scrollAndClick(textKey: string, stepLabel: string): Promise<void> {
|
|
72
|
-
const btn = await this.ui!.scrollToFindElement(
|
|
73
|
-
{ textContains: textKey, type: 'Button' },
|
|
74
|
-
{ maxScrolls: 12, waitAfterScroll: 300 },
|
|
75
|
-
);
|
|
76
|
-
if (!btn) {
|
|
77
|
-
throw new Error(`未找到按钮: ${stepLabel} (关键字: ${textKey})`);
|
|
78
|
-
}
|
|
79
|
-
const ok = await this.ui!.clickElement(btn);
|
|
80
|
-
if (!ok) {
|
|
81
|
-
throw new Error(`点击按钮失败: ${stepLabel}`);
|
|
82
|
-
}
|
|
83
|
-
await this.sleep(600);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/** 断言屏幕上出现包含 expectedSub 的文本(带轮询重试) */
|
|
87
|
-
private async waitForText(expectedSub: string, timeout = 8000): Promise<UIElement | null> {
|
|
88
|
-
const deadline = Date.now() + timeout;
|
|
89
|
-
while (Date.now() < deadline) {
|
|
90
|
-
const el = await this.ui!.findByText(expectedSub);
|
|
91
|
-
if (el) return el;
|
|
92
|
-
await this.sleep(400);
|
|
93
|
-
}
|
|
94
|
-
return null;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/** 收集步骤结果并登记失败(供报告呈现) */
|
|
98
|
-
private report(passed: boolean, details: string): void {
|
|
99
|
-
this.currentStepResult = {
|
|
100
|
-
stepName: this.currentStepResult?.stepName || '校验',
|
|
101
|
-
passed,
|
|
102
|
-
details,
|
|
103
|
-
};
|
|
104
|
-
if (!passed) {
|
|
105
|
-
throw new Error(details);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
// ── 1. {能力分组 1} ────────────────────────────────────────────────
|
|
110
|
-
|
|
111
|
-
@Step('{步骤描述}', { captureScreenshot: false, stepTimeout: 30000 })
|
|
112
|
-
async stepMethodName(): Promise<void> {
|
|
113
|
-
await this.scrollAndClick('{按钮 title 唯一子串}', '{按钮语义标签}');
|
|
114
|
-
// {断言策略说明:前缀文本 / 快照差集 / 值域校验}
|
|
115
|
-
const el = await this.waitForText('{结果文本前缀,源码逐字符复制}');
|
|
116
|
-
if (!el) {
|
|
117
|
-
throw new Error('点击后未出现{结果}文本');
|
|
118
|
-
}
|
|
119
|
-
const text = this.getChildText(el) || el.text || '';
|
|
120
|
-
this.report(text.includes('{期望值}'), `结果: "${text.trim()}"`);
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
// ... 每个 TestCase 一个 @Step
|
|
124
|
-
|
|
125
|
-
// ── 辅助: 快照差集收集无前缀结果(如裸数字) ──────────────────────
|
|
126
|
-
private lastSnapshot: Set<string> = new Set();
|
|
127
|
-
|
|
128
|
-
private async snapshotAllTexts(): Promise<Set<string>> {
|
|
129
|
-
const elements = await this.ui!.getLayout(true);
|
|
130
|
-
const texts = new Set<string>();
|
|
131
|
-
for (const el of elements) {
|
|
132
|
-
if (el.text && el.text.trim()) {
|
|
133
|
-
texts.add(el.text.trim());
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
return texts;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
private async collectNumbersAfter(caseTitle: string): Promise<number[]> {
|
|
140
|
-
const after = await this.snapshotAllTexts();
|
|
141
|
-
const added: string[] = [];
|
|
142
|
-
for (const t of after) {
|
|
143
|
-
if (!this.lastSnapshot.has(t)) {
|
|
144
|
-
added.push(t);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
this.lastSnapshot = after;
|
|
148
|
-
// 数字文本(可能为负)
|
|
149
|
-
const nums = added
|
|
150
|
-
.filter(t => /^-?\d+$/.test(t))
|
|
151
|
-
.map(t => parseInt(t, 10));
|
|
152
|
-
return nums;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
export const testCaseExecutor = new {LibName}Test();
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
## 2. 各断言策略的 @Step 写法
|
|
160
|
-
|
|
161
|
-
### 2.1 固定前缀文本断言(最常见)
|
|
162
|
-
|
|
163
|
-
```typescript
|
|
164
|
-
@Step('{描述}', { captureScreenshot: false, stepTimeout: 30000 })
|
|
165
|
-
async xxx(): Promise<void> {
|
|
166
|
-
await this.scrollAndClick('{按钮子串}', '{标签}');
|
|
167
|
-
const el = await this.waitForText('错误信息'); // ← 前缀,可省略冒号
|
|
168
|
-
if (!el) throw new Error('点击后未出现错误信息文本');
|
|
169
|
-
const errText = this.getChildText(errEl) || errEl.text || '';
|
|
170
|
-
this.report(/ExpectedError/i.test(errText), `错误信息: "${errText.trim().substring(0, 120)}"`);
|
|
171
|
-
}
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
### 2.2 快照差集断言(无前缀裸值)
|
|
175
|
-
|
|
176
|
-
```typescript
|
|
177
|
-
@Step('{描述}', { captureScreenshot: false, stepTimeout: 30000 })
|
|
178
|
-
async xxx(): Promise<void> {
|
|
179
|
-
await this.scrollAndClick('{按钮子串}', '{标签}');
|
|
180
|
-
const nums = await this.collectNumbersAfter('{caseTitle}');
|
|
181
|
-
this.report(
|
|
182
|
-
nums.length >= 1 && nums.every(n => n >= {min} && n <= {max}),
|
|
183
|
-
`生成 ${nums.length} 个: [${nums.join(', ')}],均在 [{min},{max}]`,
|
|
184
|
-
);
|
|
185
|
-
}
|
|
186
|
-
```
|
|
187
|
-
|
|
188
|
-
### 2.3 demo 已知 bug 容错断言
|
|
189
|
-
|
|
190
|
-
```typescript
|
|
191
|
-
@Step('{描述}', { captureScreenshot: false, stepTimeout: 30000 })
|
|
192
|
-
async xxx(): Promise<void> {
|
|
193
|
-
await this.scrollAndClick('{按钮子串}', '{标签}');
|
|
194
|
-
const errEl = await this.waitForText('错误信息');
|
|
195
|
-
if (!errEl) throw new Error('点击后未出现错误信息文本');
|
|
196
|
-
const errText = this.getChildText(errEl) || errEl.text || '';
|
|
197
|
-
// 注: demo 已知渲染 bug('Text strings must be rendered within a <Text>'),
|
|
198
|
-
// 错误信息可能被 LogBox 覆盖,此处仅验证错误场景触发了错误输出。
|
|
199
|
-
const hasExpected = /ExpectedError/i.test(errText);
|
|
200
|
-
const hasRenderIssue = /<Text>|rendered within/i.test(errText);
|
|
201
|
-
this.report(hasExpected || hasRenderIssue, `错误信息: "${errText.trim().substring(0, 120)}"`);
|
|
202
|
-
}
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
## 3. 编码规则速查
|
|
206
|
-
|
|
207
|
-
| 规则 | 原因 |
|
|
208
|
-
|------|------|
|
|
209
|
-
| 文件首行 `import 'reflect-metadata'` | 装饰器运行时依赖 |
|
|
210
|
-
| 每个 @Step 显式 `stepTimeout: 30000` | 默认 10s 不够滚动+点击+等待 |
|
|
211
|
-
| 断言文本从 demo 源码逐字符复制 | 全角/半角冒号差异是头号失败根因 |
|
|
212
|
-
| `captureScreenshot: false`(常规步骤) | 减少耗时;失败步骤框架自动截图 |
|
|
213
|
-
| 文件末尾 `export const testCaseExecutor` | CLI 用例发现约定 |
|
|
214
|
-
| 步骤名含中文+关键 API 名 | 报告可读性 |
|
|
215
|
-
| scrollAndClick 后 `sleep(600)` | 等待点击生效+渲染 |
|
|
216
|
-
| waitForText 轮询 400ms×20 次(8s) | 渲染时延容错 |
|
|
1
|
+
# CPTF 测试文件模板
|
|
2
|
+
|
|
3
|
+
> Phase 3 生成测试文件时复制此模板,替换 `{占位符}`。模板来自 react-native-get-random-values 实战验证版本(18 步骤全部通过的结构)。
|
|
4
|
+
|
|
5
|
+
## 1. 完整文件骨架
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
/*
|
|
9
|
+
* Copyright {year} {author}
|
|
10
|
+
* SPDX-License-Identifier: MIT
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import 'reflect-metadata';
|
|
14
|
+
import { Test, Step, FunctionalTest, NavigationStrategyFactory } from '@cptf/framework';
|
|
15
|
+
import type { UIElement } from '@cptf/framework';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* {libName} (RNOH) 自动化功能测试
|
|
19
|
+
*
|
|
20
|
+
* 被测应用: {bundleId} (testerino 单页 Demo)
|
|
21
|
+
* 覆盖能力:
|
|
22
|
+
* 1. {能力分组 1}
|
|
23
|
+
* 2. {能力分组 2}
|
|
24
|
+
* ...
|
|
25
|
+
*
|
|
26
|
+
* 实现说明:
|
|
27
|
+
* - Demo 为单页应用(无 module-list 首页、无 deep link scheme),
|
|
28
|
+
* 注册自定义 'single-page' 导航策略:启动应用后直接等待 testerino
|
|
29
|
+
* 面板就绪,跳过框架默认的 deep link / 点击导航。
|
|
30
|
+
* - Demo 按钮未设置 testID,全部通过按钮文本(textContains)定位;
|
|
31
|
+
* 结果验证依赖点击后出现的业务文本。
|
|
32
|
+
* - {N} 个 TestCase 位于 ScrollView 中,屏幕外的按钮需智能滚动查找。
|
|
33
|
+
*/
|
|
34
|
+
|
|
35
|
+
// ─── 单页应用导航策略 ───────────────────────────────────────────────
|
|
36
|
+
NavigationStrategyFactory.registerStrategy('single-page', () => ({
|
|
37
|
+
id: 'single-page',
|
|
38
|
+
async navigateToTestScene(ctx): Promise<void> {
|
|
39
|
+
ctx.logger.debug('[single-page] 单页应用,跳过场景导航,等待 testerino 面板就绪');
|
|
40
|
+
// 等待 testerino 统计面板出现(TOTAL 计数文本),最长 15s
|
|
41
|
+
const deadline = Date.now() + 15000;
|
|
42
|
+
while (Date.now() < deadline) {
|
|
43
|
+
const panel = await ctx.ui.findByText('TOTAL');
|
|
44
|
+
if (panel) {
|
|
45
|
+
ctx.logger.debug('[single-page] testerino 面板已就绪');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
await ctx.ui.sleep(500);
|
|
49
|
+
}
|
|
50
|
+
ctx.logger.warn('[single-page] 未检测到 testerino 面板,继续执行');
|
|
51
|
+
},
|
|
52
|
+
async returnFromTestScene(_ctx): Promise<void> {
|
|
53
|
+
// 单页应用无需返回上级
|
|
54
|
+
},
|
|
55
|
+
}));
|
|
56
|
+
|
|
57
|
+
// ─── 用例定义 ───────────────────────────────────────────────────────
|
|
58
|
+
@Test({
|
|
59
|
+
id: '{lib-short-name}-func',
|
|
60
|
+
name: '{libName} 功能测试',
|
|
61
|
+
module: 'functional',
|
|
62
|
+
platform: 'harmony',
|
|
63
|
+
category: '{分类}',
|
|
64
|
+
description: '覆盖 {libName} 的 {能力概述}',
|
|
65
|
+
navigationStrategy: 'single-page',
|
|
66
|
+
captureScreenshots: true,
|
|
67
|
+
waitAfterAction: 300,
|
|
68
|
+
})
|
|
69
|
+
class {LibName}Test extends FunctionalTest {
|
|
70
|
+
/** 滚动查找并点击指定文本按钮(屏幕外元素自动滚动定位) */
|
|
71
|
+
private async scrollAndClick(textKey: string, stepLabel: string): Promise<void> {
|
|
72
|
+
const btn = await this.ui!.scrollToFindElement(
|
|
73
|
+
{ textContains: textKey, type: 'Button' },
|
|
74
|
+
{ maxScrolls: 12, waitAfterScroll: 300 },
|
|
75
|
+
);
|
|
76
|
+
if (!btn) {
|
|
77
|
+
throw new Error(`未找到按钮: ${stepLabel} (关键字: ${textKey})`);
|
|
78
|
+
}
|
|
79
|
+
const ok = await this.ui!.clickElement(btn);
|
|
80
|
+
if (!ok) {
|
|
81
|
+
throw new Error(`点击按钮失败: ${stepLabel}`);
|
|
82
|
+
}
|
|
83
|
+
await this.sleep(600);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** 断言屏幕上出现包含 expectedSub 的文本(带轮询重试) */
|
|
87
|
+
private async waitForText(expectedSub: string, timeout = 8000): Promise<UIElement | null> {
|
|
88
|
+
const deadline = Date.now() + timeout;
|
|
89
|
+
while (Date.now() < deadline) {
|
|
90
|
+
const el = await this.ui!.findByText(expectedSub);
|
|
91
|
+
if (el) return el;
|
|
92
|
+
await this.sleep(400);
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** 收集步骤结果并登记失败(供报告呈现) */
|
|
98
|
+
private report(passed: boolean, details: string): void {
|
|
99
|
+
this.currentStepResult = {
|
|
100
|
+
stepName: this.currentStepResult?.stepName || '校验',
|
|
101
|
+
passed,
|
|
102
|
+
details,
|
|
103
|
+
};
|
|
104
|
+
if (!passed) {
|
|
105
|
+
throw new Error(details);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// ── 1. {能力分组 1} ────────────────────────────────────────────────
|
|
110
|
+
|
|
111
|
+
@Step('{步骤描述}', { captureScreenshot: false, stepTimeout: 30000 })
|
|
112
|
+
async stepMethodName(): Promise<void> {
|
|
113
|
+
await this.scrollAndClick('{按钮 title 唯一子串}', '{按钮语义标签}');
|
|
114
|
+
// {断言策略说明:前缀文本 / 快照差集 / 值域校验}
|
|
115
|
+
const el = await this.waitForText('{结果文本前缀,源码逐字符复制}');
|
|
116
|
+
if (!el) {
|
|
117
|
+
throw new Error('点击后未出现{结果}文本');
|
|
118
|
+
}
|
|
119
|
+
const text = this.getChildText(el) || el.text || '';
|
|
120
|
+
this.report(text.includes('{期望值}'), `结果: "${text.trim()}"`);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// ... 每个 TestCase 一个 @Step
|
|
124
|
+
|
|
125
|
+
// ── 辅助: 快照差集收集无前缀结果(如裸数字) ──────────────────────
|
|
126
|
+
private lastSnapshot: Set<string> = new Set();
|
|
127
|
+
|
|
128
|
+
private async snapshotAllTexts(): Promise<Set<string>> {
|
|
129
|
+
const elements = await this.ui!.getLayout(true);
|
|
130
|
+
const texts = new Set<string>();
|
|
131
|
+
for (const el of elements) {
|
|
132
|
+
if (el.text && el.text.trim()) {
|
|
133
|
+
texts.add(el.text.trim());
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
return texts;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
private async collectNumbersAfter(caseTitle: string): Promise<number[]> {
|
|
140
|
+
const after = await this.snapshotAllTexts();
|
|
141
|
+
const added: string[] = [];
|
|
142
|
+
for (const t of after) {
|
|
143
|
+
if (!this.lastSnapshot.has(t)) {
|
|
144
|
+
added.push(t);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
this.lastSnapshot = after;
|
|
148
|
+
// 数字文本(可能为负)
|
|
149
|
+
const nums = added
|
|
150
|
+
.filter(t => /^-?\d+$/.test(t))
|
|
151
|
+
.map(t => parseInt(t, 10));
|
|
152
|
+
return nums;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export const testCaseExecutor = new {LibName}Test();
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## 2. 各断言策略的 @Step 写法
|
|
160
|
+
|
|
161
|
+
### 2.1 固定前缀文本断言(最常见)
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
@Step('{描述}', { captureScreenshot: false, stepTimeout: 30000 })
|
|
165
|
+
async xxx(): Promise<void> {
|
|
166
|
+
await this.scrollAndClick('{按钮子串}', '{标签}');
|
|
167
|
+
const el = await this.waitForText('错误信息'); // ← 前缀,可省略冒号
|
|
168
|
+
if (!el) throw new Error('点击后未出现错误信息文本');
|
|
169
|
+
const errText = this.getChildText(errEl) || errEl.text || '';
|
|
170
|
+
this.report(/ExpectedError/i.test(errText), `错误信息: "${errText.trim().substring(0, 120)}"`);
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 2.2 快照差集断言(无前缀裸值)
|
|
175
|
+
|
|
176
|
+
```typescript
|
|
177
|
+
@Step('{描述}', { captureScreenshot: false, stepTimeout: 30000 })
|
|
178
|
+
async xxx(): Promise<void> {
|
|
179
|
+
await this.scrollAndClick('{按钮子串}', '{标签}');
|
|
180
|
+
const nums = await this.collectNumbersAfter('{caseTitle}');
|
|
181
|
+
this.report(
|
|
182
|
+
nums.length >= 1 && nums.every(n => n >= {min} && n <= {max}),
|
|
183
|
+
`生成 ${nums.length} 个: [${nums.join(', ')}],均在 [{min},{max}]`,
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### 2.3 demo 已知 bug 容错断言
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
@Step('{描述}', { captureScreenshot: false, stepTimeout: 30000 })
|
|
192
|
+
async xxx(): Promise<void> {
|
|
193
|
+
await this.scrollAndClick('{按钮子串}', '{标签}');
|
|
194
|
+
const errEl = await this.waitForText('错误信息');
|
|
195
|
+
if (!errEl) throw new Error('点击后未出现错误信息文本');
|
|
196
|
+
const errText = this.getChildText(errEl) || errEl.text || '';
|
|
197
|
+
// 注: demo 已知渲染 bug('Text strings must be rendered within a <Text>'),
|
|
198
|
+
// 错误信息可能被 LogBox 覆盖,此处仅验证错误场景触发了错误输出。
|
|
199
|
+
const hasExpected = /ExpectedError/i.test(errText);
|
|
200
|
+
const hasRenderIssue = /<Text>|rendered within/i.test(errText);
|
|
201
|
+
this.report(hasExpected || hasRenderIssue, `错误信息: "${errText.trim().substring(0, 120)}"`);
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## 3. 编码规则速查
|
|
206
|
+
|
|
207
|
+
| 规则 | 原因 |
|
|
208
|
+
|------|------|
|
|
209
|
+
| 文件首行 `import 'reflect-metadata'` | 装饰器运行时依赖 |
|
|
210
|
+
| 每个 @Step 显式 `stepTimeout: 30000` | 默认 10s 不够滚动+点击+等待 |
|
|
211
|
+
| 断言文本从 demo 源码逐字符复制 | 全角/半角冒号差异是头号失败根因 |
|
|
212
|
+
| `captureScreenshot: false`(常规步骤) | 减少耗时;失败步骤框架自动截图 |
|
|
213
|
+
| 文件末尾 `export const testCaseExecutor` | CLI 用例发现约定 |
|
|
214
|
+
| 步骤名含中文+关键 API 名 | 报告可读性 |
|
|
215
|
+
| scrollAndClick 后 `sleep(600)` | 等待点击生效+渲染 |
|
|
216
|
+
| waitForText 轮询 400ms×20 次(8s) | 渲染时延容错 |
|
|
@@ -1,107 +1,107 @@
|
|
|
1
|
-
# CPTF 测试工程搭建指南
|
|
2
|
-
|
|
3
|
-
> Phase 2 的详细操作手册。核心解决两个问题:模块解析(link 依赖)与设备/应用配置。
|
|
4
|
-
|
|
5
|
-
## 1. 前置检查
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
# 1. CPTF 框架源码位置(全局 pnpm link 安装)
|
|
9
|
-
ls -la ~/Library/pnpm/global/5/node_modules/@cptf/framework # 应为 symlink → 框架源码
|
|
10
|
-
|
|
11
|
-
# 2. hdc 工具与设备
|
|
12
|
-
hdc list targets # 应输出设备 SN(如 026PMV25CH125405)
|
|
13
|
-
|
|
14
|
-
# 3. demo hap 构建产物
|
|
15
|
-
ls {demoPath}/harmony/entry/build/default/outputs/default/entry-default-signed.hap
|
|
16
|
-
|
|
17
|
-
# 4. demo bundleId
|
|
18
|
-
cat {demoPath}/AppScope/app.json5 | grep bundleName
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## 2. cptf.config.json 完整配置
|
|
22
|
-
|
|
23
|
-
```json
|
|
24
|
-
{
|
|
25
|
-
"bundleId": "com.example.xxx",
|
|
26
|
-
"reportDir": "test-reports",
|
|
27
|
-
"reportFormat": "html",
|
|
28
|
-
"casesDir": "tests/cases",
|
|
29
|
-
"enableAlerts": true,
|
|
30
|
-
"platforms": {
|
|
31
|
-
"harmony": {
|
|
32
|
-
"toolPath": "hdc",
|
|
33
|
-
"bundleId": "com.example.xxx",
|
|
34
|
-
"appPath": "<demoPath 绝对路径>/harmony/entry/build/default/outputs/default/entry-default-signed.hap",
|
|
35
|
-
"devices": [
|
|
36
|
-
{
|
|
37
|
-
"id": "<设备SN>",
|
|
38
|
-
"screenWidth": 1280,
|
|
39
|
-
"screenHeight": 2832
|
|
40
|
-
}
|
|
41
|
-
]
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
**字段说明**:
|
|
48
|
-
- `appPath` 必须是**绝对路径**(signed hap)
|
|
49
|
-
- `screenWidth/screenHeight` 影响滚动与坐标计算,从 `hdc shell hidumper -s RenderService` 或设备规格获取
|
|
50
|
-
- `casesDir` 相对 workspace 根;测试文件放 `tests/cases/functional/` 下自动被发现
|
|
51
|
-
|
|
52
|
-
## 3. link 依赖建立(关键步骤)
|
|
53
|
-
|
|
54
|
-
### 3.1 为什么不能用全局安装直接跑
|
|
55
|
-
|
|
56
|
-
cptf CLI shim(`~/.pnpm/global/5/.bin/cptf`)通过 NODE_PATH 注入模块路径,其中包含 `.pnpm/node_modules` 等目录——**pnpm link 全局安装后这些目录可能不存在**。测试文件(位于独立 workspace)的 `require('@cptf/framework')` 解析失败,报:
|
|
57
|
-
|
|
58
|
-
```
|
|
59
|
-
Error: Cannot find module '@cptf/framework'
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
### 3.2 正确做法:workspace 本地 link
|
|
63
|
-
|
|
64
|
-
`{workspaceDir}/package.json`:
|
|
65
|
-
|
|
66
|
-
```json
|
|
67
|
-
{
|
|
68
|
-
"name": "cptf-workspace",
|
|
69
|
-
"version": "1.0.0",
|
|
70
|
-
"private": true,
|
|
71
|
-
"description": "CPTF 测试工程: <libName> RNOH 功能测试",
|
|
72
|
-
"dependencies": {
|
|
73
|
-
"@cptf/framework": "link:<frameworkPath 绝对路径>",
|
|
74
|
-
"reflect-metadata": "link:<frameworkPath>/node_modules/reflect-metadata"
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
> `reflect-metadata` 是 `@Step`/`@Test` 装饰器的运行时依赖,必须与框架内版本一致,故同样 link 框架 node_modules 内的副本。
|
|
80
|
-
|
|
81
|
-
```bash
|
|
82
|
-
cd {workspaceDir}
|
|
83
|
-
pnpm install
|
|
84
|
-
# 验证
|
|
85
|
-
node -e "console.log(require.resolve('@cptf/framework'))"
|
|
86
|
-
# 应输出 {workspaceDir}/node_modules/@cptf/framework/...
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### 3.3 TS 支持
|
|
90
|
-
|
|
91
|
-
框架 CLI 内置 `registerTsNode()`(ts-node transpileOnly,module: commonjs,target: ES2020,esModuleInterop),测试文件直接写 `.ts`,无需本地配置 tsconfig。
|
|
92
|
-
|
|
93
|
-
## 4. 用例发现机制
|
|
94
|
-
|
|
95
|
-
- CLI 扫描 `{casesDir}` 下所有 `.ts` 文件
|
|
96
|
-
- 文件必须 `export const testCaseExecutor = new XxxTest()`(实例化 FunctionalTest 子类)
|
|
97
|
-
- `@Test({ id: '...' })` 的 id 用于 `-t` 过滤:`cptf run -p harmony -t <id>`
|
|
98
|
-
|
|
99
|
-
## 5. 常见搭建故障
|
|
100
|
-
|
|
101
|
-
| 现象 | 原因 | 修复 |
|
|
102
|
-
|------|------|------|
|
|
103
|
-
| `Cannot find module '@cptf/framework'` | shim NODE_PATH 失效 | 按 3.2 本地 link |
|
|
104
|
-
| `Cannot find module 'reflect-metadata'` | 漏配 reflect-metadata link | 补 package.json 第二个 link 依赖 |
|
|
105
|
-
| 装饰器不生效(@Step 未注册) | 未 import 'reflect-metadata'(文件首行) | 测试文件第一行加 import |
|
|
106
|
-
| 设备连接失败 | hdc 未授权/未插 | `hdc list targets` 检查,重新授权 |
|
|
107
|
-
| hap 安装失败 | appPath 非绝对路径/未签名 | 核对 entry-default-signed.hap |
|
|
1
|
+
# CPTF 测试工程搭建指南
|
|
2
|
+
|
|
3
|
+
> Phase 2 的详细操作手册。核心解决两个问题:模块解析(link 依赖)与设备/应用配置。
|
|
4
|
+
|
|
5
|
+
## 1. 前置检查
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# 1. CPTF 框架源码位置(全局 pnpm link 安装)
|
|
9
|
+
ls -la ~/Library/pnpm/global/5/node_modules/@cptf/framework # 应为 symlink → 框架源码
|
|
10
|
+
|
|
11
|
+
# 2. hdc 工具与设备
|
|
12
|
+
hdc list targets # 应输出设备 SN(如 026PMV25CH125405)
|
|
13
|
+
|
|
14
|
+
# 3. demo hap 构建产物
|
|
15
|
+
ls {demoPath}/harmony/entry/build/default/outputs/default/entry-default-signed.hap
|
|
16
|
+
|
|
17
|
+
# 4. demo bundleId
|
|
18
|
+
cat {demoPath}/AppScope/app.json5 | grep bundleName
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## 2. cptf.config.json 完整配置
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"bundleId": "com.example.xxx",
|
|
26
|
+
"reportDir": "test-reports",
|
|
27
|
+
"reportFormat": "html",
|
|
28
|
+
"casesDir": "tests/cases",
|
|
29
|
+
"enableAlerts": true,
|
|
30
|
+
"platforms": {
|
|
31
|
+
"harmony": {
|
|
32
|
+
"toolPath": "hdc",
|
|
33
|
+
"bundleId": "com.example.xxx",
|
|
34
|
+
"appPath": "<demoPath 绝对路径>/harmony/entry/build/default/outputs/default/entry-default-signed.hap",
|
|
35
|
+
"devices": [
|
|
36
|
+
{
|
|
37
|
+
"id": "<设备SN>",
|
|
38
|
+
"screenWidth": 1280,
|
|
39
|
+
"screenHeight": 2832
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**字段说明**:
|
|
48
|
+
- `appPath` 必须是**绝对路径**(signed hap)
|
|
49
|
+
- `screenWidth/screenHeight` 影响滚动与坐标计算,从 `hdc shell hidumper -s RenderService` 或设备规格获取
|
|
50
|
+
- `casesDir` 相对 workspace 根;测试文件放 `tests/cases/functional/` 下自动被发现
|
|
51
|
+
|
|
52
|
+
## 3. link 依赖建立(关键步骤)
|
|
53
|
+
|
|
54
|
+
### 3.1 为什么不能用全局安装直接跑
|
|
55
|
+
|
|
56
|
+
cptf CLI shim(`~/.pnpm/global/5/.bin/cptf`)通过 NODE_PATH 注入模块路径,其中包含 `.pnpm/node_modules` 等目录——**pnpm link 全局安装后这些目录可能不存在**。测试文件(位于独立 workspace)的 `require('@cptf/framework')` 解析失败,报:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
Error: Cannot find module '@cptf/framework'
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### 3.2 正确做法:workspace 本地 link
|
|
63
|
+
|
|
64
|
+
`{workspaceDir}/package.json`:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"name": "cptf-workspace",
|
|
69
|
+
"version": "1.0.0",
|
|
70
|
+
"private": true,
|
|
71
|
+
"description": "CPTF 测试工程: <libName> RNOH 功能测试",
|
|
72
|
+
"dependencies": {
|
|
73
|
+
"@cptf/framework": "link:<frameworkPath 绝对路径>",
|
|
74
|
+
"reflect-metadata": "link:<frameworkPath>/node_modules/reflect-metadata"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
> `reflect-metadata` 是 `@Step`/`@Test` 装饰器的运行时依赖,必须与框架内版本一致,故同样 link 框架 node_modules 内的副本。
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
cd {workspaceDir}
|
|
83
|
+
pnpm install
|
|
84
|
+
# 验证
|
|
85
|
+
node -e "console.log(require.resolve('@cptf/framework'))"
|
|
86
|
+
# 应输出 {workspaceDir}/node_modules/@cptf/framework/...
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 3.3 TS 支持
|
|
90
|
+
|
|
91
|
+
框架 CLI 内置 `registerTsNode()`(ts-node transpileOnly,module: commonjs,target: ES2020,esModuleInterop),测试文件直接写 `.ts`,无需本地配置 tsconfig。
|
|
92
|
+
|
|
93
|
+
## 4. 用例发现机制
|
|
94
|
+
|
|
95
|
+
- CLI 扫描 `{casesDir}` 下所有 `.ts` 文件
|
|
96
|
+
- 文件必须 `export const testCaseExecutor = new XxxTest()`(实例化 FunctionalTest 子类)
|
|
97
|
+
- `@Test({ id: '...' })` 的 id 用于 `-t` 过滤:`cptf run -p harmony -t <id>`
|
|
98
|
+
|
|
99
|
+
## 5. 常见搭建故障
|
|
100
|
+
|
|
101
|
+
| 现象 | 原因 | 修复 |
|
|
102
|
+
|------|------|------|
|
|
103
|
+
| `Cannot find module '@cptf/framework'` | shim NODE_PATH 失效 | 按 3.2 本地 link |
|
|
104
|
+
| `Cannot find module 'reflect-metadata'` | 漏配 reflect-metadata link | 补 package.json 第二个 link 依赖 |
|
|
105
|
+
| 装饰器不生效(@Step 未注册) | 未 import 'reflect-metadata'(文件首行) | 测试文件第一行加 import |
|
|
106
|
+
| 设备连接失败 | hdc 未授权/未插 | `hdc list targets` 检查,重新授权 |
|
|
107
|
+
| hap 安装失败 | appPath 非绝对路径/未签名 | 核对 entry-default-signed.hap |
|