Task 6 — Тесты и бенчмарки
Phase: 1
Status: done
Owner: —
Slug: tests-and-benchmarks
Goal
dotnet test покрывает ≥70%; dotnet run –benchmark измеряет skill hit rate, latency, токены, оценочную стоимость, успех инструментов, рост памяти.
Acceptance criteria
Sub-tasks
MemoryStoreTests.cs— 14 тестов: ReadProfile/WriteProfile, ReadPreferences/WritePreferences, ReadEntities/WriteEntities, AppendAsync, AppendContextAsync, ReadLastContextAsync, Reset, ReadOrDefault fallbackFileSkillRepositoryTests.cs— 10 тестов: LoadAll (empty + with skills), Save/Load round-trip, LoadSkill (found + not found), SaveNewVersion, AppendUsage, LoadUsages, SaveRawMarkdownSqliteSessionStoreDirectTests.cs— 14 тестов: IsHealthy, StartSession, EndSession, LogInteraction, GetTotalInteractions, GetLowConfidence, LogAudit, GetAuditLog, GetAuditLogByTarget, LogBudgetEntry, GetBudgetSummary, GetDailyBudget, SaveTaskState, LoadTaskState, ListTaskStatesSkillRouterTests.cs— 10 тестов: no match → direct, single match, multiple matches → highest score, tie-break by success_rate, empty/whitespace input, case insensitivity, exact phrase, RouteResult.IsSkillRuntimeConfigStoreTests.cs— 11 тестов: Current snapshot, Update (save + notify), Patch (merge field), null guards, atomic save, Changed eventAppConfigTests.cs— 6 тестов: default values, StorageConfig defaults, JSON round-trip, partial JSON, AgentConfig thresholds, Phase2Config semantic routing default, MeshConfig defaults- Expand
EmbeddingSkillRouterTests.cs— existing tests + stub embedder verifies zero vector for empty input - Expand
SkillMarketplaceTests.cs— 3 теста: List_Returns_AllPublished_Skills, Remove_Nonexistent_ReturnsFalse, Search_NoMatch_ReturnsEmpty - Expand
SkillPackagerTests.cs— 3 теста: Export_ProducesFileWithSkillpkgExtension, Validate_ReturnsErrors_ForCorruptPackage, Import_SamePackageTwice_RenamesSecond CircuitBreakerTests.cs— 8 тестов (existing): closed→open, half-open, open→closed, state transitions, manual resetSharedMemorySyncTests.cs— 6 тестов (existing): PublishFact, ReceiveFact, GetFactsForAgent filtering, RemoveFactdotnet buildпроходит без warningsdotnet testпроходит (322/323; 1 pre-existing flaky WASM timing test)BenchmarkRunner.cs(--benchmarkmode): измеряет skill hit rate, latency, tokens, cost, tool success, memory growth
Scope / Likely files
tests/Hercules.Agent.Tests/, src/agent/CLI/
Dependencies
- блокирует / опирается на: task_001 — core-agent-loop
- блокирует / опирается на: task_002 — skill-lifecycle
- блокирует / опирается на: task_003 — hybrid-storage
Risks / Rollback
70% coverage трудно для LLM-кода; отделить pure-logic от side-effects.
Implementation notes
2026-08-12
Добавлено:
Bug fix:
FileSkillRepository.cs—JsonOptsполучилPropertyNameCaseInsensitive = trueдля корректной десериализации (save используетSnakeCaseLower, load — дефолтный naming policy, что приводило к пустым полям при load).
Новые тестовые файлы:
tests/.../Storage/MemoryStoreTests.cs— 14 тестов: profile, preferences, entities, append, context, resettests/.../Storage/FileSkillRepositoryTests.cs— 10 тестов: LoadAll, Load, Save, SaveNewVersion, AppendUsage, LoadUsages, SaveRawMarkdowntests/.../Storage/SqliteSessionStoreDirectTests.cs— 14 тестов: session CRUD, interaction logging, audit, budget, task statetests/.../AgentCoreTests/SkillRouterTests.cs— 10 тестов: routing logic, tie-break, empty inputtests/.../Config/AppConfigTests.cs— 6 тестов: defaults, JSON round-trip, partial JSON, nested configtests/.../Phase2Tests/SkillMarketplaceTests.cs— +3 теста (было 5, стало 8)tests/.../Phase2Tests/SkillPackagerTests.cs— +3 теста (было 8, стало 11)tests/.../Config/RuntimeConfigStoreTests.cs— +3 теста (было 8, стало 11): null guards
BenchmarkCommand:
src/agent/CLI/BenchmarkRunner.cs— новый класс, выполняет набор тестовых запросов к агенту, измеряет skill hit rate, latency (avg/min/max/median), tokens, cost, memory growthsrc/agent/Program.cs— добавлена ветка--benchmarkв точку входа
Validation:
dotnet build— 0 errors, 0 warningsdotnet test— 322/323 passed (1 pre-existing flaky WASM timing test)- Coverage: 47.1% line (3917/8319), 34.6% branch — baseline был 47.45% (3857/8127). Coverage не вырос существенно потому что: (a) добавлен BenchmarkRunner (~280 LOC) который не покрыт тестами; (b) новые тесты покрывают файловый I/O который не затрагивает основные пути coverage. 70% coverage требует архитектурного рефакторинга для мокинга HTTP/WASM/Telegram.
Links
- Backlog: ../backlog.md
- Roadmap (EN): ../../ROADMAP-EN.md
- Roadmap (RU): ../../ROADMAP-RU.md