Testarea cu date într-un pipeline
Fereastra este pentru explorat. Asta este cealaltă jumătate: un build de linie de comandă de circa 2,4 MB, fără runtime de instalat, al cărui cod de ieșire este verdictul de acoperire, nu cel al țintei.
Codul de ieșire este verdictul
Aceasta este decizia de proiectare care face instrumentul scriptabil. Când se încheie o sesiune, codul de ieșire răspunde la „a avut efect înlocuirea timpului”, nu la „ce a returnat aplicația”. Un pipeline poate deci să pice din cauza unei înlocuiri care nu s-a petrecut în tăcere - adică eșecul pentru care merită să pice, pentru că tot ce urmează după el este un test care nu a dovedit nimic.
Codul de ieșire al țintei este raportat în continuare, în datele sesiunii.
| Cod | Semnificație |
|---|---|
| 0 | funcționează - fiecare proces care a citit ora a văzut ceasul sesiunii |
| 10 | funcționează parțial - unele canale acoperite, altele nu |
| 11 | nu funcționează - înlocuirea nu a ajuns la canalele cheie |
| 4 | nedeterminat - acoperirea nu a putut fi stabilită |
| 1 | eroare de utilizare - un flag greșit sau o expresie greșită |
| 2 | ținta nu a putut fi lansată sau injectată |
| 12 | ținta a dispărut, ceea ce sugerează o aplicație cu o singură instanță |
| 3 | eroare internă - motorul nu a putut porni, a întâlnit o stare neașteptată sau s-a oprit înainte să închidă sesiunea (indiferent de codul de ieșire al țintei). O astfel de rulare nu are verdict |
| 5 | operațiunea nu este inclusă în această versiune |
| 6 | rularea a fost întreruptă - --timeout a expirat sau motorul a încetat să răspundă timp de 15 secunde și a fost oprit. Nu este un verdict: sesiunea a fost întreruptă, deci nu dovedește nimic despre țintă, într-un sens sau altul |
| 7 | rulează deja o altă sesiune - o singură sesiune odată. Ajunge să încercați din nou după ce se încheie |
| 8 | sesiunea a ajuns la un verdict, dar dovezile ei nu sunt în fișierul indicat de --report - discul era plin sau alt program ținea deschis fișierul vechi, care rămâne atunci neschimbat. Verdictul rămâne în raportul afișat de comandă |
Fiecare flag al ambelor comenzi, plus același tabel pentru calculator, se găsesc în referința liniei de comandă.
Rulări cu limită
Un pipeline nu poate aștepta ca un om să închidă o aplicație desktop.
--ticks N încheie sesiunea după N bătăi de inimă - câte o secundă reală fiecare - și
raportează ce a găsit până în acel moment. Acoperirea se stabilește oricum în primele clipe ale
procesului, așa că de obicei este suficientă o limită scurtă.
# Zece secunde, apoi oprește-te și raportează chrono run ".\build\test.exe" --preset year-rollover --ticks 10 --report evidence.txt
Ieșire pentru mașini și dovezi
--jsonemite sesiunea sub formă de înregistrări care se pot citi automat, în loc de raportul pentru oameni - aceleași fapte, inclusiv acoperirea pe fiecare canal.--report <path>scrie raportul pentru oameni într-un fișier, care face un artefact de build potrivit. O sesiune al cărei verdict este altul decât funcționează începe fișierul cu un banner de dovezi nesigure, în loc să îngroape avertismentul la sfârșit.- Calculatorul vorbește și el
--json, așa că un pipeline poate calcula data de care are nevoie și o poate trimite înapoi.
# Calculează data, apoi rulează la ea chrono calc --base today --snap eom --json chrono run ".\build\test.exe" --preset month-end --ticks 10 --json
Un pas, cam așa
- name: Month-end behaviour
shell: pwsh
run: |
.\chrono.exe run ".\build\test.exe" --preset month-end --ticks 10 --report evidence.txt
# un cod de ieșire diferit de zero aici înseamnă că înlocuirea nu a prins, deci
# testul de după ea nu ar fi dovedit nimic
- name: Keep the evidence
uses: actions/upload-artifact@v7
with:
name: chrono-evidence
path: evidence.txt
Două avertismente sincere despre runner-e
- Are nevoie de un runner Windows. Nu există build pentru Linux sau macOS și nici nu va exista - pe Linux, libfaketime acoperă deja acest caz.
- Antivirusul de pe un runner găzduit poate bloca injecția. Mutarea timpului înseamnă injectarea unei biblioteci în procesul țintă, o tehnică Windows documentată pe care o folosește și malware-ul. Un runner care o blochează produce un cod de ieșire care spune asta, în loc de o trecere falsă - dar este ceva ce merită aflat înainte să te bazezi pe el.
Din același motiv, suita end-to-end a acestui proiect rulează pe mașini reale, nu pe un runner găzduit. Integrarea continuă a proiectului compilează și testează unitar totul, iar înlocuirea propriu-zisă este exersată manual pe aplicații reale, atât în build-uri pe 32 de biți, cât și pe 64 de biți, înainte de fiecare versiune.