Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Panduan pengujian plugin
Penulis plugin menulis dan menguji plugin Lua sepenuhnya di Lua - tidak diperlukan rantai alat Go. Pengujian ditempatkan bersama dengan plugin di bawah init_test.lua dan dijalankan melalui inspector-sbomgen plugin test perintah.
Untuk penulisan plugin umum, lihat. Panduan pengembang plugin Untuk katalog fungsi lengkap (termasuk testing.* API), lihatReferensi API Plugin.
-- init_test.lua (next to init.lua) function test_discovers_curl_version() local result = testing.scan_directory("_testdata/include/curl") testing.assert_equals(1, #result.findings) testing.assert_equals("libcurl", result.findings[1].name) testing.assert_equals("8.14.1", result.findings[1].version) end
# Run every test under a plugin directory inspector-sbomgen plugin test --path ./my-plugins # Verbose output — show each test name and result inspector-sbomgen plugin test --path ./my-plugins -v
Mulai Cepat
1. Buat file pengujian
Tempatkan di init_test.lua sebelah plugin Andainit.lua:
my-plugin/ ├── discovery/cross-platform/extra-ecosystems/curl/ │ ├── init.lua │ ├── init_test.lua │ └── _testdata/ │ └── include/curl/curlver.h
2. Tulis fungsi uji
Setiap fungsi global yang dimulai dengan test_ ditemukan dan dijalankan:
function test_finds_libcurl() local result = testing.scan_directory("_testdata/include/curl") testing.assert_equals(1, #result.findings) testing.assert_equals("libcurl", result.findings[1].name) end function test_no_findings_for_empty_dir() local result = testing.scan_directory("_testdata/empty") testing.assert_equals(0, #result.findings) end
3. Jalankan tes
inspector-sbomgen plugin test --path ./my-plugin
Tata Letak Direktori
Struktur plugin
File uji dan data uji ditempatkan bersama dengan plugin:
my-plugins/ ├── discovery/ │ └── cross-platform/ │ └── extra-ecosystems/ │ └── curl/ │ ├── init.lua # plugin source │ ├── init_test.lua # test file │ └── _testdata/ # test fixtures │ ├── include/curl/curlver.h │ └── binaries/unix/curl ├── collection/ │ └── cross-platform/ │ └── extra-ecosystems/ │ └── curl-installation/ │ ├── init.lua │ └── init_test.lua
Uji penamaan file
-
Default: di
init_test.luasebelah plugininit.lua -
Beberapa file uji per plugin: pencocokan
*_test.luafile apa pun ditemukan -
Contoh:
init_test.lua,parsing_test.lua,discovery_test.lua
Data uji: _testdata/
Data uji tinggal di _testdata/ sebelah plugin. Garis bawah utama adalah konvensi yang membuat perlengkapan terpisah secara visual dari sumber plugin; plugin test perintah tidak turun ke _testdata/ saat mencari *_test.lua file, sehingga perlengkapan tidak pernah disalahartikan sebagai file uji.
Perlengkapan referensi file uji dengan jalur relatif:
local result = testing.scan_directory("_testdata/include/curl")
Jalur diselesaikan relatif terhadap direktori yang berisi file uji.
testing.*API
Fungsi Pindai
Setiap fungsi pemindaian membuat artefak, menjalankan pipeline discovery → collection plugin, dan mengembalikan temuan. Penulis pengujian tidak pernah secara manual membuat artefak, bus acara, atau pendaftar.
-- Scan a directory of test fixtures (most common) local result = testing.scan_directory("_testdata/curl") -- Alias for scan_directory (archives use the same backend) local result = testing.scan_archive("_testdata/app.tar.gz") -- Scan as a localhost artifact local result = testing.scan_localhost("_testdata/curl") -- Scan a compiled binary local result = testing.scan_binary("_testdata/binaries/curl") -- Scan a mounted volume local result = testing.scan_volume("_testdata/volume-root") -- Scan a container image tarball local result = testing.scan_container("_testdata/images/alpine.tar")
Setiap fungsi pemindaian:
-
Membuat artefak baru untuk setiap panggilan (tidak ada kebocoran status di antara panggilan)
-
Hanya memuat pasangan koleksi discovery + plugin saat ini
-
Mengembalikan tabel hasil
Tabel Hasil
result.findings -- array of finding tables result.findings[1].name -- package name (string) result.findings[1].version -- package version (string) result.findings[1].purl -- package URL (string) result.findings[1].component_type -- component type (string) result.findings[1].properties -- table<string, string> result.findings[1].children -- array of nested finding tables (same shape)
Pernyataan
-- Equality testing.assert_equals(expected, actual, message?) testing.assert_not_equals(expected, actual, message?) -- Truthiness testing.assert_true(value, message?) testing.assert_false(value, message?) -- Nil checks testing.assert_nil(value, message?) testing.assert_not_nil(value, message?) -- String testing.assert_contains(haystack, needle, message?) testing.assert_matches(string, pattern, message?) -- Tables testing.assert_length(table, expected_length, message?) -- Control flow testing.fail(message) -- immediately fail the current test testing.skip(message) -- skip the current test (not a failure)
sbomgen.*API standar
sbomgen.*API lengkap (file I/O, regex, info sistem, logging, dll.) Tersedia dalam file pengujian, sama seperti di plugin produksi. Namun, sbomgen.* fungsi yang memerlukan artefak (misalnya,sbomgen.read_file()) hanya berfungsi di dalam testing.scan_* panggilan balik — fungsi tersebut tidak tersedia di tingkat atas fungsi pengujian.
Menjalankan Tes
# Run all tests under a plugin directory inspector-sbomgen plugin test --path ./my-plugins # Filter by regex pattern inspector-sbomgen plugin test --path ./my-plugins --run curl # Verbose output (show each test name and result) inspector-sbomgen plugin test --path ./my-plugins -v # Stop on the first failing test inspector-sbomgen plugin test --path ./my-plugins --fail-fast
--pathBendera menerima direktori root plugin (berisi discovery/ and/or collection/) atau direktori ekosistem tunggal (terdeteksi otomatis). Perintah keluar bukan nol jika ada tes yang gagal.
Format output
Dengan-v, setiap tes mencetak === RUN garis dan garis hasil (--- PASS,--- FAIL, atau--- SKIP). Tanpa-v, hanya tes yang gagal dicetak. Baris ringkasan dicetak di bagian akhir:
=== RUN curl/discovery/init_test/test_discovers_libcurl_header --- PASS: curl/discovery/init_test/test_discovers_libcurl_header (0.04s) === RUN curl/discovery/init_test/test_discovers_curl_binary_unix --- PASS: curl/discovery/init_test/test_discovers_curl_binary_unix (0.04s) === RUN curl/discovery/init_test/test_no_findings_for_unrelated_files --- PASS: curl/discovery/init_test/test_no_findings_for_unrelated_files (0.04s) ok 3 tests passed
Pembantu Plugin Pengujian
File pengujian dimuat ke Lua VM yang sama dengan plugin. init.lua Fungsi global yang didefinisikan dalam plugin dapat dipanggil dari pengujian. Untuk menguji fungsi pembantu, paparkan mereka sebagai global atau dalam tabel modul:
-- init.lua M = {} function M.parse_version(raw) return string.match(raw, "(%d+%.%d+%.%d+)") end function collect(file_path) local ver = M.parse_version(...) -- ... end
-- init_test.lua function test_parse_version_extracts_semver() testing.assert_equals("1.2.3", M.parse_version("curl/1.2.3")) end function test_parse_version_returns_nil_for_garbage() testing.assert_nil(M.parse_version("not-a-version")) end
Fungsi yang local init.lua dideklarasikan tidak terlihat oleh file uji. Ini adalah pelingkupan Lua standar.
Perilaku dan Invarian
VM bersama, status bersama
Fungsi uji dalam satu file berbagi VM Lua. Variabel global yang ditetapkan dalam satu test_* fungsi terlihat oleh fungsi selanjutnya. Jika dua fungsi mendefinisikan global yang sama, yang kedua menimpa yang pertama. Setiap tes harus mandiri dan tidak bergantung pada keadaan dari tes lain.
Perintah eksekusi non-deterministik
Fungsi pengujian ditemukan dengan mengulangi tabel global Lua, yang menggunakan pemesanan berbasis hash. Pengujian tidak dijamin berjalan sesuai urutan yang ditentukan. Jangan menulis tes yang bergantung pada perintah eksekusi.
Artefak segar per panggilan pemindaian
Setiap panggilan ke testing.scan_directory() (atau fungsi pemindaian apa pun) menciptakan artefak yang sama sekali baru. Tidak ada status yang dilakukan antara pemindaian panggilan dalam tes atau di seluruh tes.
Pemuatan plugin
Plugin dimuat sekali per uji coba, tidak sekali per file pengujian. Pelari uji memuat semua plugin dari sistem file yang disediakan, lalu mencocokkan setiap file pengujian dengan plugin VM yang sesuai berdasarkan fase, platform, kategori, dan ekosistem.
Perilaku penegasan
Ketika pernyataan gagal, kegagalan dicatat tetapi fungsi pengujian terus mengeksekusi — pernyataan dan pernyataan berikutnya masih berjalan. Jika lebih dari satu pernyataan gagal dalam tes yang sama, kegagalan terbaru adalah pesan yang dilaporkan dalam ringkasan; kegagalan sebelumnya ditimpa. Untuk menghentikan pengujian pada kegagalan pertamanya, kembali dari fungsi setelah pernyataan gagal (atau gunakan testing.fail() di dalam kondisional).
Batasan
-
localfungsi tidak dapat diuji. Hanya fungsi global dariinit.luayang terlihat ke file pengujian. Paparkan pembantu melalui tabel modul jika mereka membutuhkan pengujian. -
Tidak ada
sbomgen.*file I/O di luar panggilan pemindaian. Fungsi sepertisbomgen.read_file()memerlukan konteks artefak, yang hanya ada di dalamtesting.scan_*panggilan. -
Tidak ada kait siklus hidup. Tidak ada
before_each,after_each,setup, atauteardown. Setiap fungsi pengujian mengelola statusnya sendiri. -
Tidak ada batas waktu tes. Fungsi pengujian yang loop selamanya akan menggantung pelari.
-
Tidak ada pelaporan cakupan. Tidak ada cara untuk mengukur garis mana
init.luayang dilakukan. -
Tidak ada tolok ukur. Kerangka pengujian tidak mendukung tolok ukur kinerja.
Tanggung Jawab Pengembang
Saat menulis plugin Lua baru
-
Buat
init_test.luadi sebelah Andainit.lua -
Buat
_testdata/dengan perlengkapan minimal yang menggunakan logika plugin Anda -
Menulis
test_*fungsi yang mencakup: deteksi berhasil, ekstraksi versi, kasus tepi, dan skenario tanpa kecocokan -
Jalankan pengujian secara lokal sebelum mengirimkan
Pedoman data uji
-
Pertahankan perlengkapan minimal - gunakan file terkecil yang menjalankan perilaku
-
Hindari melakukan binari besar
_testdata/ketika perlengkapan teks kecil sudah cukup -
Setiap plugin
_testdata/harus mandiri - tidak ada referensi ke file di luar direktori plugin