tuner-testkit 6.2.0__tar.gz → 6.3.0__tar.gz
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.
- {tuner_testkit-6.2.0/tuner_testkit.egg-info → tuner_testkit-6.3.0}/PKG-INFO +6 -3
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/README.md +2 -1
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/pyproject.toml +7 -2
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/__init__.py +1 -1
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/agents/sut-self-learning.md +3 -3
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/agents/sut-source-to-design.md +2 -2
- tuner_testkit-6.3.0/tuner_testkit/apps/dna/dna_payload/.cursor/skills/generate-testsheet-report/SKILL.md +147 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/dna/dna_payload/.cursor/skills/init-content/SKILL.md +170 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-testsheet/SKILL.md +24 -6
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/AGENTS.md +4 -4
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/MANIFEST.txt +1 -1
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/secret_scan.py +3 -5
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/validate_commit_msg.py +4 -3
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/scaffold.py +1 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/tests/test_git_hooks.py +25 -2
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/tests/test_scaffold.py +1 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/__init__.py +5 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/__main__.py +3 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/cli.py +253 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/draft.py +476 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/mdparse.py +237 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/profile.py +80 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/render.py +234 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/sheet.py +353 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/stats.py +257 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/template_build.py +265 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/templates/gjb438b.docx +0 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/tests/__init__.py +0 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/tests/conftest.py +135 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/tests/test_report.py +229 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/tests/test_stats.py +136 -0
- tuner_testkit-6.3.0/tuner_testkit/apps/testreport/tool.py +32 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0/tuner_testkit.egg-info}/PKG-INFO +6 -3
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit.egg-info/SOURCES.txt +16 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit.egg-info/entry_points.txt +1 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit.egg-info/requires.txt +4 -1
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/LICENSE +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/setup.cfg +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/action_words/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/action_words/__main__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/action_words/_internal/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/action_words/_internal/api.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/action_words/_internal/db.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/action_words/_internal/generators.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/action_words/_internal/ids.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/action_words/_internal/wait.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/action_words/base.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/action_words/context.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/action_words/registry.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_mock/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_mock/app.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_mock/errors.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_mock/router.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_mock/spec.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_mock/store.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_objects/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_objects/auth.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_objects/recording/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_objects/recording/capture.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_objects/recording/codegen.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_objects/recording/freeze.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_objects/recording/mocks.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_objects/recording/normalize.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_objects/recording/pipeline.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_objects/recording/sanitize.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_test/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_test/client.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_test/errors.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_test/jsonpath.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/api_test/model.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/_shared/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/_shared/changelog.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/api_recorder/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/api_recorder/__main__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/api_recorder/addon.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/api_recorder/cli.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/api_recorder/playwright_tap.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/api_recorder/tests/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/api_recorder/tests/test_addon.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/__main__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/build.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/cli.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/agents/bdd-asset-pipeline.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/hooks/sync_registry.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/hooks.json +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/agent-task-log.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/apps-authoring.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/apps-handover.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/assets-knowledge.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/bdd-asset-layering.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/bdd-pipeline-gates.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/bdd-stage-layout.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/commit-convention.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/explore-safety.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/index-hygiene.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-db.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-fake.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-logging.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-page-test.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/testcases.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/work-task.mdc +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/analyze-mcp-network/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/create-action-word/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/create-app/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/derive-design-knowledge/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/derive-feature-sets/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/derive-test-design/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/dump-ddl/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/explore-sut/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/feature-authoring/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/feature-review-lint/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/freeze-api-objects/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/generate-test-report/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-behave-steps/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-index/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-page-objects/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-testcases/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/release-template/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/reuse-analysis/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/run-feature-playwright-mcp/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/run-test-execution/SKILL.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/action-words-syntax.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/agent-task-log.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/api-objects-syntax.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/apps-authoring-syntax.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/artifacts-layout.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/assets-knowledge-syntax.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/bdd-run-gherkin-in-playwrightMCP.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/behave-gerkin-syntax.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/behave-step-definitions.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/commit-convention.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/design-knowledge-syntax.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/metadata-conventions.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/page-objects-syntax.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/sut-self-learning.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/test-design-syntax.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/testcase-syntax.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/work-task.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/README.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/commit-msg +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/pre-commit +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/pre-push +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/paths.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/source.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/targets.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/tests/test_cli.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dna/tests/test_targets.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/dump_ddl.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/evidence/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/evidence/__main__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/evidence/cli.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/evidence/persist.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/evidence/tests/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/evidence/tests/test_cli.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/evidence/tests/test_persist.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/index_ai/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/index_ai/__main__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/index_ai/registry.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/__main__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/manifest.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/INDEX.project.md +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/apps/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/behave.ini +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/config/env.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/data/sut-accounts.example.yaml +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/gitignore +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/packages/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/_internal/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/_internal/params.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/models.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/auth.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/recording/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/registry.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/packages/page_objects/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/packages/page_objects/session.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/tests/features/api_environment.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/tests/features/api_steps/given.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/tests/features/api_steps/then.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/tests/features/api_steps/when.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_environment.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_steps/given.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_steps/then.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/tests/features/ui_steps/when.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/tests/pytest/conftest.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/workbench.cmd +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/init_repo/stubs/workbench.sh +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/mock_server/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/mock_server/__main__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/mock_server/cli.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/mock_server/seed.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/mock_server/tool.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/page_recorder/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/page_recorder/__main__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/page_recorder/capture.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/page_recorder/cli.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/page_recorder/codegen.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/page_recorder/freeze.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/page_recorder/inject.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/page_recorder/session.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/page_recorder/tests/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/page_recorder/tests/test_capture.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/page_recorder/tests/test_cli.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/page_recorder/tests/test_freeze.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/recorder/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/recorder/__main__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/recorder/cli.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/recorder/tests/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/recorder/tests/test_cli.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/task/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/task/__main__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/task/cli.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/task/store.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/task/tests/test_store.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/apps/task/validate.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/artifacts.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/catalog/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/catalog/build.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/catalog/directory.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/catalog/front_matter.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/catalog/scan.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/catalog/tests/test_build.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/catalog/tests/test_directory.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/catalog/tests/test_front_matter.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/config.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/db/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/db/client.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/db/connection.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/excel/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/excel/workbook.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/fake/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/fake/__main__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/fake/catalog.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/fake/china.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/fake/cli.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/fake/core.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/fake/medical.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/fake/wrappers.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/logging/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/logging/context.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/logging/core.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/logging/helpers.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/logging/hooks.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/logging/scenario_file.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/page_test/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/page_test/__main__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/page_test/base.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/page_test/driver.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/page_test/errors.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/page_test/harvest.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/page_test/health.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/page_test/locator.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/page_test/model.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/page_test/registry.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/page_test/session.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/page_test/steps.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/page_test/testing.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/project.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/testcases/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/testcases/__main__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/testcases/tests/test_validate.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/testcases/validate.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/tools/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/tools/manifest.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/tools/runner.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/tools/tests/test_manifest.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/tools/tests/test_runner.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/__main__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/app.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/cli.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/kinds/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/kinds/app_generic.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/kinds/word_db_seed.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/kinds/word_generic.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/static/app.css +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/templates/_params_form.html +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/templates/ai.html +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/templates/ai_detail.html +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/templates/base.html +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/templates/env.html +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/templates/history.html +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/templates/home.html +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/templates/knowledge.html +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/templates/run.html +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/templates/tool.html +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/templates/tools.html +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/templates/word.html +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/templates/word_db_seed.html +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/templates/words.html +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workbench/tests/test_app.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workspace/__init__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workspace/__main__.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workspace/cli.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workspace/index_render.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workspace/meta.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workspace/tests/test_index_render.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit/workspace/tests/test_meta.py +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit.egg-info/dependency_links.txt +0 -0
- {tuner_testkit-6.2.0 → tuner_testkit-6.3.0}/tuner_testkit.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: tuner-testkit
|
|
3
|
-
Version: 6.
|
|
3
|
+
Version: 6.3.0
|
|
4
4
|
Summary: Shared test runtime, recorders, and DNA overlay for SUT test repos
|
|
5
5
|
Author: tuner-testkit contributors
|
|
6
6
|
License-Expression: MIT
|
|
@@ -40,8 +40,10 @@ Provides-Extra: bdd
|
|
|
40
40
|
Requires-Dist: behave>=1.2.6; extra == "bdd"
|
|
41
41
|
Requires-Dist: playwright>=1.54.0; extra == "bdd"
|
|
42
42
|
Requires-Dist: behave-html-pretty-formatter>=1.16.1; extra == "bdd"
|
|
43
|
+
Provides-Extra: report
|
|
44
|
+
Requires-Dist: docxtpl>=0.19; extra == "report"
|
|
43
45
|
Provides-Extra: all
|
|
44
|
-
Requires-Dist: tuner-testkit[api,bdd,db,excel,fake,mock,phone-ui,recorder,test,web-ui,workbench]; extra == "all"
|
|
46
|
+
Requires-Dist: tuner-testkit[api,bdd,db,excel,fake,mock,phone-ui,recorder,report,test,web-ui,workbench]; extra == "all"
|
|
45
47
|
Provides-Extra: dev
|
|
46
48
|
Requires-Dist: tuner-testkit[all]; extra == "dev"
|
|
47
49
|
Dynamic: license-file
|
|
@@ -198,6 +200,7 @@ git add -A && git commit
|
|
|
198
200
|
| `[recorder]` | 合录 / 仅 UI / mitmproxy 代理 |
|
|
199
201
|
| `[mock]` | 按冻结的 api_objects 回放 |
|
|
200
202
|
| `[excel]` / `[fake]` | 表格 / 假数据 |
|
|
203
|
+
| `[report]` | `tuner-testreport render`:测试单报告出 docx(docxtpl) |
|
|
201
204
|
| `[bdd]` / `[test]` | behave / pytest |
|
|
202
205
|
| `[all]` | 元 extra:上述能力 extra 的并集(不含 `[dev]`) |
|
|
203
206
|
| `[dev]` | `tuner-testkit[all]`,给本仓 editable 开发 |
|
|
@@ -227,4 +230,4 @@ uv sync --extra all
|
|
|
227
230
|
(被测系统 = 平台本身,uv workspace 成员,共用 `.venv`):路线图在 `dogfood/assets/domain-notes/platform/roadmap.md`,
|
|
228
231
|
验收活文档在 `dogfood/tests/features/`。见 [`dogfood/README.md`](dogfood/README.md)。
|
|
229
232
|
|
|
230
|
-
6.2.0 发行说明(测试单)见 [`docs/changelog/TEMPLATE-6.2.0.md`](docs/changelog/TEMPLATE-6.2.0.md);6.1.0 发行说明(scaffold 项目名)见 [`docs/changelog/TEMPLATE-6.1.0.md`](docs/changelog/TEMPLATE-6.1.0.md);6.0.0 发行说明(一条用例一个文件)见 [`docs/changelog/TEMPLATE-6.0.0.md`](docs/changelog/TEMPLATE-6.0.0.md);5.3.1 发行说明(已回答提问归档)见 [`docs/changelog/TEMPLATE-5.3.1.md`](docs/changelog/TEMPLATE-5.3.1.md);5.3.0 发行说明(功能用例集 `assets/testcases/`)见 [`docs/changelog/TEMPLATE-5.3.0.md`](docs/changelog/TEMPLATE-5.3.0.md);5.2.0 发行说明(work task / 测试设计 / 证据附件)见 [`docs/changelog/TEMPLATE-5.2.0.md`](docs/changelog/TEMPLATE-5.2.0.md);5.1.0 发行说明(工作台 / meta stamp / `--json`)见 [`docs/changelog/TEMPLATE-5.1.0.md`](docs/changelog/TEMPLATE-5.1.0.md);5.0.0(Plane Job 协议退场、`tuner-workspace`)见 [`TEMPLATE-5.0.0.md`](docs/changelog/TEMPLATE-5.0.0.md);4.3.0 见 [`TEMPLATE-4.3.0.md`](docs/changelog/TEMPLATE-4.3.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
|
|
233
|
+
6.3.0 发行说明(测试单出 GJB438B 报告)见 [`docs/changelog/TEMPLATE-6.3.0.md`](docs/changelog/TEMPLATE-6.3.0.md);6.2.0 发行说明(测试单)见 [`docs/changelog/TEMPLATE-6.2.0.md`](docs/changelog/TEMPLATE-6.2.0.md);6.1.0 发行说明(scaffold 项目名)见 [`docs/changelog/TEMPLATE-6.1.0.md`](docs/changelog/TEMPLATE-6.1.0.md);6.0.0 发行说明(一条用例一个文件)见 [`docs/changelog/TEMPLATE-6.0.0.md`](docs/changelog/TEMPLATE-6.0.0.md);5.3.1 发行说明(已回答提问归档)见 [`docs/changelog/TEMPLATE-5.3.1.md`](docs/changelog/TEMPLATE-5.3.1.md);5.3.0 发行说明(功能用例集 `assets/testcases/`)见 [`docs/changelog/TEMPLATE-5.3.0.md`](docs/changelog/TEMPLATE-5.3.0.md);5.2.0 发行说明(work task / 测试设计 / 证据附件)见 [`docs/changelog/TEMPLATE-5.2.0.md`](docs/changelog/TEMPLATE-5.2.0.md);5.1.0 发行说明(工作台 / meta stamp / `--json`)见 [`docs/changelog/TEMPLATE-5.1.0.md`](docs/changelog/TEMPLATE-5.1.0.md);5.0.0(Plane Job 协议退场、`tuner-workspace`)见 [`TEMPLATE-5.0.0.md`](docs/changelog/TEMPLATE-5.0.0.md);4.3.0 见 [`TEMPLATE-4.3.0.md`](docs/changelog/TEMPLATE-4.3.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
|
|
@@ -150,6 +150,7 @@ git add -A && git commit
|
|
|
150
150
|
| `[recorder]` | 合录 / 仅 UI / mitmproxy 代理 |
|
|
151
151
|
| `[mock]` | 按冻结的 api_objects 回放 |
|
|
152
152
|
| `[excel]` / `[fake]` | 表格 / 假数据 |
|
|
153
|
+
| `[report]` | `tuner-testreport render`:测试单报告出 docx(docxtpl) |
|
|
153
154
|
| `[bdd]` / `[test]` | behave / pytest |
|
|
154
155
|
| `[all]` | 元 extra:上述能力 extra 的并集(不含 `[dev]`) |
|
|
155
156
|
| `[dev]` | `tuner-testkit[all]`,给本仓 editable 开发 |
|
|
@@ -179,4 +180,4 @@ uv sync --extra all
|
|
|
179
180
|
(被测系统 = 平台本身,uv workspace 成员,共用 `.venv`):路线图在 `dogfood/assets/domain-notes/platform/roadmap.md`,
|
|
180
181
|
验收活文档在 `dogfood/tests/features/`。见 [`dogfood/README.md`](dogfood/README.md)。
|
|
181
182
|
|
|
182
|
-
6.2.0 发行说明(测试单)见 [`docs/changelog/TEMPLATE-6.2.0.md`](docs/changelog/TEMPLATE-6.2.0.md);6.1.0 发行说明(scaffold 项目名)见 [`docs/changelog/TEMPLATE-6.1.0.md`](docs/changelog/TEMPLATE-6.1.0.md);6.0.0 发行说明(一条用例一个文件)见 [`docs/changelog/TEMPLATE-6.0.0.md`](docs/changelog/TEMPLATE-6.0.0.md);5.3.1 发行说明(已回答提问归档)见 [`docs/changelog/TEMPLATE-5.3.1.md`](docs/changelog/TEMPLATE-5.3.1.md);5.3.0 发行说明(功能用例集 `assets/testcases/`)见 [`docs/changelog/TEMPLATE-5.3.0.md`](docs/changelog/TEMPLATE-5.3.0.md);5.2.0 发行说明(work task / 测试设计 / 证据附件)见 [`docs/changelog/TEMPLATE-5.2.0.md`](docs/changelog/TEMPLATE-5.2.0.md);5.1.0 发行说明(工作台 / meta stamp / `--json`)见 [`docs/changelog/TEMPLATE-5.1.0.md`](docs/changelog/TEMPLATE-5.1.0.md);5.0.0(Plane Job 协议退场、`tuner-workspace`)见 [`TEMPLATE-5.0.0.md`](docs/changelog/TEMPLATE-5.0.0.md);4.3.0 见 [`TEMPLATE-4.3.0.md`](docs/changelog/TEMPLATE-4.3.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
|
|
183
|
+
6.3.0 发行说明(测试单出 GJB438B 报告)见 [`docs/changelog/TEMPLATE-6.3.0.md`](docs/changelog/TEMPLATE-6.3.0.md);6.2.0 发行说明(测试单)见 [`docs/changelog/TEMPLATE-6.2.0.md`](docs/changelog/TEMPLATE-6.2.0.md);6.1.0 发行说明(scaffold 项目名)见 [`docs/changelog/TEMPLATE-6.1.0.md`](docs/changelog/TEMPLATE-6.1.0.md);6.0.0 发行说明(一条用例一个文件)见 [`docs/changelog/TEMPLATE-6.0.0.md`](docs/changelog/TEMPLATE-6.0.0.md);5.3.1 发行说明(已回答提问归档)见 [`docs/changelog/TEMPLATE-5.3.1.md`](docs/changelog/TEMPLATE-5.3.1.md);5.3.0 发行说明(功能用例集 `assets/testcases/`)见 [`docs/changelog/TEMPLATE-5.3.0.md`](docs/changelog/TEMPLATE-5.3.0.md);5.2.0 发行说明(work task / 测试设计 / 证据附件)见 [`docs/changelog/TEMPLATE-5.2.0.md`](docs/changelog/TEMPLATE-5.2.0.md);5.1.0 发行说明(工作台 / meta stamp / `--json`)见 [`docs/changelog/TEMPLATE-5.1.0.md`](docs/changelog/TEMPLATE-5.1.0.md);5.0.0(Plane Job 协议退场、`tuner-workspace`)见 [`TEMPLATE-5.0.0.md`](docs/changelog/TEMPLATE-5.0.0.md);4.3.0 见 [`TEMPLATE-4.3.0.md`](docs/changelog/TEMPLATE-4.3.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "tuner-testkit"
|
|
3
|
-
version = "6.
|
|
3
|
+
version = "6.3.0"
|
|
4
4
|
description = "Shared test runtime, recorders, and DNA overlay for SUT test repos"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
@@ -55,9 +55,12 @@ bdd = [
|
|
|
55
55
|
"playwright>=1.54.0",
|
|
56
56
|
"behave-html-pretty-formatter>=1.16.1",
|
|
57
57
|
]
|
|
58
|
+
report = [
|
|
59
|
+
"docxtpl>=0.19",
|
|
60
|
+
]
|
|
58
61
|
# Union of capability extras (excludes `dev` to avoid a cycle).
|
|
59
62
|
all = [
|
|
60
|
-
"tuner-testkit[db,api,web-ui,phone-ui,excel,fake,mock,recorder,test,bdd,workbench]",
|
|
63
|
+
"tuner-testkit[db,api,web-ui,phone-ui,excel,fake,mock,recorder,test,bdd,workbench,report]",
|
|
61
64
|
]
|
|
62
65
|
dev = [
|
|
63
66
|
"tuner-testkit[all]",
|
|
@@ -79,6 +82,7 @@ tuner-page-test = "tuner_testkit.page_test.__main__:main"
|
|
|
79
82
|
tuner-action-words = "tuner_testkit.action_words.__main__:main"
|
|
80
83
|
tuner-evidence = "tuner_testkit.apps.evidence.cli:main"
|
|
81
84
|
tuner-task = "tuner_testkit.apps.task.cli:main"
|
|
85
|
+
tuner-testreport = "tuner_testkit.apps.testreport.cli:main"
|
|
82
86
|
tuner-workbench = "tuner_testkit.workbench.cli:main"
|
|
83
87
|
|
|
84
88
|
[build-system]
|
|
@@ -92,6 +96,7 @@ include = ["tuner_testkit*"]
|
|
|
92
96
|
"tuner_testkit.apps.dna" = ["dna_payload/**/*"]
|
|
93
97
|
"tuner_testkit.apps.init_repo" = ["stubs/**/*"]
|
|
94
98
|
"tuner_testkit.workbench" = ["templates/**/*", "static/**/*"]
|
|
99
|
+
"tuner_testkit.apps.testreport" = ["templates/*.docx"]
|
|
95
100
|
|
|
96
101
|
[tool.setuptools.cmdclass]
|
|
97
102
|
build_py = "tuner_testkit.apps.dna.build.BuildPyWithDna"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sut-self-learning
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.1
|
|
4
4
|
description: Orchestrate explore-first SUT self-learning — accounts → Playwright MCP explore → evidence → freeze API/page objects → design knowledge → index, with an artifacts/inbox task log. Hand off to bdd-asset-pipeline only when Feature Sets are in scope. Do NOT use when the user explicitly requests pytest-only work.
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -26,8 +26,8 @@ description: Orchestrate explore-first SUT self-learning — accounts → Playwr
|
|
|
26
26
|
1. `data/sut-accounts.local.yaml`(gitignore,首选)
|
|
27
27
|
2. 否则 `config/env_local.py` 的 `TEST_ACCOUNT`
|
|
28
28
|
3. 都没有则停,让工程师按 `data/sut-accounts.example.yaml` 补本机文件
|
|
29
|
-
3.
|
|
30
|
-
4.
|
|
29
|
+
3. 垂直切片:优先 `assets/domain-notes/<sut>/profile.md` 的「先学切片」;没有再问工程师。一个模块,不是全站爬。
|
|
30
|
+
4. 源码根:优先 `data/source-roots.local.yaml` 的本机绝对路径,仓内相对根见 `assets/domain-notes/<sut>/source-roots.md`。两处都没有再问。有路径则跑 `sut-source-to-design`。
|
|
31
31
|
|
|
32
32
|
## Skills / agents(顺序)
|
|
33
33
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sut-source-to-design
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.2
|
|
4
4
|
description: Walk SUT backend source (Django models/views/serializers, or equivalent) plus assets/ddl to draft assets/design/<app>/<route-slug>.md. Use when the engineer points at a source tree. Do not invent tables. Complements derive-design-knowledge; this agent is the source-channel playbook.
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -12,7 +12,7 @@ Highest-quality `writes` / `noise` / `reads` often come from **models.save / vie
|
|
|
12
12
|
|
|
13
13
|
## Inputs
|
|
14
14
|
|
|
15
|
-
- Source root the user named
|
|
15
|
+
- Source root: `data/source-roots.local.yaml` backend path when present, otherwise the path the user named this session. In-repo relative root is `assets/domain-notes/<sut>/source-roots.md`.
|
|
16
16
|
- Matching `assets/ddl/<datasource>/` if present (dump missing tables rather than hallucinate)
|
|
17
17
|
- Optional `artifacts/evidence/<run_id>/` to fill `api_object_ref` / `page_ref`
|
|
18
18
|
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: generate-testsheet-report
|
|
3
|
+
version: 1.1.0
|
|
4
|
+
description: Turns one or more filled test sheets under assets/testsheet/<round>/ into a GJB438B software test report — a reviewed Markdown at assets/testreport/<sut>/<yyyy-mm>/<slug>.md plus a Word docx rendered by tuner-testreport from the kit GJB438B template into artifacts/runs/. Use when the user asks to 测试单生成测试报告, 出测试报告 docx, GJB438B 报告, 软件测试报告, or mentions a testsheet together with a report. Do not use for behave/pytest regression runs (generate-test-report) or testdesign click reports (run-test-execution).
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Generate testsheet report
|
|
8
|
+
|
|
9
|
+
## Scope
|
|
10
|
+
|
|
11
|
+
- **Write**: `assets/testreport/<sut>/<yyyy-mm>/<slug>.md`;画像 `assets/domain-notes/testreport/<sut>.md`;测试单里经用户确认的缺陷列、本轮信息、计数;`work/tasks/TASK-*.md`;`INDEX.project.md`;`artifacts/inbox/` 任务记录。
|
|
12
|
+
- **Read**: `assets/testsheet/<轮次>/`(含 `testcase/` 副本)、测试单「依据」引用的文档、画像、`INDEX.project.md`。
|
|
13
|
+
- **Run**: `tuner-testreport`(`stats` / `draft` / `render`),`render` 要 `report` extra;说明见 `tuner-testreport --help` 与平台仓 `tuner_testkit/apps/testreport/README.md`。docx 落 `artifacts/runs/<run_id>/`,不入库。
|
|
14
|
+
- **Out of scope**: 改 `assets/testcases/`(`maintain-testcases`)、改测试单的结果与实测记录(`maintain-testsheet`,结果以测试人填写为准)、改 Word 模板版式。
|
|
15
|
+
|
|
16
|
+
## Steps
|
|
17
|
+
|
|
18
|
+
1. **定范围、登记任务**:测试单目录(可多份,同一用例以后者为准);`<sut>` 取用例副本 front-matter 的 `sut:`,没有再看 `INDEX.project.md` 与已有 `assets/testreport/<sut>/`;`<slug>` 用 ASCII(例 `261030-audit-requirements`)。用 `tuner-task create --type explore` 登记任务,`--input` 写测试单和它的依据文档。
|
|
19
|
+
2. **检查测试单**:
|
|
20
|
+
|
|
21
|
+
```text
|
|
22
|
+
uv run tuner-testreport stats assets/testsheet/<轮次> --check
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
按输出改到 `errors=0`、`warnings=0`:
|
|
26
|
+
- `count_mismatch`:「共 N 条」与五个计数按输出的 `rows` 改。
|
|
27
|
+
- `defect_columns_missing`:缺陷表迁到 `编号 | 用例 | 现象 | 严重程度 | 类型 | 状态 | 是否阻塞后续`(`maintain-testsheet` 1.1),原有内容逐格搬过去,编号改 `D1`、`D2`。没有缺陷时只留一行 `无`。
|
|
28
|
+
- `defect_severity_invalid` / `defect_type_invalid` / `defect_status_invalid`:取值只能是 致命/严重/一般/轻微、需求/设计/编码/文档/其它、激活/已解决/关闭。原表没有的值放进第 3 步一起问,不要按现象猜。
|
|
29
|
+
- `info_missing`(测试人、日期、版本):放进第 3 步一起问。日期写 `2026-10-21`、`2026.10.21` 或起止两个日期都行。
|
|
30
|
+
- 计数以外的结果和实测记录不改。
|
|
31
|
+
3. **一次问全**:读画像(没有就按「画像」一节建骨架,`draft` 会列出空字段),把第 2 步和画像里缺的项合成**一次** AskQuestion,每题给「留空」或「我来填」的选项:
|
|
32
|
+
- 测试人:候选取 `git log --format=%an` 里的作者。
|
|
33
|
+
- 版本:给「未注明」选项。
|
|
34
|
+
- 基本信息:用户常不清楚这些词,题干里一并解释。编制单位是编写这份报告的单位,通常是测试方;需方是提需求、做验收的单位;开发方是研制单位;保障机构是上线后负责运维保障的单位;文档标识号、软件标识号是单位内部编号;程序规模写代码行数的量级。
|
|
35
|
+
- 软件环境、硬件环境、测试环境影响三张表:填写,或留空。
|
|
36
|
+
- 通过准则:给常用组合(例「不允许遗留 1级、2级,允许未执行」)。
|
|
37
|
+
- 提交方式:测试单、用例库还没入库时,问要不要一起按类别提交。
|
|
38
|
+
|
|
39
|
+
系统名称、系统简介可以取测试单依据文档的标题和「项目说明」,在画像 `source` 里写明出处。编制单位是必填项:用户答不上来时,可以按证据推断(测试人员提交邮箱的域名、开发方),推断写进画像正文,在总结里请用户确认。
|
|
40
|
+
4. **写画像**:用户的回答写进画像。要留空的基本信息格子空着,报告里写「/」。要留空的表格写**一行全是 `/`**,例如 `| / | / | / | / | / | / |`,不要留成空表,否则 `draft` 会出 TODO,下次 `draft --force` 又得手改。
|
|
41
|
+
5. **起草**:
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
uv run tuner-testreport draft assets/testsheet/<轮次> --sut <sut> --slug <slug> --env <env> --task <TASK-…>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
已有同名报告要用户同意才加 `--force`。`--force` 会覆盖第 6 步的手工整理,覆盖前先看 `git diff` 把要保留的段落记下来。
|
|
48
|
+
6. **处理 TODO 与手工整理**:`draft` 打印的每条 `todo` 对应报告里一处 `<!-- TODO … -->`。
|
|
49
|
+
- 画像或测试单缺字段:回到第 3、4 步补源头,再重跑 `draft --force`,不要只改报告。
|
|
50
|
+
- 改进建议:按遗留缺陷与未执行用例写一两句,可引用测试单「实测记录」和「测的时候先记住」;没有建议写「无。」。
|
|
51
|
+
- 结论待评审:画像补「通过准则」后重跑;用户直接给结论时照写,并在「评估说明」末尾写明是谁定的。
|
|
52
|
+
- 「5 注释」:工具只写测试单依据和未执行、部分通过清单。测试单开头写到的范围说明(本轮覆盖的需求、不在本轮的需求及原因)手工补进来,每条一段。
|
|
53
|
+
- 数字、缺陷矩阵、首轮与回归、用例附表由工具算,不手改。要改就改测试单再重跑。
|
|
54
|
+
- 手工改过的段落记进任务的 Decisions,重跑后照着补回。
|
|
55
|
+
7. **渲染与核对**:
|
|
56
|
+
|
|
57
|
+
```text
|
|
58
|
+
uv run --extra report tuner-testreport render assets/testreport/<sut>/<yyyy-mm>/<slug>.md
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
默认用 kit 自带的 GJB438B 模板;用户给了版式不同的样例时,先 `tuner-testreport build-template <样例.docx> --out data/testreport/<名称>.docx`,再加 `--template` 渲染。有 TODO 或章节缺失会拒绝。输出的 `check leftover_tags=0 case_rows=<N> ok` 是放行条件:没有残留模板标签,第 6 章行数等于用例数。看版式时可以用 Word 打开,提示更新域时选「是」刷新目录页码。用脚本驱动 Word 导出 PDF 时,如果卡住超过一分钟,结束自己起的 Word 进程(不要动用户开着的窗口),不要反复重试,以 `check` 结果为准。
|
|
62
|
+
8. **收尾**:
|
|
63
|
+
- `uv run tuner-workspace meta stamp` 画像与报告。
|
|
64
|
+
- `uv run tuner-workspace catalog`,再 `uv run tuner-workspace index render` 刷新 `INDEX.project.md` 自动区;人工区补一行报告的用途和结论,画像有推断或留空的写明。
|
|
65
|
+
- `tuner-task bind --output` 写报告、画像;任务正文写 Decisions(用户回答、推断、手工整理)和 Result;`tuner-task finish`。
|
|
66
|
+
- 写任务记录 `artifacts/inbox/<UTC>-generate-testsheet-report-<slice>.md`。
|
|
67
|
+
9. **提交**:按 `docs/spec/commit-convention.md`,不 push。报告、画像、任务一个提交,例 `docs(assets,work,index): 261030 提测需求测试报告`。用户同意一起提交测试单和用例库时,按类别分开:
|
|
68
|
+
- 用例库:按 `maintain-testcases` 的格式,正文每个用例一段「首次创建」或「变更原因」。
|
|
69
|
+
- 测试单:`assets/testsheet/<轮次>/` 一个提交。
|
|
70
|
+
- 报告:同上。
|
|
71
|
+
|
|
72
|
+
工作区里不属于本次的改动不要暂存。`INDEX.project.md` 等共享文件里混着几类改动时,每个提交只暂存属于自己的行:生成该版本的内容,`git hash-object -w --stdin --path <文件>` 后 `git update-index --cacheinfo 100644,<sha>,<文件>`,工作区文件不动。hook 没启用时手动跑 `tools/git-hooks/secret_scan.py` 和 `validate_commit_msg.py`。docx 在 `artifacts/runs/`,告诉用户路径,不提交。
|
|
73
|
+
|
|
74
|
+
## 折算与结论
|
|
75
|
+
|
|
76
|
+
| 测试单 | 报告 |
|
|
77
|
+
| --- | --- |
|
|
78
|
+
| 通过 | 通过 |
|
|
79
|
+
| 失败、部分通过 | 未通过 |
|
|
80
|
+
| 未执行、阻塞 | 未执行 |
|
|
81
|
+
| 缺陷表里出现的用例 | 首轮执行且未通过 |
|
|
82
|
+
| 缺陷都已解决或关闭的用例 | 回归重用;缺陷都关闭且有结果的算回归执行 |
|
|
83
|
+
| 严重程度 致命/严重/一般/轻微 | 1/2/3/4级 |
|
|
84
|
+
| 状态 关闭 | 归零;激活、已解决算遗留,进 3.1 残留问题 |
|
|
85
|
+
|
|
86
|
+
结论只看画像「通过准则」:遗留了「不允许遗留的缺陷等级」里的等级,或「允许未执行用例」不是「是」却有未执行 → 未通过测试;没有准则、遗留缺陷未定级、有未通过用例却没有遗留缺陷 → 待评审;其余 → 通过测试。
|
|
87
|
+
|
|
88
|
+
「2 引用文档」除画像列的文档外,自动加测试单本身和测试单「依据」里的每一项。依据写仓内 `.md` 路径时,标题取该文档的 front-matter `title` 或一级标题,发布日期取它的「发布日期」「建立日期」「编制日期」行或 front-matter `date`、`created`。
|
|
89
|
+
|
|
90
|
+
## 画像
|
|
91
|
+
|
|
92
|
+
`assets/domain-notes/testreport/<sut>.md`,`kind: domain-note`、`domain: testreport`。章节名固定,`tuner-testreport` 按名取:
|
|
93
|
+
|
|
94
|
+
```markdown
|
|
95
|
+
## 基本信息
|
|
96
|
+
|
|
97
|
+
| 项 | 内容 |
|
|
98
|
+
| --- | --- |
|
|
99
|
+
| 系统名称 | |
|
|
100
|
+
| 编制单位 | |
|
|
101
|
+
| 文档标识号 | |
|
|
102
|
+
| 缩略语 | 无 |
|
|
103
|
+
| 需方 | |
|
|
104
|
+
| 开发方 | |
|
|
105
|
+
| 保障机构 | |
|
|
106
|
+
| 软件标识号 | |
|
|
107
|
+
| 软件名称 | |
|
|
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
|
+
| 不允许遗留的缺陷等级 | 1级、2级 |
|
|
137
|
+
| 允许未执行用例 | 是 |
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
「运行现场」为空时,报告用测试单「本轮信息」的环境。表格要留空时写一行 `/`。「通过准则」的值由用户或评审人定,第一次建画像时问,不要默认填。
|
|
141
|
+
|
|
142
|
+
## Hard rules
|
|
143
|
+
|
|
144
|
+
- 不写密码、token、Cookie;账号只写 `account_id`。
|
|
145
|
+
- 数字只来自 `tuner-testreport` 的输出。
|
|
146
|
+
- 严重程度、类型、状态、版本、单位名称、通过准则这类判断由人给,问了再写;推断的必须在画像和总结里标明。
|
|
147
|
+
- 报告 Markdown 是审阅对象;docx 每次从它重渲染,不手改 docx 再回写。
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: init-content
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: Audits a scaffolded test workspace and writes the missing copilot basics (SUT identity, UI/API hosts, explore account, database, source roots, log channel) into the skeleton. Use when the user invokes init-content, says 开场配置 / 初始化内容 / 配置基础信息, or has just run tuner-init scaffold.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# init-content — 空骨架的开场配置
|
|
8
|
+
|
|
9
|
+
把测试仓补成可检索的 copilot 起点。人提供连接和位置,本 skill 只写缺的项。
|
|
10
|
+
表结构用 `dump-ddl` 导出;页面、接口、design、用例库不在这里编造。
|
|
11
|
+
|
|
12
|
+
## Scope
|
|
13
|
+
|
|
14
|
+
- **目标**:检查六项基础信息,向用户收集未配置项,写到下面的路径。
|
|
15
|
+
- **写范围**:`assets/domain-notes/<sut>/` 三份说明、`INDEX.project.md` 人工区、gitignore 的 `config/env_local.py` 与 `data/*.local.yaml`。用户确认后才跑 `dump-ddl`。
|
|
16
|
+
- **不写**:密码 / token / Cookie 进 `assets/`、`INDEX*`、任务、inbox、对话总结。不 `git add`、不提交。不新建 explore、design、api/page objects、feature。
|
|
17
|
+
|
|
18
|
+
## 在哪执行
|
|
19
|
+
|
|
20
|
+
1. 目标目录要有 `INDEX.project.md` 和 `config/env.py`。没有就停,让用户先 `tuner-init scaffold <dir>`。
|
|
21
|
+
2. 仓库根同时有 `tuner_testkit/apps/init_repo/scaffold.py` 和 `dogfood/` 时,这里是平台仓。先问目标目录(下游仓或 `dogfood/`)。用户指定前不要在平台根写业务配置。
|
|
22
|
+
3. 之后的路径都相对该目标目录。重复执行本 skill:已配置的值保持不动,只补缺项;用户点名要改的项才覆盖。
|
|
23
|
+
|
|
24
|
+
## 开场检查
|
|
25
|
+
|
|
26
|
+
先读盘,再向用户展示一张表(不要附带密码、token)。状态只用:`已配置` / `未配置` / `模板占位` / `连接已写,表结构未导出`。
|
|
27
|
+
|
|
28
|
+
| 项 | 落点 |
|
|
29
|
+
| --- | --- |
|
|
30
|
+
| 被测系统 | `assets/domain-notes/<sut>/profile.md` |
|
|
31
|
+
| 环境与地址 | `config/env_local.py` 的 `ENVIRONMENTS.<name>`:`TEST_UI_BASE_URL`、`TEST_BASE_URL` |
|
|
32
|
+
| 探索账号 | `data/sut-accounts.local.yaml` |
|
|
33
|
+
| 数据库 | 同一环境的 `DATABASES`(类型、host、库名、账号) |
|
|
34
|
+
| 表结构 | `assets/ddl/<别名>/*.sql` |
|
|
35
|
+
| 源码位置 | `assets/domain-notes/<sut>/source-roots.md` + 本机 `data/source-roots.local.yaml` |
|
|
36
|
+
| 后端日志 | `assets/domain-notes/<sut>/log-source.md` |
|
|
37
|
+
|
|
38
|
+
`<sut>` 取已有 `profile.md` 的父目录名。没有 profile 时此项为未配置,其余 domain-notes 路径等用户给出系统名后再定。多份 profile 时先问本次配置哪一个。
|
|
39
|
+
|
|
40
|
+
可选材料(有则记一笔,没有不算缺):`assets/usecases/`、其它 `assets/domain-notes/`、`assets/sql/`。
|
|
41
|
+
|
|
42
|
+
检查时可以跑 `python -m tuner_testkit.config show`(只打印环境名、URL、库别名)。
|
|
43
|
+
|
|
44
|
+
## 已配置判定
|
|
45
|
+
|
|
46
|
+
字段非空,且不是占位符,才算已配置。占位符:`CHANGE_ME`、`replace-me`、`you@example.com`、`example-app`、`待填写`、`00000000-0000-0000-0000-000000000000`、空字符串。
|
|
47
|
+
|
|
48
|
+
- 密码仍是 `CHANGE_ME` 或 `replace-me` 时,同一文件里的示例地址(`127.0.0.1:8080`、`127.0.0.1:8081`、`localhost:3000`、`localhost:8000`)和库名 `example` / `example_uat` 一律算模板占位。
|
|
49
|
+
- 密码已换成真实值后,上述地址算已配置。
|
|
50
|
+
- 状态表里密码列只写「已填」或「仍是占位」,不写原值。
|
|
51
|
+
|
|
52
|
+
## 收集
|
|
53
|
+
|
|
54
|
+
按表只问未配置项,一次问完。用户可以跳过某一项。被测系统名不能跳过,否则没有 `<sut>` 目录。
|
|
55
|
+
|
|
56
|
+
收集顺序:
|
|
57
|
+
|
|
58
|
+
1. 系统显示名、目录用的短名 `<sut>`(小写字母、数字、连字符)、一句话范围、先学的一个模块。
|
|
59
|
+
2. 环境名(如 `dev`)、界面 host、接口 host。两边相同就写同一个。只要 host,不要路径。
|
|
60
|
+
3. 探索账号:`account_id`、用户名或邮箱、密码。多租户再要工作区 slug、项目标识。
|
|
61
|
+
4. 业务库:别名(默认 `main`)、`mysql` / `sqlserver` / `postgres`、host、端口、库名、用户、密码。PostgreSQL 不是 `public` 时另记 schema 名。
|
|
62
|
+
5. 源码:后端与前端的仓库地址、分支、仓内根(如 `apps/api`)。本机已经克隆时再要绝对路径。
|
|
63
|
+
6. 日志通道,四选一:`ssh-dir`、`log-api`、`rancher-api`、`skip`。
|
|
64
|
+
- `ssh-dir`:目录;主机、用户、密码或密钥路径进 `LOG_SOURCE`。
|
|
65
|
+
- `log-api`:接口 path;令牌进 `LOG_SOURCE`。
|
|
66
|
+
- `rancher-api`:命名空间、工作负载;地址和令牌进 `LOG_SOURCE`。
|
|
67
|
+
- `skip`:写明本轮不做日志。
|
|
68
|
+
7. 是否有现成用例、字段/权限说明、业务 SQL 要放进仓库。没有就结束此项。
|
|
69
|
+
|
|
70
|
+
## 落盘
|
|
71
|
+
|
|
72
|
+
下面的代码块只说明文件形状。host、账号、邮箱、路径、密码都用用户本次给的值;没给的键不要写,也不要留下 `...`。
|
|
73
|
+
|
|
74
|
+
### 可提交的说明
|
|
75
|
+
|
|
76
|
+
三份都用下面这种头(`date` 用当天 ISO 日期)。写完后对每个新文件执行:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
uv run tuner-workspace meta stamp assets/domain-notes/<sut>/<file>.md --kind domain-note
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
`profile.md` 正文写显示名、范围、先学切片。非 `public` 的 schema 写在这里,供随后的 `dump-ddl --schema`。
|
|
83
|
+
|
|
84
|
+
`source-roots.md` 用表列出端、仓库、分支、仓内根。绝对路径不写进这份文件。
|
|
85
|
+
|
|
86
|
+
`log-source.md` 写 `channel` 与不含密钥的定位(目录、path、命名空间、工作负载)。密钥句只写「见 `config/env_local.py` 的 `LOG_SOURCE`」。
|
|
87
|
+
|
|
88
|
+
`INDEX.project.md` 人工区(`<!-- auto:` 围栏外)追加一条,指向这三份说明。原来只有 `_(暂无)_` 时换成这条。不要手改围栏内的表。
|
|
89
|
+
|
|
90
|
+
用户给了现成材料时:用例放 `assets/usecases/<sut>/`,字段或权限说明放 `assets/domain-notes/<sut>/`,SQL 放 `assets/sql/`。头里的 `source` 指向用户给出的原文件名。语义按原文写入,不改写。
|
|
91
|
+
|
|
92
|
+
### 只留本机
|
|
93
|
+
|
|
94
|
+
`config/env_local.py` 不存在就新建(骨架里通常没有 example)。已存在则只补缺的环境或字段,已填值不动。模板环境(仍含 `CHANGE_ME`)在用户给出真实值后整段替换,不要留着占位环境。
|
|
95
|
+
|
|
96
|
+
```python
|
|
97
|
+
# 本机密钥。gitignore。勿提交。
|
|
98
|
+
ACTIVE_ENV = "dev"
|
|
99
|
+
|
|
100
|
+
ENVIRONMENTS = {
|
|
101
|
+
"dev": {
|
|
102
|
+
"DATABASES": {
|
|
103
|
+
"main": {
|
|
104
|
+
"type": "mysql",
|
|
105
|
+
"host": "127.0.0.1",
|
|
106
|
+
"port": 3306,
|
|
107
|
+
"user": "app",
|
|
108
|
+
"password": "...",
|
|
109
|
+
"database": "app",
|
|
110
|
+
},
|
|
111
|
+
},
|
|
112
|
+
"TEST_BASE_URL": "http://127.0.0.1:8000",
|
|
113
|
+
"TEST_UI_BASE_URL": "http://127.0.0.1:3000",
|
|
114
|
+
"TEST_ACCOUNT": {"username": "qa", "password": "..."},
|
|
115
|
+
},
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
# 仅在日志通道需要密钥时添加。channel 与目录/path/命名空间写在 log-source.md。
|
|
119
|
+
# LOG_SOURCE = {"host": "...", "user": "...", "password": "..."}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
新别名才写 `config/env_overlay.py`(类型,无密码)。`main` / `sqlserver` / `postgres` 已在 `config/env.py`。业务库类型写在 `env_local` 该项的 `type`。
|
|
123
|
+
|
|
124
|
+
写好后切换激活环境(生产类名字会打印 warning,照用户的选择执行):
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
python -m tuner_testkit.config use <name>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
`data/sut-accounts.local.yaml`:
|
|
131
|
+
|
|
132
|
+
```yaml
|
|
133
|
+
sut: app
|
|
134
|
+
ui_base_url: http://127.0.0.1:3000
|
|
135
|
+
api_base_url: http://127.0.0.1:8000
|
|
136
|
+
accounts:
|
|
137
|
+
- id: qa
|
|
138
|
+
email: qa@example.com
|
|
139
|
+
password: "..."
|
|
140
|
+
notes: ""
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
用户没给工作区 / 项目标识就不写 `workspace` 和 `project`。
|
|
144
|
+
|
|
145
|
+
`data/source-roots.local.yaml` 只在用户给了本机绝对路径时创建:
|
|
146
|
+
|
|
147
|
+
```yaml
|
|
148
|
+
backend: C:/dev/repo/app/apps/api
|
|
149
|
+
frontend: C:/dev/repo/app/apps/web
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
只有一端就只写那一端。仓库地址已记、本机还没克隆:local 文件先不造路径,收口时告诉用户克隆后再跑一次本 skill。
|
|
153
|
+
|
|
154
|
+
## 表结构
|
|
155
|
+
|
|
156
|
+
数据库已配置,且 `assets/ddl/<别名>/` 下没有 `.sql` 时,问用户是否现在导出。同意后再读并遵循 `.cursor/skills/dump-ddl/SKILL.md`。用户点名表就只导那些表;`--all` 必须得到明确同意。schema 用 profile 里记下的名字。
|
|
157
|
+
|
|
158
|
+
## 收口
|
|
159
|
+
|
|
160
|
+
1. 能跑通时执行 `uv run tuner-workspace catalog` 和 `uv run tuner-workspace index render`,让 domain-notes 进入 `INDEX.project.md` 自动区。命令失败就在总结里写出失败原因,不要假装索引已更新。
|
|
161
|
+
2. 用同一张状态表回复:每项是已写入、本来就有,还是用户跳过。路径用仓库相对路径。总结里不出现密码、token、Cookie。
|
|
162
|
+
3. 不提交。提醒用户 `config/env_local.py`、`config/.active_env`、`data/*.local.yaml` 已在 gitignore。
|
|
163
|
+
4. 六项里地址和账号已齐时,下一步是 `explore-sut`。源码路径已齐时,读源码走 `sut-source-to-design`。
|
|
164
|
+
|
|
165
|
+
## Hard rules
|
|
166
|
+
|
|
167
|
+
- 用户没说的 URL、主机、仓库路径、表名,保持空白,不要用示例值充数。
|
|
168
|
+
- 对话里复述配置时,密码和令牌用「已写入本机文件」代替。
|
|
169
|
+
- 日志通道未写入 `log-source.md` 之前,不要选定 SSH、日志接口或 Rancher,也不要写取日志实现。
|
|
170
|
+
- 不把 `env_local.py` 或 `*.local.yaml` 放进暂存区。
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: maintain-testsheet
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.1.0
|
|
4
4
|
description: Builds and updates a test sheet under assets/testsheet/<round>/testsheet.md, copying the selected ready cases from assets/testcases into that round's testcase/ folder and linking only those copies. Use when the user asks to 生成测试单, 维护测试单, 测试单, or mentions assets/testsheet or testsheet.md. Do not use to edit the case library, write a testdesign, or curate assets/testreport.
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -10,7 +10,7 @@ description: Builds and updates a test sheet under assets/testsheet/<round>/test
|
|
|
10
10
|
|
|
11
11
|
- **Write**: `assets/testsheet/<轮次>/testsheet.md`,以及同目录 `testcase/` 里的用例副本。
|
|
12
12
|
- **Read**: `assets/testcases/`。有 `INDEX.project.md` 时先读,只采用已有事实。
|
|
13
|
-
- **Out of scope**: 改 `assets/testcases/`(用 `maintain-testcases`)、写 `assets/testdesign/`、写 `assets/testreport
|
|
13
|
+
- **Out of scope**: 改 `assets/testcases/`(用 `maintain-testcases`)、写 `assets/testdesign/`、写 `assets/testreport/`(测试单出报告用 `generate-testsheet-report`)。已有的 `assets/testreports/**/测试单.md` 不搬,除非用户明确要求迁移。
|
|
14
14
|
|
|
15
15
|
## Layout
|
|
16
16
|
|
|
@@ -64,6 +64,7 @@ assets/testsheet/<轮次>/
|
|
|
64
64
|
- 「结果」只写:通过、失败、部分通过、未执行、阻塞。
|
|
65
65
|
- 「实测记录」写看到的文案、单号、库存状态。不写密码、token、Cookie。账号只写 `account_id` 或登录名。
|
|
66
66
|
- 截图放本目录,文件名用用例 ID。
|
|
67
|
+
- 缺陷「严重程度」只写:致命、严重、一般、轻微。「类型」只写:需求、设计、编码、文档、其它。「状态」只写:激活、已解决、关闭。
|
|
67
68
|
|
|
68
69
|
## 本轮信息
|
|
69
70
|
|
|
@@ -71,6 +72,7 @@ assets/testsheet/<轮次>/
|
|
|
71
72
|
| --- | --- |
|
|
72
73
|
| 测试人 | |
|
|
73
74
|
| 日期 | |
|
|
75
|
+
| 版本 | |
|
|
74
76
|
| 环境 | |
|
|
75
77
|
| 证据 | 本目录 `evidence/` |
|
|
76
78
|
| 通过 | 0 |
|
|
@@ -93,17 +95,33 @@ assets/testsheet/<轮次>/
|
|
|
93
95
|
|
|
94
96
|
## 缺陷
|
|
95
97
|
|
|
96
|
-
| 编号 | 用例 | 现象 | 是否阻塞后续 |
|
|
97
|
-
| --- | --- | --- | --- |
|
|
98
|
-
| 无 | | | |
|
|
98
|
+
| 编号 | 用例 | 现象 | 严重程度 | 类型 | 状态 | 是否阻塞后续 |
|
|
99
|
+
| --- | --- | --- | --- | --- | --- | --- |
|
|
100
|
+
| 无 | | | | | | |
|
|
99
101
|
```
|
|
100
102
|
|
|
101
103
|
五个计数之和等于表内行数。新建时未执行等于 N,其余为 0。
|
|
102
104
|
|
|
105
|
+
「日期」写起止,例如 `2026-10-21 ~ 2026-10-23`,只测一天写一个日期。「版本」写被测版本号,不知道留空。
|
|
106
|
+
|
|
107
|
+
缺陷表各列:
|
|
108
|
+
|
|
109
|
+
| 列 | 写法 |
|
|
110
|
+
| --- | --- |
|
|
111
|
+
| 编号 | `D1`、`D2` 按出现顺序编,删掉的编号不复用。没有缺陷时只留一行 `无`,其余格子空着 |
|
|
112
|
+
| 用例 | 用例 ID。不对应任何一条用例时写 `/` |
|
|
113
|
+
| 严重程度 | 致命、严重、一般、轻微。报告里依次是 1 到 4 级 |
|
|
114
|
+
| 类型 | 需求、设计、编码、文档、其它 |
|
|
115
|
+
| 状态 | 激活:待开发处理。已解决:开发已修复,等回归。关闭:回归通过,或确认不再跟踪 |
|
|
116
|
+
| 是否阻塞后续 | 是、否 |
|
|
117
|
+
|
|
118
|
+
报告里「关闭」算归零,「激活」「已解决」算遗留。用例的首轮结果不另记:出现在缺陷表里的用例,报告按首轮未通过统计;缺陷已解决或关闭后,按它现在的结果统计回归。
|
|
119
|
+
|
|
103
120
|
## Update
|
|
104
121
|
|
|
105
122
|
- 回写时只改 `testsheet.md` 的结果、实测记录、计数和缺陷。结果只用那五个词。
|
|
106
|
-
-
|
|
123
|
+
- 增删一行或改了结果后,跑 `uv run tuner-testreport stats assets/testsheet/<轮次> --check`。「共 N 条」和五个计数按它输出的 `rows` 计数改,不手算。它报的取值或缺陷列问题一并改掉。
|
|
124
|
+
- 缺陷修好并回归后,不要删缺陷行,把状态改为关闭,用例结果改成回归的结果。
|
|
107
125
|
- 从本单移除一条:删表行,删 `testcase/` 里对应副本。开头写明 ID 和原因。菜单权限这类配置问题、以及改由别的页面跟踪的条目,是移除,不记失败,也不进缺陷表。
|
|
108
126
|
- 缺陷只记产品行为。
|
|
109
127
|
- 本轮步骤缺前置或判定规则:改 `testcase/` 里的副本。要沉淀回用例库时另走 `maintain-testcases`,改完不要把测试单的链接改回用例库。
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- version: 1.7.
|
|
1
|
+
<!-- version: 1.7.4 -->
|
|
2
2
|
# AGENTS — 平台总入口(轻量 DM)
|
|
3
3
|
|
|
4
4
|
> 本文件是"repo as a platform"的**稳定世界观**:只写不常变的分层结构与角色。
|
|
@@ -48,7 +48,7 @@ flowchart TD
|
|
|
48
48
|
Q -->|"明确要求 pytest / 性能 / DB 核对"| Pytest["pytest 路径\n复用 tuner_testkit + packages,不产出 .feature"]
|
|
49
49
|
Q -->|"需要一个新的独立工具"| App["create-app skill\napps-authoring / apps-handover 规则"]
|
|
50
50
|
Q -->|"缺少知识(ddl/api/用例)"| Know["先跑 kit CLI 回填 assets\n再走生成"]
|
|
51
|
-
Q -->|"新建/更新项目仓"| Init["tuner-init /
|
|
51
|
+
Q -->|"新建/更新项目仓"| Init["tuner-init / init-content\ntuner-dna / release-template"]
|
|
52
52
|
Q -->|"读/策展/索引知识"| Idx["查 INDEX.md + maintain-index skill"]
|
|
53
53
|
Q -->|"发布任务 / 测试设计 / 端到端执行"| Task["work/tasks + tuner-task\ndocs/spec/work-task.md"]
|
|
54
54
|
Q -->|"生成或维护功能测试用例"| Cases["maintain-testcases skill\ndocs/spec/testcase-syntax.md"]
|
|
@@ -60,11 +60,11 @@ flowchart TD
|
|
|
60
60
|
- **明确 pytest** → 直接写 pytest,复用 `tuner_testkit` 与本仓 `packages/**` 业务资产,不要为满足分层而硬造 Gherkin。
|
|
61
61
|
- **造工具** → `create-app` skill;工具做好按 `apps-handover.mdc` 补交接文档。证据通道(日志/DB 日志取数)也落 `apps/`,遵守 CLI + JSON 输出约定。
|
|
62
62
|
- **补知识** → 用 `tuner-dump-ddl`、Playwright MCP 探索(落盘 `artifacts/evidence/`)、`tuner-recorder` / `tuner-api-recorder` / `tuner-page-recorder` 等回填,再进入生成。
|
|
63
|
-
- **仓库初始化/发布** → `tuner-init scaffold`(骨架 + 依赖 `tuner-testkit` + 一次 `tuner-dna sync
|
|
63
|
+
- **仓库初始化/发布** → `tuner-init scaffold`(骨架 + 依赖 `tuner-testkit` + 一次 `tuner-dna sync`)。开场配置走 `init-content` skill(系统身份、URL、账号、数据库、源码根、日志通道)。发版走 `release-template` skill。下游升 kit:`uv add tuner-testkit==x.y.z` 然后 `tuner-dna sync`,再提交。
|
|
64
64
|
- **读/索引知识** → 先查 `INDEX.md`;若存在 `INDEX.project.md` 则一并查。索引维护用 `maintain-index` skill。
|
|
65
65
|
- **发布任务** → `tuner-task create` 写入 `work/tasks/`。测试设计走 `derive-test-design`;端到端点击报告走 `run-test-execution`。缺人才能决定的通道(如后端日志)用 `tuner-task ask`,不要猜。
|
|
66
66
|
- **功能测试用例** → skill `maintain-testcases`,落在 `assets/testcases/<模块>/<套件>/<用例ID>.md`(规格 `docs/spec/testcase-syntax.md`)。这不是测试设计,也不直接产出 `.feature`。
|
|
67
|
-
- **测试单** → skill `maintain-testsheet`,落在 `assets/testsheet/<轮次>/`。步骤用该目录 `testcase/` 里的用例副本,不链回 `assets/testcases
|
|
67
|
+
- **测试单** → skill `maintain-testsheet`,落在 `assets/testsheet/<轮次>/`。步骤用该目录 `testcase/` 里的用例副本,不链回 `assets/testcases/`。测试单出 GJB438B 测试报告走 skill `generate-testsheet-report`(`tuner-testreport`)。
|
|
68
68
|
|
|
69
69
|
## 5. 全程硬约束(跨分支)
|
|
70
70
|
|
|
@@ -59,16 +59,14 @@ def _staged_files() -> list[str]:
|
|
|
59
59
|
return [line.strip() for line in injected.splitlines() if line.strip()]
|
|
60
60
|
try:
|
|
61
61
|
out = subprocess.run(
|
|
62
|
-
["git", "diff", "--cached", "--name-only", "--diff-filter=ACM"],
|
|
62
|
+
["git", "diff", "--cached", "--name-only", "--diff-filter=ACM", "-z"],
|
|
63
63
|
capture_output=True,
|
|
64
|
-
text=True,
|
|
65
|
-
encoding="utf-8",
|
|
66
|
-
errors="replace",
|
|
67
64
|
check=True,
|
|
68
65
|
)
|
|
69
66
|
except (OSError, subprocess.CalledProcessError):
|
|
70
67
|
return []
|
|
71
|
-
|
|
68
|
+
# -z: NUL-separated and unquoted, so non-ASCII paths arrive as real UTF-8 names.
|
|
69
|
+
return [p for p in out.stdout.decode("utf-8", errors="replace").split("\0") if p.strip()]
|
|
72
70
|
|
|
73
71
|
|
|
74
72
|
def _should_skip(path: Path) -> bool:
|
|
@@ -55,12 +55,13 @@ def _staged_files() -> list[str]:
|
|
|
55
55
|
return [line.strip() for line in injected.splitlines() if line.strip()]
|
|
56
56
|
try:
|
|
57
57
|
out = subprocess.run(
|
|
58
|
-
["git", "diff", "--cached", "--name-only"],
|
|
59
|
-
capture_output=True,
|
|
58
|
+
["git", "diff", "--cached", "--name-only", "-z"],
|
|
59
|
+
capture_output=True, check=True,
|
|
60
60
|
)
|
|
61
61
|
except (OSError, subprocess.CalledProcessError):
|
|
62
62
|
return []
|
|
63
|
-
|
|
63
|
+
# -z: NUL-separated and unquoted, so non-ASCII paths arrive as real UTF-8 names.
|
|
64
|
+
return [p for p in out.stdout.decode("utf-8", errors="replace").split("\0") if p.strip()]
|
|
64
65
|
|
|
65
66
|
|
|
66
67
|
def _path_to_layer(path: str) -> str | None:
|
|
@@ -157,6 +157,7 @@ def _write_pyproject(
|
|
|
157
157
|
web-ui = ["tuner-testkit[web-ui]"]
|
|
158
158
|
recorder = ["tuner-testkit[recorder]"]
|
|
159
159
|
mock = ["tuner-testkit[mock]"]
|
|
160
|
+
report = ["tuner-testkit[report]"]
|
|
160
161
|
test = ["pytest>=9.0.3"]
|
|
161
162
|
bdd = ["behave>=1.2.6", "playwright>=1.54.0"]
|
|
162
163
|
dev = ["pytest>=9.0.3", "behave>=1.2.6", "playwright>=1.54.0"]
|