chimera-test-the-wiring-not-the-class
Klasa złożona ręcznie w teście dowodzi, że klasa działa, a nie że cokolwiek do niej dociera — pokryj ścieżkę, którą faktycznie idzie produkcja.
Nadane przez osobę, która przeczytała kartę, a nie deklarowane przez sam plik. Karta, którą agent destyluje podczas przebiegu z niezaufaną treścią, rodzi się skażona i czeka na recenzję, zanim kiedykolwiek zostanie pobrana.
Kiedy przychodzi na myśl
- działa w testach, nie w aplikacji
- komponent ukryty za fabryką lub rejestrem
- flaga domyślnie wyłączona
- zielone testy, zepsute zachowanie
Wartość zwykle kryje się w Unikaj i Sprawdź. Rób to sekcja, którą pisze każdy.
Treść karty powyżej to tłumaczenie. Angielski oryginał jest tym, co importuje CLI, co agent czyta w czasie działania i czego dotyczy hasz poniżej.
Wyzwalacz
Zbudowałeś komponent, do którego produkcja dociera pośrednio: przez fabrykę, rejestr, loader wtyczek, flagę konfiguracji, router, punkt wejścia CLI, kontener wstrzykiwania zależności. Twoje testy konstruują go bezpośrednio i wołają jego metody.
Każdy z tych testów może przechodzić, podczas gdy komponent jest w działającym systemie nieosiągalny — bo żaden z nich nie ćwiczy rejestracji, wartości domyślnej flagi ani gałęzi w składaczu, która decyduje, czy w ogóle go dołączyć.
Nie dotyczy to czystej funkcji, którą wywołujący importują i wołają wprost. Tam import jest okablowaniem, a test jednostkowy je pokrywa. Nie dotyczy też sytuacji, gdy świadomie testujesz algorytm w izolacji — te testy są poprawne i powinny zostać; ta karta mówi, że same w sobie nie wystarczają.
Rób
-
Nazwij punkt wejścia, w który użytkownik faktycznie uderza: podpolecenie CLI, trasę HTTP, pętlę uruchomieniową agenta, zaplanowany job. Zapisz go, zanim napiszesz test.
-
Napisz co najmniej jeden test, który zaczyna się tam i nie przekazuje żadnych argumentów konstruktora dla twojego komponentu. Jeśli test musi nazwać twoją klasę, żeby funkcja się wydarzyła, to nie testuje okablowania.
-
Zbuduj obiekt tak, jak buduje go produkcja — wołając prawdziwą fabrykę albo loader konfiguracji:
# 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()Własny przypadek Chimery warto nazwać, bo klasa nigdy nie była zepsuta. Skill cards miały działający retriever, działający store i działający injector — a
chimera/config.py:244mówiskill_cards: bool = Field(default=False, ...), więc na standardowym wdrożeniu nic nigdy nie zostało wstrzyknięte. Każdy test jednostkowy przechodził. Pomiar, który to w końcu wyłapał, policzył skille wybite wobec skilli wstrzykniętych i znalazł 39 wobec zera. -
Sprawdzaj obserwowalną rzecz, która może pojawić się tylko wtedy, gdy komponent został osiągnięty: tekst w wyrenderowanym promptcie, zapisany wiersz, linię logu, kod wyjścia.
-
Sprawdzaj wartość domyślną. Jeśli funkcja jedzie za flagą, dodaj osobny test, który odczytuje wartość domyślną bez żadnych nadpisań i sprawdza, jaka ona jest. Zestaw, który zawsze biegnie z flagą wymuszoną na włączoną, nie powie ci, co dostają użytkownicy.
Unikaj
Ręczne składanie współpracowników, których produkcja okablowuje. Kształtem porażki jest klasa handlera z pełnym pokryciem jednostkowym, której router nigdy nie rejestruje, albo zdolność, której klucz konfiguracji domyślnie jest wyłączony — klasa jest poprawna, testy są poprawne, a funkcja w produkcie nic nie robi. Nic nie jest czerwone, więc nic nie zostaje zbadane, a luka przeżywa, dopóki człowiek nie spróbuje funkcji ręcznie.
Unikaj też fałszowania szwu, który próbujesz pokryć. Patchowanie fabryki albo stubowanie loadera konfiguracji, żeby zwracał obiekt zawierający twój komponent, kasuje dokładnie ten kod, dla którego test istniał:
monkeypatch.setattr(mod, "load_plugins", lambda: [MyPlugin()])
Fałszuj na najbardziej zewnętrznej granicy — kliencie sieciowym, zegarze, wywołaniu LLM — i pozwól, by wszystko między punktem wejścia a twoim komponentem było prawdziwe.
Sprawdź
Usuń okablowanie i uruchom zestaw. Zakomentuj linię rejestracji: dekorator @register, wpis w
słowniku dyspozytorskim, wywołanie include_router(...), wartość domyślną w schemacie konfiguracji.
Potem pytanie zero-jedynkowe: czy jakiś test zrobił się czerwony i czy był to test, który nigdzie nie wymienia twojej klasy z nazwy?
Jeśli zestaw zostaje zielony, twoje pokrycie jest tylko na poziomie klasy, a okablowanie jest
nieprzetestowane. Jeśli jedynym czerwonym testem jest ten, który konstruuje klasę bezpośrednio — ta
sama odpowiedź. Przywróć potem linię i potwierdź zieleń — oraz zrób git diff przed commitem, żeby
usunięta rejestracja nie pojechała dalej.
Ryzyko
Testy z punktu wejścia są wolniejsze, trudniejsze do debugowania i gorzej lokalizują: gdy jeden zawiedzie, wiesz, że funkcja jest zepsuta, ale nie który z dziesięciu komponentów ją zepsuł. To prawdziwy koszt, a złą odpowiedzią na tę kartę jest usunięcie testów jednostkowych na rzecz end-to-end. Zachowaj oba — test okablowania mówi ci, że się zepsuło, test jednostkowy mówi, co.
Przechodzenie przez prawdziwy punkt wejścia może też dotknąć rzeczy, których nie chcesz dotykać w CI: płatnego API, żywej bazy danych, systemu plików poza sandboxem. Jeśli jedynym sposobem dotarcia do punktu wejścia jest wydanie pieniędzy albo zmutowanie produkcji, nie wymuszaj tego; pokryj zamiast tego funkcję składającą bezpośrednio i przyjmij, że jesteś o krok od prawdziwej ścieżki.
A ta karta wyłapuje osiągalność, nie poprawność. Funkcja może być idealnie okablowana do punktu wejścia i wciąż produkować złą odpowiedź, więc zielony test okablowania nie jest licencją na pominięcie sprawdzenia, co wyjście faktycznie mówi.
Jak użyć
Karta to dane. Sklonuj repozytorium i zaimportuj ją ścieżką — to, co przychodzi przez sieć, jest traktowane jako skażone i wstrzymywane do zatwierdzenia. Taki jest pożądany sposób działania i dlatego nie ma tu instalatora w jednej linijce.
git clone https://github.com/brcampidelli/chimera-agent.gitchimera skills-import chimera-agent/skills/chimera-test-the-wiring-not-the-class/SKILL.mdIntegralność
SHA-256 pliku w postaci opublikowanej. Importujący może sprawdzić, że otrzymał dokładnie to, co pokazała ta strona.
564f2b0aaff3bbb51ca9bfa013d89e3d47d92166f498803c688c3b859b378475