Pertanyaan ini tentang kerangka pengujian unit xUnit.net .
Saya perlu menjalankan beberapa kode sebelum tes apa pun dijalankan, dan juga beberapa kode setelah semua tes selesai. Saya pikir harus ada semacam atribut atau antarmuka penanda untuk menunjukkan inisialisasi global dan kode penghentian, tetapi tidak dapat menemukannya.
Atau, jika saya menjalankan xUnit secara terprogram, saya juga dapat mencapai apa yang saya inginkan dengan kode berikut:
static void Main()
{
try
{
MyGlobalSetup();
RunAllTests(); // What goes into this method?
}
finally
{
MyGlobalTeardown();
}
}
Adakah yang bisa memberi saya petunjuk tentang cara menjalankan beberapa kode penyiapan / pembongkaran global secara deklaratif atau terprogram?
Jawaban:
Sejauh yang saya tahu, xUnit tidak memiliki titik ekstensi inisialisasi / pembongkaran global. Namun, mudah untuk membuatnya. Buat saja kelas pengujian dasar yang mengimplementasikan
IDisposable
dan melakukan inisialisasi Anda di konstruktor dan pembongkaran Anda dalamIDisposable.Dispose
metode. Ini akan terlihat seperti ini:Namun, penyiapan kelas dasar dan kode pembongkaran akan dijalankan untuk setiap panggilan. Ini mungkin bukan yang Anda inginkan, karena tidak terlalu efisien. Versi yang lebih dioptimalkan akan menggunakan
IClassFixture<T>
antarmuka untuk memastikan bahwa fungsi inisialisasi / pembongkaran global hanya dipanggil sekali. Untuk versi ini, Anda tidak memperluas kelas dasar dari kelas pengujian Anda tetapi mengimplementasikanIClassFixture<T>
antarmuka yangT
merujuk ke kelas fixture Anda:Ini akan mengakibatkan konstruktor
TestsFixture
hanya dijalankan sekali untuk setiap kelas yang diuji. Jadi, itu tergantung pada apa yang Anda ingin pilih di antara kedua metode.sumber
[Collection("<name>")]
atributSaya mencari jawaban yang sama, dan saat ini dokumentasi xUnit sangat membantu dalam hal cara mengimplementasikan Perlengkapan Kelas dan Perlengkapan Koleksi yang memberi pengembang berbagai fungsi penyiapan / pembongkaran di kelas atau kelompok tingkat kelas. Hal ini sejalan dengan jawaban dari Geir Sagberg, dan memberikan implementasi kerangka yang baik untuk menggambarkan seperti apa bentuknya.
https://xunit.github.io/docs/shared-context.html
sumber
Collection
atribut agar penyiapan "global" terjadi. Itu berarti, jika Anda memiliki apa pun yang Anda inginkan sebelum -any- test dijalankan, Anda perlu menghias kelas -all- test dengan atribut ini. Ini terlalu rapuh menurut saya, karena lupa mendekorasi satu kelas pengujian dapat menyebabkan kesalahan yang sulit dilacak. Alangkah baiknya jika xUnit menciptakan cara untuk penyiapan dan pembongkaran yang benar-benar global.Ada solusi mudah yang mudah. Gunakan plugin Fody.ModuleInit
https://github.com/Fody/ModuleInit
Ini adalah paket nuget dan saat Anda menginstalnya, ia menambahkan file baru bernama
ModuleInitializer.cs
ke proyek. Ada satu metode statis di sini yang dianyam ke dalam perakitan setelah dibangun dan dijalankan segera setelah perakitan dimuat dan sebelum sesuatu dijalankan.Saya menggunakan ini untuk membuka kunci lisensi perangkat lunak ke perpustakaan yang telah saya beli. Saya selalu lupa untuk membuka kunci lisensi di setiap tes dan bahkan lupa untuk mendapatkan tes dari kelas dasar yang akan membukanya. Percikan terang yang menulis pustaka ini, alih-alih memberi tahu Anda bahwa lisensinya dikunci, memunculkan kesalahan numerik halus yang menyebabkan pengujian gagal atau lulus padahal seharusnya tidak. Anda tidak akan pernah tahu apakah Anda telah membuka kunci perpustakaan dengan benar atau tidak. Jadi sekarang modul saya init terlihat seperti
dan semua tes yang ditempatkan ke dalam rakitan ini akan memiliki lisensinya dibuka dengan benar untuk mereka.
sumber
Untuk berbagi SetUp / TearDown-code antara beberapa kelas, Anda dapat menggunakan CollectionFixture xUnit .
Mengutip:
sumber