Bagaimana saya bisa mendapatkan "Salin ke Direktori Output" untuk bekerja dengan Tes Unit?

123

Ketika saya membangun proyek pengujian unit sebelum pengujian dijalankan, output pengujian disalin ke folder TestResults dan kemudian pengujian dijalankan. Masalah yang saya alami adalah tidak semua file di direktori Debug / bin disalin ke proyek TestResults.

Bagaimana saya bisa mendapatkan file yang disalin ke direktori Debug / bin untuk juga disalin ke folder TestResults?

Eric Schoonover
sumber

Jawaban:

121

Cara standar untuk melakukannya adalah dengan menentukan item penyebaran di .testrunconfigfile, yang dapat diakses melalui item Edit Konfigurasi Proses Uji di menu Uji Visual Studio atau di folder Item Solusi .

Mark Cidade
sumber
15
Di VS2010 ini adalah: Test / Edit Test Setting / local, lalu dalam daftar, pilih "Deployment", centang kotak "Enable ..." dan tambahkan file.
Marcel
18
Anda mungkin harus menutup solusi Anda (atau bahkan Visual Studio) dan membuka kembali sebelum perubahan ini berlaku dengan benar
RobV
RobV, Anda membuat hari saya menyenangkan. TERIMA KASIH!
Ignacio Soler Garcia
2
Jika Anda menggunakan atribut [DeploymentItem] dalam kode, Anda tidak perlu menentukan file dalam dialog - lihat kode @ tomfanning di bawah ini.
Patrick Szalapski
Ini tidak menyelesaikan masalah saya dengan menyalin output konfigurasi dari folder bin atau rilis karena pada waktu desain saya tidak memiliki informasi tentang apakah file tersebut akan berada di folder debug atau rilis dan bagi saya itu adalah file yang tidak disalin ke folder Keluar dalam hasil tes
Gurpreet
61

Anda dapat menentukan atribut penerapan seperti contoh yang ditunjukkan di bawah ini; Anda juga perlu menyetel properti "Konten" & "Salin jika lebih baru" (tidak ada dokumentasi pada setelan selanjutnya, tetapi Anda telah menyetelnya untuk membuatnya berfungsi.

[TestMethod]
[DeploymentItem("mytestdata.xml")]
public void UploadTest()
{



}
Sanjay10
sumber
3
Anda masih perlu mengaktifkan ini. Seperti yang ditulis Mercel dalam komentarnya, Di VS2010 ini adalah: Test / Edit Test Settings / local, lalu dalam daftar, pilih "Deployment", centang kotak "Enable ...".
Patrick Szalapski
Saya berjuang dengan masalah ini di Visual Studio 2012 Express dan karena ini adalah edisi terbatas, sulit untuk menemukan dokumentasi yang jelas. Terima kasih banyak atas jawaban ini.
DavidHyogo
2
Bekerja dengan baik. Saya sebenarnya berpikir ini adalah metode & jawaban yang lebih baik karena mendokumentasikan file yang diperlukan tepat di atas metode pengujian.
bu5hm4nn
1
Saya menemukan bahwa atribut DeploymentItem juga berfungsi ketika ditentukan di tingkat kelas pengujian (bukan tingkat metode).
Jon Schneider
10

Saya harus mengaktifkan "Aktifkan Penerapan" di bawah Test -> Edit Test Settings -> Local -> Deploymentagar [DeploymentItem]atribut berfungsi.

tomfanning
sumber
Ini benar ... Saya baru saja mengaktifkannya dan sekarang atributnya berfungsi. Terima kasih!
Miguel Angelo
Seperti yang disebutkan dalam komentar saya untuk jawaban lain, saya berjuang dengan masalah yang sama di studio visual 2012 express dan 2 jawaban bersama akhirnya memberi saya solusi.
DavidHyogo
5

Ketiga jawaban tersebut benar, tergantung kebutuhan Anda.

Menambahkan file untuk diterapkan di .testrunconfig (.testsettings di VS2010) akan menyalin semua file tersebut ke setiap folder keluaran pengujian, bahkan untuk pengujian yang tidak terkait yang dijalankan secara terpisah. Jika Anda menjalankan satu pengujian, semua file data pengujian yang tercantum di bagian penerapan .testssettings akan disalin ke folder keluaran pengujian.

Dalam pengujian saya, saya perlu menyalin file XML yang diharapkan ke folder keluaran pengujian untuk dibandingkan dengan XML keluaran pengujian yang sebenarnya. Saya menggunakan atribut DeploymentItem untuk hanya menyalin file XML yang terkait dengan tes yang sedang dijalankan. Di VS2010 saya harus mengaktifkan penerapan di file .testsettings (tetapi tidak menambahkan jalur apa pun) dan kemudian merujuk jalur file XML yang terkait dengan TestProject di DeploymentItem.

Semoga ini membantu.

GraehamF
sumber
2
Masalah saya adalah Relative Path yang disebutkan di sini, saya pikir Xml harus ada di direktori tempat pengujian berada, tetapi harus berada di root proyek, atau diawali oleh direktori tempat itu berada.
Wes Grant
2

Saya memiliki masalah yang sama tetapi masalah saya berkaitan dengan menunjuk ke file TraceAndTestImpact.testsettings alih-alih file Local.testsettings. Anda dapat mengubah dari satu ke yang lain di bawah menu Test / Select Active Test Settings.

Simon
sumber
2

Hanya ingin meningkatkan jawaban yang diterima dengan menyebutkan cara untuk membuatnya diterapkan secara khusus untuk dll daripada metode normal menggunakannya untuk data atau konfigurasi dll, untuk keadaan di mana CopyLocal tidak berfungsi:

[DeploymentItem("bin\\release\\iRock.dll")]
[DeploymentItem("bin\\debug\\iRock.dll")]
JamesDill
sumber
1

Pekerjaan berikut di VS2012 untuk proyek pengujian yang disertakan dalam beberapa solusi tanpa menggunakan file setelan pengujian:

1) Atur file dan folder yang ingin Anda terapkan ke dalam folder di direktori proyek pengujian.

2) Di properti proyek, buat langkah pembuatan pos

xcopy /Y /S /i "$(ProjectDir)<Project_Folder_Name>\*" "$(TargetDir)<Deployment_Folder_Name>"

$(ProjectDir)dan $(TargetDir)merupakan makro yang akan ditafsirkan oleh VS dan harus dimasukkan seperti itu.

<Project_Folder_Name> adalah nama folder yang dibuat pada langkah 1.

<Deployment_Folder_Name>adalah nama folder tempat file pengujian akan disebarkan dan harus dinamai sedemikian rupa sehingga akan menjadi unik saat beberapa proyek pengujian diterapkan ke direktori yang sama, misalnya <Project_Name>_TestInputs.

File pengujian di lokasi bersama juga harus disalin ke folder penerapan direktori target untuk membatasi interaksi pengujian. Berikan jalur sumber yang terkait dengan $(ProjectDir)makro. Misalnya "$(ProjectDir)..\..\Common Files\C1219TDL-2008.xml".

3) Tambahkan [DeploymentItem(source, destination)]properti ke setiap metode pengujian yang menggunakan file penerapan (praktik terbaik) atau ke kelas pengujian (praktik yang lebih mudah bagi yang malas atau terburu-buru, dan cara termudah untuk memperbarui proyek jalur relatif yang sebelumnya digunakan atau file setelan pengujian ).

Pada metode pengujian, sourceadalah jalur ke file atau direktori yang digunakan dalam metode pengujian relatif terhadap direktori target seperti yang dibuat oleh xcopydan destinationmerupakan jalur ke direktori yang akan dibuat relatif terhadap direktori penerapan. Agar pengujian berjalan konsisten baik di direktori target atau di direktori penerapan. Jalur tujuan harus sama dengan jalur sumber tanpa referensi file. Contoh: [DeploymentItem("Example_TestInputs\C1219TDL-2008.xml","Example_TestInputs")]. Ini DeploymentItemharus disertakan pada setiap metode yang menggunakan file atau direktori tersebut.

Di kelas, sourcedan destinationkeduanya adalah nama folder yang dibuat di direktori target oleh xcopy; ini akan menyalin seluruh folder ke direktori penerapan ketika tes apa pun di kelas dijalankan. Contoh:[DeploymentItem("Example_TestInputs","Example_TestInputs")]

4) Dalam metode pengujian, Anda sekarang dapat mengakses file dan direktori dengan keyakinan bahwa mereka akan berada di direktori kerja di mana pun Visual Studio memutuskan untuk meletakkannya hari itu, misalnya File.Exists(".\Example_TestInputs\C1219TDL-2008.xml").

Richard Morris
sumber
0

Coba baris perintah acara Pasca Bangun dari dalam Visual Studio (jika Anda menggunakan IDE itu).

Kasper
sumber
3
Ya, tapi sepertinya itu sedikit retakan. Ini harus menjadi skenario yang cukup umum dan saya harap hanya ada beberapa opsi atau properti yang tidak saya tetapkan dengan benar.
Eric Schoonover
0

Dalam Visual Studio 2012 Anda tidak memerlukan atribut DeploymentItem untuk kasus sederhana. Lihat jawaban saya di sini

acarlon.dll
sumber
0
[TestMethod]
[DeploymentItem("ProjectName/Folder/SubFolder/file.xml", "Folder/Subfolder")]
public void YourTestMethod()
{
   // in the method you are testing you should have this:
   var filePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase) + "/Folder/Subfolder/file.xml";
}
Nina
sumber
0

Jawaban yang diterima benar dan begitu juga sebagian besar jawaban lainnya. Namun, selama bertahun-tahun saya telah menemukan bahwa sistem Deploment dari Tes Unit Visual Studio menggunakan DeploymentAttribtue dan Salin ke Output menjadi rumit jika Anda memiliki sejumlah besar file data. Saya telah menemukan bahwa menyimpan file di lokasi aslinya bekerja lebih baik.

Detail lengkapnya ada di jawaban saya yang lain di sini. https://stackoverflow.com/a/53004985/2989655

Semoga ini membantu.

Sau001
sumber