chimera-test-the-wiring-not-the-class
Eine Klasse, die im Test von Hand zusammengebaut wird, beweist, dass die Klasse funktioniert, nicht dass irgendetwas sie erreicht — decke den Pfad ab, den die Produktion tatsächlich nimmt.
Verliehen von der Person, die die Karte gelesen hat — nicht von der Datei über sich selbst behauptet. Eine Karte, die der Agent während eines Laufs mit nicht vertrauenswürdigen Inhalten destilliert, kommt kontaminiert zur Welt und wird bis zur Prüfung zurückgehalten, bevor sie jemals abgerufen wird.
Wann sie in den Sinn kommt
- funktioniert im Test, nicht in der App
- Komponente hinter Factory oder Registry gehängt
- das Flag ist standardmäßig aus
- grüne Suite, kaputtes Verhalten
In Vermeiden und Prüfen steckt meist der Wert. Tun ist der Abschnitt, den alle schreiben.
Der Kartentext oben ist eine Übersetzung. Das englische Original ist das, was die CLI importiert, was der Agent zur Laufzeit liest und was der Hash unten bezeugt.
Auslöser
Sie haben eine Komponente gebaut, die die Produktion indirekt erreicht: über eine Factory, eine Registry, einen Plugin-Loader, ein Config-Flag, einen Router, einen CLI-Einstiegspunkt, einen Dependency-Injection-Container. Ihre Tests konstruieren sie direkt und rufen ihre Methoden auf.
Jeder dieser Tests kann bestehen, während die Komponente im laufenden System unerreichbar ist — weil keiner von ihnen die Registrierung, den Standardwert des Flags oder den Zweig im Assembler ausübt, der entscheidet, ob sie überhaupt eingebunden wird.
Das gilt nicht für eine reine Funktion, die Aufrufer importieren und direkt aufrufen. Dort ist der Import die Verkabelung, und ein Unit-Test deckt sie ab. Es gilt auch nicht, wenn Sie einen Algorithmus bewusst isoliert testen — diese Tests sind richtig und sollten bleiben; diese Karte sagt nur, dass sie für sich allein nicht ausreichen.
Tun
-
Benennen Sie den Einstiegspunkt, den ein Nutzer tatsächlich trifft: das CLI-Subkommando, die HTTP-Route, die Run-Schleife des Agenten, den geplanten Job. Schreiben Sie ihn auf, bevor Sie den Test schreiben.
-
Schreiben Sie mindestens einen Test, der dort beginnt und keine Konstruktorargumente für Ihre Komponente übergibt. Wenn der Test Ihre Klasse benennen muss, damit das Feature passiert, testet er nicht die Verkabelung.
-
Bauen Sie das Objekt so, wie die Produktion es baut — rufen Sie die echte Factory oder den Config-Loader auf:
# WRONG — proves the class, not the wiring: the component is handed to the thing under test, # so the test passes whether or not anything in production ever hands it over. assert "reminder" in render(feature=Feature(text="reminder")) # RIGHT — build it the way the entry point builds it, then look for the same observable assert "reminder" in build_the_real_way(config).render()Chimeras eigener Fall ist erwähnenswert, weil die Klasse nie kaputt war. Skill Cards hatten einen funktionierenden Retriever, einen funktionierenden Store und einen funktionierenden Injector — und
chimera/config.py:244liestskill_cards: bool = Field(default=False, ...), sodass auf einem Standard-Deployment nie etwas injiziert wurde. Jeder Unit-Test bestand. Die Messung, die es schließlich auffing, zählte geprägte Skills gegen injizierte Skills und fand 39 gegen null. -
Prüfen Sie auf ein Beobachtbares, das nur erscheinen kann, wenn die Komponente erreicht wurde: Text im gerenderten Prompt, eine geschriebene Zeile, eine Log-Zeile, ein Exit-Code.
-
Prüfen Sie den Standardwert. Wenn das Feature hinter einem Flag ausgeliefert wird, fügen Sie einen eigenen Test hinzu, der den Standardwert ohne Overrides liest und behauptet, welcher er ist. Eine Suite, die immer nur mit erzwungenem Flag läuft, kann Ihnen nicht sagen, was Nutzer bekommen.
Vermeiden
Die Kollaborateure von Hand zusammenzubauen, die die Produktion verkabelt. Die Fehlerform ist eine Handler-Klasse mit vollständiger Unit-Abdeckung, die der Router nie registriert, oder eine Fähigkeit, deren Config-Schlüssel auf aus steht — die Klasse ist korrekt, die Tests sind korrekt, und das Feature tut im Produkt nichts. Nichts ist rot, also wird nichts untersucht, und die Lücke überlebt, bis ein Mensch das Feature von Hand ausprobiert.
Vermeiden Sie außerdem, genau die Naht zu fälschen, die Sie abzudecken versuchen. Die Factory zu patchen oder den Config-Loader so zu stubben, dass er ein Objekt mit Ihrer Komponente zurückgibt, löscht genau den Code, für dessen Ausübung der Test existierte:
monkeypatch.setattr(mod, "load_plugins", lambda: [MyPlugin()])
Fälschen Sie stattdessen an der äußersten Grenze — dem Netzwerk-Client, der Uhr, dem LLM-Aufruf — und lassen Sie alles zwischen Einstiegspunkt und Ihrer Komponente echt sein.
Prüfen
Löschen Sie die Verkabelung und lassen Sie die Suite laufen. Kommentieren Sie die
Registrierungszeile aus: den @register-Dekorator, den Eintrag im Dispatch-Dict, den
include_router(...)-Aufruf, den Standardwert im Config-Schema.
Dann die binäre Frage: Ist ein Test rot geworden, und war es ein Test, der Ihre Klasse nie beim Namen nennt?
Wenn die Suite grün bleibt, ist Ihre Abdeckung nur auf Klassenebene und die Verkabelung ungetestet.
Wenn der einzige rote Test der ist, der die Klasse direkt konstruiert, dieselbe Antwort. Stellen Sie
die Zeile danach wieder her und bestätigen Sie grün — und git diff vor dem Commit, damit die
gelöschte Registrierung nicht ausgeliefert wird.
Risiko
Einstiegspunkt-Tests sind langsamer, schwerer zu debuggen und lokalisieren schlechter: Wenn einer scheitert, wissen Sie, dass das Feature kaputt ist, aber nicht, welche von zehn Komponenten es kaputt gemacht hat. Das sind echte Kosten, und die falsche Reaktion auf diese Karte ist, die Unit-Tests zugunsten von End-to-End-Tests zu löschen. Behalten Sie beide — der Verkabelungstest sagt Ihnen, dass es kaputtging, der Unit-Test sagt Ihnen, was.
Durch den echten Einstiegspunkt zu gehen kann außerdem Dinge berühren, die Sie in der CI nicht berührt haben wollen: eine kostenpflichtige API, eine Live-Datenbank, ein Dateisystem außerhalb der Sandbox. Wenn der einzige Weg zum Einstiegspunkt darin besteht, Geld auszugeben oder Produktion zu verändern, erzwingen Sie es nicht; decken Sie stattdessen die Assembler-Funktion direkt ab und akzeptieren Sie, dass Sie einen Schritt vom wahren Pfad entfernt sind.
Und diese Karte fängt Erreichbarkeit, nicht Korrektheit. Ein Feature kann perfekt an den Einstiegspunkt verkabelt sein und trotzdem die falsche Antwort produzieren — ein grüner Verkabelungstest ist also kein Freibrief, darauf zu verzichten zu prüfen, was die Ausgabe tatsächlich sagt.
Verwenden
Die Karte ist Daten. Klonen Sie das Repository und importieren Sie sie über den Pfad — was über das Netz kommt, gilt als kontaminiert und wird bis zur Freigabe zurückgehalten. Das ist das gewünschte Verhalten und der Grund, warum es hier keinen Einzeiler-Installer gibt.
git clone https://github.com/brcampidelli/chimera-agent.gitchimera skills-import chimera-agent/skills/chimera-test-the-wiring-not-the-class/SKILL.mdIntegrität
SHA-256 der Datei in der veröffentlichten Fassung. Wer sie importiert, kann prüfen, dass das Empfangene dem entspricht, was diese Seite gezeigt hat.
564f2b0aaff3bbb51ca9bfa013d89e3d47d92166f498803c688c3b859b378475