Saya mencoba untuk menguji unit mesin manajemen host WCF yang telah saya tulis. Mesin pada dasarnya membuat instance ServiceHost dengan cepat berdasarkan konfigurasi. Hal ini memungkinkan kami untuk secara dinamis mengkonfigurasi ulang layanan mana yang tersedia tanpa harus mematikan semuanya dan memulai ulang setiap kali layanan baru ditambahkan atau layanan lama dihapus.
Saya mengalami kesulitan dalam pengujian unit mesin manajemen host ini, bagaimanapun, karena cara kerja ServiceHost. Jika ServiceHost telah dibuat, dibuka, dan belum ditutup untuk titik akhir tertentu, ServiceHost lain untuk titik akhir yang sama tidak dapat dibuat, yang mengakibatkan pengecualian. Karena fakta bahwa platform pengujian unit modern memparalelkan eksekusi pengujian mereka, saya tidak memiliki cara efektif untuk menguji unit kode ini.
Saya telah menggunakan xUnit.NET, berharap karena ekstensibilitasnya, saya dapat menemukan cara untuk memaksanya menjalankan pengujian secara serial. Namun, saya belum beruntung. Saya berharap bahwa seseorang di sini di SO telah mengalami masalah serupa dan tahu cara menjalankan pengujian unit secara serial.
CATATAN: ServiceHost adalah kelas WCF, yang ditulis oleh Microsoft. Saya tidak memiliki kemampuan untuk mengubah perilakunya. Menghosting setiap titik akhir layanan hanya sekali juga merupakan perilaku yang tepat ... namun, ini tidak terlalu kondusif untuk pengujian unit.
sumber
TestServer
di buruh pelabuhan. Jadi saya harus membuat serial tes integrasi.Jawaban:
Setiap kelas pengujian adalah kumpulan pengujian unik dan pengujian di bawahnya akan dijalankan secara berurutan, jadi jika Anda meletakkan semua pengujian Anda dalam koleksi yang sama maka itu akan berjalan secara berurutan.
Di xUnit Anda dapat membuat perubahan berikut untuk mencapai ini:
Berikut ini akan berjalan secara paralel:
Untuk membuatnya berurutan, Anda hanya perlu meletakkan kedua kelas pengujian di bawah koleksi yang sama:
Untuk info lebih lanjut, Anda dapat merujuk ke tautan ini
sumber
Seperti yang dinyatakan di atas, semua unit test yang baik harus 100% terisolasi. Menggunakan status bersama (misalnya bergantung pada
static
properti yang dimodifikasi oleh setiap pengujian) dianggap sebagai praktik yang buruk.Karena itu, pertanyaan Anda tentang menjalankan pengujian xUnit secara berurutan memang memiliki jawabannya! Saya mengalami masalah yang persis sama karena sistem saya menggunakan pencari layanan statis (yang kurang dari ideal).
Secara default xUnit 2.x menjalankan semua tes secara paralel. Ini dapat dimodifikasi per-assembly dengan menentukan
CollectionBehavior
di AssemblyInfo.cs Anda dalam proyek pengujian Anda.Untuk penggunaan pemisahan per rakitan:
atau tanpa paralelisasi sama sekali, gunakan:
Yang terakhir mungkin yang Anda inginkan. Informasi lebih lanjut tentang paralelisasi dan konfigurasi dapat ditemukan di dokumentasi xUnit .
sumber
[assembly: CollectionBehavior(CollectionBehavior.CollectionPerClass, DisableTestParallelization = true)]
. Terima kasih kepada Anda, @Squiggle, saya dapat menjalankan semua pengujian saya dan pergi minum kopi! :)Untuk proyek .NET Core, buat
xunit.runner.json
dengan:Juga, Anda
csproj
harus mengandungUntuk proyek .Net Core lama, Anda
project.json
harus berisisumber
<ItemGroup><None Include="xunit.runner.json" CopyToOutputDirectory="Always" /></ItemGroup>
atau serupa?<ItemGroup> <None Update="xunit.runner.json"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup>
dotnet test --no-build -c Release -- xunit.parallelizeTestCollections=false
tetapi tidak berhasil untuk saya.Untuk proyek .NET Core, Anda dapat mengkonfigurasi xUnit dengan
xunit.runner.json
file, seperti yang didokumentasikan di https://xunit.github.io/docs/configuring-with-json.html .Setelan yang perlu Anda ubah untuk menghentikan eksekusi uji paralel adalah
parallelizeTestCollections
, yang defaultnya adalahtrue
:Jadi minimal
xunit.runner.json
untuk tujuan ini sepertinyaSeperti disebutkan di dokumen, ingatlah untuk menyertakan file ini dalam build Anda, baik dengan:
Menambahkan
untuk Anda
.csproj
file , atauMenambahkan
untuk Anda
project.json
filetergantung pada jenis proyek Anda.
Terakhir, selain di atas, jika Anda menggunakan Visual Studio, pastikan Anda tidak secara tidak sengaja mengklik tombol Run Tests In Parallel , yang akan menyebabkan pengujian berjalan secara paralel meskipun Anda telah menonaktifkan paralelisasi di
xunit.runner.json
. Desainer UI Microsoft dengan cerdik membuat tombol ini tidak berlabel, sulit untuk diperhatikan, dan sekitar satu sentimeter dari tombol "Run All" di Test Explorer, hanya untuk memaksimalkan kemungkinan Anda akan menekannya secara tidak sengaja dan tidak tahu mengapa pengujian Anda tiba-tiba gagal:sumber
xunit.runner.json
file? Dan apa hubungannya menentukanxunit.runner.json
dengan membuat pengujian dijalankan secara serial?Ini pertanyaan lama tetapi saya ingin menulis solusi untuk orang-orang yang mencari baru seperti saya :)
Catatan: Saya menggunakan metode ini dalam tes integrasi Dot Net Core WebUI dengan xunit versi 2.4.1.
Buat kelas kosong bernama NonParallelCollectionDefinitionClass lalu berikan atribut CollectionDefinition ke kelas ini seperti di bawah ini. (Bagian penting adalah DisableParallelization = true setting.)
Setelah itu tambahkan atribut Collection ke kelas yang tidak Anda inginkan berjalan secara paralel seperti di bawah ini. (Bagian yang penting adalah name of collection. Harus sama dengan nama yang digunakan di CollectionDefinition)
Saat kami melakukan ini, pertama-tama pengujian paralel lainnya dijalankan. Setelah itu pengujian lain yang menjalankan atribut Collection ("Non-Parallel Collection").
sumber
Anda dapat Menggunakan Daftar Putar
klik kanan pada metode pengujian -> Tambahkan ke daftar putar -> Daftar putar baru
kemudian Anda dapat menentukan urutan eksekusi, defaultnya adalah, saat Anda menambahkannya ke daftar putar tetapi Anda dapat mengubah file daftar putar sesuai keinginan
sumber
Saya tidak tahu detailnya, tetapi sepertinya Anda mencoba melakukan pengujian integrasi daripada pengujian unit . Jika Anda dapat mengisolasi ketergantungan pada
ServiceHost
, itu kemungkinan akan membuat pengujian Anda lebih mudah (dan lebih cepat). Jadi (misalnya) Anda dapat menguji yang berikut ini secara independen:IServiceHostFactory
danIConfiguration
Alat yang akan membantu mencakup kerangka kerja isolasi (tiruan) dan kerangka kerja kontainer IoC (opsional). Lihat:
sumber
Mungkin Anda bisa menggunakan Pengujian Unit Lanjutan . Ini memungkinkan Anda untuk menentukan urutan Anda menjalankan pengujian . Jadi, Anda mungkin harus membuat file cs baru untuk menghosting pengujian tersebut.
Berikut cara membengkokkan metode pengujian agar berfungsi dalam urutan yang Anda inginkan.
Beri tahu saya apakah ini berhasil.
sumber
Bagi saya, dalam aplikasi .Net Core Console, ketika saya ingin menjalankan metode pengujian (bukan kelas) secara sinkron, satu-satunya solusi yang berhasil adalah yang dijelaskan di blog ini: xUnit: Control the Test Execution Order
sumber
Saya telah menambahkan atribut [Collection ("Sequential")] di kelas dasar:
sumber
Sejauh ini tidak ada jawaban yang disarankan untuk saya. Saya memiliki aplikasi inti dotnet dengan XUnit 2.4.1. Saya mencapai perilaku yang diinginkan dengan solusi dengan menempatkan kunci di setiap pengujian unit sebagai gantinya. Dalam kasus saya, saya tidak peduli tentang urutan berjalan, hanya saja pengujiannya berurutan.
sumber