Saat ini saya mempertahankan sistem "lama" yang ditulis dalam C # .net, menghapus beberapa fitur usang dan melakukan beberapa pemfaktoran ulang. Terima kasih Tuhan, orang sebelumnya menulis beberapa tes unit (MSTests). Saya cukup nyaman dengan tes JUnit, tetapi belum melakukan banyak hal dengan MSTests.
Metode pengujian memiliki DeploymentItem
atribut, menentukan file teks yang diurai oleh metode logika bisnis yang sedang diuji dan yang kedua di DeploymentItem
mana hanya jalur yang telah ditentukan berisi sekumpulan file TIF yang harus disebarkan juga.
[TestMethod()]
[DeploymentItem(@"files\valid\valid_entries.txt")]
[DeploymentItem(@"files\tif\")]
public void ExistsTifTest()
{
...
}
Tes bekerja sebelumnya, tetapi sekarang saya harus mengubah nama file TIF yang ada di direktori \ files \ tif. Menurut aturan, nama file TIF harus sesuai dengan pola tertentu yang juga diperiksa olehExistsTifTest()
metode tersebut. Sekarang saya harus mengubah nama file untuk menyesuaikannya dengan persyaratan baru dan tiba-tiba file TIF tidak lagi digunakan seperti sebelumnya.
Dapatkah seseorang memberi saya petunjuk mengapa ini terjadi atau apa yang mungkin menjadi penyebabnya? Hal yang sama terjadi juga jika saya menambahkan file teks baru mengatakan "my2ndTest.txt" di samping "valid_entries.txt" di direktori \ files \ valid \ dengan atribut DeploymentItem yang sesuai pada metode pengujian. File tidak diterapkan?
Sekarang saya mendapatkan gambar yang diterapkan dengan menentukan jalur penerapan langsung di testrunconfig, tetapi saya ingin memahami mengapa hal-hal ini terjadi atau mengapa misalnya file baru saya "my2ndTest.txt" tidak diterapkan sementara yang lain melakukannya.
Jawaban:
DeploymentItem
agak berantakan.Setiap file dalam solusi Anda akan memiliki pengaturan "Salin Ke Folder Output" di VS.NET. Anda memerlukan ini untuk menjadi "Salin Selalu" (atau serupa) untuk memasukkan file ke folder keluaran.
Periksa apakah Anda sudah mendapatkan set ini untuk file baru. Jika Anda tidak memiliki set ini maka file tidak akan disalin ke folder output, dan kemudian mereka tidak dapat digunakan dari folder output ke folder tempat MSTest melakukannya.
Secara pribadi, jika saya memiliki file yang saya perlukan untuk pengujian unit saya, saya telah menemukan bahwa menyematkan file-file itu sebagai sumber daya ke dalam suatu rakitan, dan membuat rakitan itu "membongkar" sendiri selama pengujian adalah cara yang lebih dapat diprediksi dalam melakukan sesuatu. YMMV.
catatan: Komentar ini berdasarkan pengalaman saya dengan VS2010. Komentar atas jawaban saya menunjukkan bahwa ini bukan masalah dengan VS2012. Saya masih mendukung komentar bahwa menggunakan sumber daya tertanam melibatkan lebih sedikit "keajaiban" dan, bagi saya, membuat tahap "mengatur" pengujian unit saya jauh lebih eksplisit.
sumber
Di VS2010, Local.testsettings saya memiliki "Enable Deployment" tidak dicentang dan atribut DeploymentItem tidak berfungsi. Saya memeriksanya dan semuanya bekerja dengan baik. Saya harap ini membantu!
sumber
Saya juga menghadapi masalah serupa tetapi saya menemukan solusi 3 langkah mudah untuk ini:
Dengan asumsi struktur folder Anda terlihat seperti ini:
SolutionFolder\ TestProjectFolder\ SubFolder\
[DeploymentItem(@"TestProjectFolder\SubFolder")]
untuk menyebarkan semua konten<SubFolder>
ke direktori Test Run[DeploymentItem(@"TestProjectFolder\SubFolder", "TargetFolder")]
untuk menerapkan semua konten<SubFolder>
ke<TargetFolder>
dalam direktori Test RunSatu catatan terakhir tentang MSTest (setidaknya untuk VS2010):
Jika Anda ingin
<TargetFolder>
memiliki nama yang sama dengan<SubFolder>
, penggunaan[DeploymentItem(@"SubFolder", @"SubFolder")]
akan gagal secara diam-diam karena pelari MSTest mengenai kasus tepi yang konyol. Inilah mengapa Anda harus mengawali<SubFolder>
dengan<TestProjectFolder>
sebagai:[DeploymentItem(@"TestProjectFolder\SubFolder", @"SubFolder")]
sumber
Untuk semoga membantu orang lain: Saya mencoba semua saran di sini dan tetap saja item penerapan saya tidak disalin.
Yang harus saya lakukan ( seperti yang disarankan di sini ) adalah menambahkan parameter kedua ke atribut DeploymentItem:
sumber
Jika Anda masuk ke file .testrunconfig dan di bawah penerapan, hapus centang "Aktifkan Penerapan", pengujian akan berjalan di lokasi normalnya, dan semuanya akan bekerja seperti saat menjalankan aplikasi di luar pengujian unit.
sumber
Ini mungkin tidak berhubungan dengan masalah Anda sebenarnya, tapi berikut beberapa tip yang saya temukan dengan atribut [DeploymentItem].
Ini TIDAK berfungsi saat digunakan dengan atribut [TestInitialize]
Ini harus ada di [TestMethod] Anda, misalnya
sumber
Setelah mencoba semua saran lain yang tercantum di sini, saya masih tidak tahu apa yang sedang terjadi. Akhirnya saya menemukan bahwa tidak ada file pengaturan yang dipilih di bawah menu Test / Test Settings, yang berarti bahwa Deployment tidak diaktifkan. Saya mengklik item menu Test / Test Settings / Select Test Settings File, memilih file Local.TestSettings, lalu semuanya bekerja.
sumber
Tidak yakin apakah ini benar-benar menjawab pertanyaan, tetapi mungkin membantu beberapa. Pertama, saya menemukan kotak "Aktifkan Penerapan" harus dicentang agar penerapan berfungsi. Kedua, dokter mengatakan bahwa jalur sumber adalah "relatif terhadap jalur proyek" yang pada awalnya saya maksud dengan folder proyek. Sebenarnya, ini sepertinya merujuk ke folder keluaran build. Jadi jika saya memiliki folder proyek bernama 'TestFiles' dan file di dalamnya bernama
Testdata.xml
, menggunakan atribut dengan cara ini tidak berfungsi:Saya dapat menandai
Testdata.xml
file tersebutCopy Always
, sehingga build meletakkan salinan di bawah folder output (misalnya,Debug\TestFiles\TestData.xml
). Mekanisme penerapan kemudian akan menemukan salinan file yang terletak di jalur tersebut (TestFiles\Testdata.xml
) relatif terhadap keluaran build. Atau, saya dapat menyetel atribut dengan cara ini:dan mekanisme penerapan akan menemukan file asli. Jadi baik berfungsi, tetapi saya perhatikan bahwa menggunakan
Copy Always
saya kadang-kadang mengalami masalah yang sama dengan yang saya alami saat mengedit file app.config dalam sebuah proyek - jika saya tidak mengubah kode atau memaksa membangun kembali, tidak ada yang memicu penyalinan file yang ditandai ke disalin di build.sumber
Saya telah menonaktifkan bendera Penerapan terlebih dahulu. Tetapi bahkan setelah saya mengaktifkannya, untuk beberapa alasan yang tidak diketahui bahkan tidak ada DLL target yang akan tetap disalin. Secara tidak sengaja saya membuka jendela Test Run dan mematikan semua proses sebelumnya dan secara ajaib saya menemukan semua DLL dan file yang saya butuhkan di folder pengujian pada proses berikutnya ... Sangat membingungkan.
sumber
Saya mengalami masalah besar saat mencoba mendapatkan file untuk diterapkan - mencoba semua saran di atas.
Kemudian saya menutup VS2010; memulai ulang, memuat solusi dan semuanya bekerja. (!)
Saya melakukan beberapa pemeriksaan; Setelah menyetel tanda 'Enable deployment' di local.TestSetting, Anda tidak boleh hanya menjalankan ulang pengujian dari jendela Test Results. Anda harus menghapus pengujian sebelumnya dari UI, misalnya dengan menjalankan pengujian yang berbeda, atau dengan membuka kembali solusi Anda.
sumber
Jangan gunakan
DeploymentItem
.Sangat sulit untuk mengatur dengan benar dan itu tidak bekerja dengan runner pengujian ReSharper saya maupun yang asli untuk MSTEST di Visual Studio 2017.
Sebaliknya, klik kanan file data Anda, dan pilih properti . Pilih Salin ke direktori keluaran: Selalu .
Sekarang dalam pengujian Anda, lakukan ini. Direktori hanyalah direktori file yang berhubungan dengan proyek uji. Mudah.
Ini tampaknya berfungsi dengan baik dengan sistem build dan pengujian otomatis.
sumber
Karena saya selalu menemukan atribut DeploymentItem berantakan, saya melakukan penerapan file tersebut dengan menggunakan skrip pasca-build. - Pastikan file yang ingin Anda salin memiliki properti Salin Selalu disetel. - Ubah skrip post-build proyek pengujian Anda untuk menyalin file dari folder target build (Bin \ Debug) ke lokasi tempat pengujian Anda mengharapkannya.
sumber
Coba ini untuk VS2010. Jadi Anda tidak perlu menambahkan DeployItems untuk setiap tif
Hapus file
Tambahkan konfigurasi pengujian.
- klik kanan pada node solusi di explorer solusi
- Tambah -> Item Baru ...
- Pilih node Pengaturan Tes di sebelah kiri, pilih item di sebelah kanan
- Klik Tambah
Sebut saja mis
TDD
Pilih di
TDD
bawahTestMenu
>Edit Testsettings
.Klik pada Deployment. Aktifkan dan kemudian Tambahkan file dan direktori yang Anda inginkan. Akan ada jalur relatif ke solusi. File akan disimpan. File aslinya misalnya di sini:
Ketika saya menjalankan pengujian unit saya, itu akan disalin ke
dalam kode tes saya menyebutnya dari:
Tidak perlu memilih Salin Selalu; letakkan file-file tersebut di testproject; tambahkan jalur hardcode di testcode. Bagi saya, solusi ini bekerja paling baik. Saya mencoba dengan DeploymentItem, salin selalu tetapi tidak sesuai dengan keinginan saya.
sumber
Bagi mereka yang lebih suka menghindari kekacauan DeploymentItem dan mengambil pendekatan yang disarankan oleh @Martin Peck (jawaban yang diterima), Anda dapat menggunakan kode berikut untuk mengakses konten sumber daya yang disematkan:
Untuk detailnya, lihat SO Thread ini
sumber
Bagi saya, akar penyebabnya adalah sesuatu yang sama sekali berbeda: Kode produksi yang dijalankan oleh pengujian saya mengganti nama dan / atau menghapus file pengujian .xml yang sedang diterapkan.
Oleh karena itu, ketika saya akan menjalankan pengujian saya satu per satu, mereka akan lulus, tetapi ketika menjalankan semuanya bersama-sama, pengujian kedua dan selanjutnya akan gagal dengan kesalahan "file tidak ditemukan" (yang awalnya saya salah didiagnosis sebagai
DeploymentItem
atribut tidak berfungsi).Solusi saya adalah meminta setiap metode pengujian membuat salinan file yang digunakan (menggunakan teknik ini ), dan kemudian menguji kode produksi menggunakan file yang disalin, bukan yang asli.
sumber
Kami telah menghabiskan banyak waktu dengan masalah Deployment item untuk menyelesaikannya dalam unittest run lokal dan teamcity unittest reun juga. Ini tidak mudah.
Alat yang sangat bagus untuk men-debug masalah ini adalah ProcessExplorer . Menggunakan penjelajah proses, Anda dapat memeriksa di mana Visual Studio mencari item penyebaran dan membuat koreksi pada proyek. Cukup filter semua operasi file di mana path berisi nama file deploymentitem Anda dan Anda akan melihatnya.
sumber
Selain atribut Deployment yang perlu diperiksa, saya menemukan hal lain tentang atribut DeploymentItem.
DeploymentFile.txt Anda harus relatif terhadap file solusi dan bukan testfile.cs.
sumber
[DeploymentItem(@"FilesForTests\MyFile.txt", "FilesForTests")]
. Saya pikir kita mengatakan hal yang sama?Saya telah mengerjakan ini di VS2013. Temuan saya untuk membuat ini berfungsi:
Sebuah tip saya juga belajar dengan cara yang sulit: jangan lupa untuk menambahkan atribut ini ke tes masing-masing individu. File menyalin pada pengujian yang dikaitkan pertama dalam testrun, tetapi tetap hilang ketika urutan pengujian berubah dan pengujian tanpa atribut mencoba menemukan file tersebut terlebih dahulu.
sumber
"Gotcha" besar saya adalah cara DeploymentItem menangani direktori. Saya menggunakan versi dua parameter dengan keduanya sebagai jalur direktori yang berisi subdirektori yang ingin saya terapkan. Awalnya saya tidak menyadari bahwa itu hanya menyalin barang-barang di ROOT direktori dan bukan seluruh struktur folder rekursif!
Saya pada dasarnya memiliki [DeploymentItem (@ "Foo \", @ "Foo \")] dan mengharapkannya untuk menerapkan Foo \ Bar saya. Saya secara khusus harus mengubahnya menjadi [DeploymentItem (@ "Foo \ Bar \", @ "Foo \ Bar \")] dan sekarang berfungsi seperti pesona.
sumber
Saya juga menghadapi masalah serupa. Saya memiliki semua langkah yang disebutkan di atas tetapi masih belum berhasil. Saya menggunakan VS2010. Kemudian saya menemukan bahwa $ Menu> Test> Select Active Test Setting> Trace and Test impact telah dipilih. Ini mulai berfungsi setelah saya mengubah Jejak dan uji dampak ke Lokal . Halaman ini berisi informasi yang sangat berguna tentang menyalin file ke folder hasil tes, saya merasa ingin menambahkan pengalaman ini juga.
sumber