Chrono Mock
BahasaBahasa Indonesia

Pengujian tanggal dalam pipeline

Jendela untuk menjelajah. Ini adalah separuh lainnya: build baris perintah sekitar 2,4 MB tanpa runtime yang perlu dipasang, yang kode keluarnya adalah putusan cakupan, bukan kode keluar target.

Kode keluar adalah putusan

Inilah keputusan desain yang membuat alat ini dapat diskrip. Ketika sesi berakhir, kode keluar menjawab “apakah penggantian waktu berlaku”, bukan “apa yang dikembalikan aplikasi”. Sebuah pipeline karenanya dapat gagal pada penggantian yang diam-diam tidak terjadi - itulah kegagalan yang layak membuat gagal, karena semua yang datang sesudahnya adalah pengujian yang tidak membuktikan apa pun.

Kode keluar target sendiri tetap dilaporkan, dalam data sesi.

KodeArti
0berhasil - setiap proses yang membaca waktu melihat jam sesi
10berhasil sebagian - sebagian kanal tercakup, sebagian tidak
11tidak berhasil - penggantian tidak sampai ke kanal-kanal kunci
4tidak dapat ditentukan - cakupan tidak dapat dipastikan
1kesalahan penggunaan - flag yang salah atau ekspresi yang salah
2target tidak dapat diluncurkan atau disuntik
12target menghilang, yang menunjukkan aplikasi satu-instans
3kesalahan internal - engine tidak dapat dimulai, menemui keadaan tak terduga, atau berhenti sebelum menutup sesi (apa pun kode keluarnya sendiri). Eksekusi seperti itu tidak membawa putusan
5operasi tidak disertakan dalam rilis ini
6eksekusi terpotong - --timeout habis, atau engine berhenti merespons selama 15 detik dan dihentikan. Ini bukan putusan: sesi terputus, sehingga tidak membuktikan apa pun tentang target ke arah mana pun
7sesi lain sudah berjalan - hanya satu sesi dalam satu waktu. Cukup coba lagi setelah sesi itu selesai
8sesi sudah mencapai putusan, tetapi buktinya tidak ada di file yang disebut --report - disk penuh, atau program lain membuka file lama itu, yang kemudian tetap seperti semula. Putusan tetap ada di laporan yang dicetak perintah

Setiap flag dari kedua perintah, dan tabel yang sama untuk kalkulator, ada di referensi baris perintah.

Eksekusi terbatas

Sebuah pipeline tidak dapat menunggu manusia menutup aplikasi desktop. --ticks N mengakhiri sesi setelah N detak - masing-masing satu detik nyata - dan melaporkan apa yang ditemukan sampai saat itu. Cakupan toh ditentukan pada saat-saat awal proses, jadi batas yang singkat biasanya sudah cukup.

# Sepuluh detik, lalu berhenti dan laporkan
chrono run ".\build\test.exe" --preset year-rollover --ticks 10 --report evidence.txt

Keluaran mesin dan bukti

  • --json mengeluarkan sesi sebagai rekaman yang dapat dibaca mesin, bukan laporan untuk manusia - fakta yang sama, termasuk cakupan per kanal.
  • --report <path> menulis laporan untuk manusia ke file, yang cocok sebagai artefak build. Sesi yang putusannya selain berhasil membuka file itu dengan banner bukti tidak andal, bukan mengubur peringatan di bagian bawah.
  • Kalkulator juga berbicara --json, sehingga pipeline dapat menghitung tanggal yang dibutuhkannya lalu memasukkannya kembali.
# Hitung tanggalnya, lalu jalankan pada tanggal itu
chrono calc --base today --snap eom --json
chrono run ".\build\test.exe" --preset month-end --ticks 10 --json

Sebuah langkah, kira-kira

- name: Month-end behaviour
  shell: pwsh
  run: |
    .\chrono.exe run ".\build\test.exe" --preset month-end --ticks 10 --report evidence.txt
    # kode keluar bukan nol di sini berarti penggantian waktu tidak berlaku, sehingga
    # pengujian di bawahnya tidak akan membuktikan apa pun

- name: Keep the evidence
  uses: actions/upload-artifact@v7
  with:
    name: chrono-evidence
    path: evidence.txt

Dua catatan jujur tentang runner

  • Membutuhkan runner Windows. Tidak ada build Linux atau macOS, dan tidak akan ada - di Linux, libfaketime sudah menangani hal ini.
  • Antivirus pada runner yang di-host dapat memblokir injeksi. Menggeser waktu berarti menyuntikkan pustaka ke proses target, yang merupakan teknik Windows terdokumentasi yang juga dipakai malware. Runner yang memblokirnya menghasilkan kode keluar yang menyatakan hal itu, bukan kelulusan palsu - tetapi ini hal yang perlu diketahui sebelum Anda bergantung padanya.

Karena alasan yang sama, rangkaian pengujian end-to-end proyek ini berjalan di mesin sungguhan, bukan di runner yang di-host. Integrasi berkelanjutannya membangun dan menguji unit semuanya, sedangkan penggantian waktunya sendiri diuji secara manual pada aplikasi nyata, pada build 32-bit maupun 64-bit, sebelum setiap rilis.

Cobalah