ฉันจะรับ“ Copy to Output Directory” เพื่อทำงานกับ Unit Tests ได้อย่างไร?


123

เมื่อฉันสร้างโครงการทดสอบหน่วยก่อนที่จะดำเนินการทดสอบผลลัพธ์การทดสอบจะถูกคัดลอกไปยังโฟลเดอร์ TestResults จากนั้นการทดสอบจะดำเนินการ ปัญหาที่ฉันพบคือไม่ใช่ทุกไฟล์ในไดเร็กทอรี Debug / bin ที่ถูกคัดลอกไปยังโปรเจ็กต์ TestResults

ฉันจะรับไฟล์ที่คัดลอกไปยังไดเร็กทอรี Debug / bin เพื่อคัดลอกไปยังโฟลเดอร์ TestResults ได้อย่างไร

คำตอบ:


121

วิธีมาตรฐานในการดำเนินการนี้คือการระบุรายการการปรับใช้ใน.testrunconfigไฟล์ซึ่งสามารถเข้าถึงได้ผ่านทางรายการEdit Test Run Configurationsในเมนู Visual Studio Testหรือในโฟลเดอร์รายการโซลูชัน


15
ใน VS2010 นี่คือ: Test / Edit Test Settings / local จากนั้นในรายการให้เลือก "Deployment" เลือกช่อง "Enable ... " และเพิ่มไฟล์
Marcel

18
คุณอาจต้องปิดโซลูชันของคุณ (หรือแม้แต่ Visual Studio) และเปิดใหม่ก่อนที่การเปลี่ยนแปลงนี้จะมีผลอย่างถูกต้อง
RobV

RobV คุณทำให้วันของฉัน ขอขอบคุณ!
Ignacio Soler Garcia

2
หากคุณใช้แอตทริบิวต์ [DeploymentItem] ในโค้ดคุณไม่จำเป็นต้องระบุไฟล์ในกล่องโต้ตอบโปรดดูโค้ดของ @ tomfanning ด้านล่าง
Patrick Szalapski

สิ่งนี้ไม่ช่วยแก้ปัญหาของฉันในการคัดลอกเอาต์พุตการกำหนดค่าจาก bin หรือโฟลเดอร์รีลีสเพราะในเวลาออกแบบฉันไม่มีข้อมูลว่าไฟล์จะอยู่ในโฟลเดอร์ดีบักหรือรีลีสหรือไม่และสำหรับฉันนั่นคือไฟล์ที่ไม่ได้รับการคัดลอก โฟลเดอร์ Out ในผลการทดสอบ
Gurpreet

61

คุณสามารถระบุแอตทริบิวต์การปรับใช้เช่นตัวอย่างที่แสดงด้านล่าง นอกจากนี้คุณต้องตั้งค่าคุณสมบัติ "เนื้อหา" และ "คัดลอกหากใหม่กว่า" (ไม่มีเอกสารประกอบเกี่ยวกับการตั้งค่าในภายหลัง แต่คุณได้ตั้งค่าคุณสมบัติเหล่านั้นเพื่อให้ใช้งานได้

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



}

3
คุณยังต้องเปิดใช้งานสิ่งนี้ ตามที่ Mercel เขียนไว้ในความคิดเห็นของเขาใน VS2010 นี่คือ: ทดสอบ / แก้ไขการตั้งค่าการทดสอบ / ท้องถิ่นจากนั้นในรายการเลือก "การปรับใช้" เลือกช่อง "เปิดใช้งาน ... "
Patrick Szalapski

ฉันกำลังดิ้นรนกับปัญหานี้ใน Visual Studio 2012 Express และเนื่องจากเป็นรุ่นที่ จำกัด จึงหาเอกสารที่ชัดเจนได้ยาก ขอบคุณมากสำหรับคำตอบนี้
DavidHyogo

2
ใช้งานได้ดี ฉันคิดว่านี่เป็นวิธีการและคำตอบที่ดีกว่าเนื่องจากมีการบันทึกไฟล์ที่ต้องการไว้เหนือวิธีการทดสอบ
bu5hm4nn

1
ฉันพบว่าแอตทริบิวต์ DeploymentItem ยังใช้งานได้เมื่อระบุที่ระดับคลาสทดสอบ(แทนที่จะเป็นระดับวิธีการ)
Jon Schneider

10

ฉันต้องเปิด "เปิดใช้งานการทำให้ใช้งานได้" ภายใต้Test -> Edit Test Settings -> Local -> Deploymentเพื่อให้[DeploymentItem]แอตทริบิวต์ทำงาน


นี่เป็นเรื่องจริง ... ฉันเพิ่งเปิดใช้งานและตอนนี้แอตทริบิวต์ใช้งานได้ ขอบคุณ!
Miguel Angelo

ดังที่ได้กล่าวไว้ในความคิดเห็นของฉันสำหรับคำตอบอื่นฉันกำลังดิ้นรนกับปัญหาเดียวกันใน visual studio 2012 express และในที่สุดคำตอบทั้ง 2 ก็ให้คำตอบแก่ฉัน
DavidHyogo

5

คำตอบทั้งสามถูกต้องขึ้นอยู่กับความต้องการของคุณ

การเพิ่มไฟล์เพื่อปรับใช้ใน. testrunconfig (.testsettings ใน VS2010) จะคัดลอกไฟล์เหล่านั้นทั้งหมดไปยังโฟลเดอร์ผลลัพธ์การทดสอบทุกไฟล์แม้กระทั่งสำหรับการทดสอบที่ไม่เกี่ยวข้องจะทำงานแยกกัน หากคุณเรียกใช้การทดสอบหนึ่งครั้งไฟล์ข้อมูลทดสอบทั้งหมดที่แสดงรายการในส่วนการปรับใช้ของ. testssettings จะถูกคัดลอกไปยังโฟลเดอร์ผลลัพธ์การทดสอบ

ในการทดสอบของฉันฉันต้องคัดลอกไฟล์ XML ที่คาดไว้ไปยังโฟลเดอร์ผลลัพธ์การทดสอบเพื่อเปรียบเทียบกับ XML ผลลัพธ์การทดสอบจริง ฉันใช้แอตทริบิวต์ DeploymentItem เพื่อคัดลอกเฉพาะไฟล์ XML ที่เกี่ยวข้องกับการทดสอบที่กำลังรัน ใน VS2010 ฉันต้องเปิดใช้งานการปรับใช้ในไฟล์. testettings (แต่ไม่ได้เพิ่มพา ธ ใด ๆ ) จากนั้นอ้างอิงเส้นทางไฟล์ XML ที่สัมพันธ์กับ TestProject ใน DeploymentItem

หวังว่านี่จะช่วยได้


2
ปัญหาของฉันคือ Relative Path ที่กล่าวถึงที่นี่ฉันคิดว่า Xml ควรอยู่ในไดเร็กทอรีที่มีการทดสอบอยู่ แต่จำเป็นต้องอยู่ในรูทโปรเจ็กต์หรือนำหน้าโดยไดเร็กทอรีที่อยู่ในนั้น
Wes Grant

2

ฉันมีปัญหาที่คล้ายกัน แต่ต้องทำโดยชี้ไปที่ไฟล์ TraceAndTestImpact.testsettings แทนไฟล์ Local.testsettings คุณสามารถเปลี่ยนจากที่หนึ่งไปเป็นอีกเมนูหนึ่งภายใต้เมนูการทดสอบ / เลือกการตั้งค่าการทดสอบที่ใช้งานอยู่


2

ต้องการเพียงแค่ปรับปรุงคำตอบที่ยอมรับโดยการกล่าวถึงวิธีที่จะทำให้มันปรับใช้โดยเฉพาะสำหรับ dll แทนที่จะเป็นวิธีการปกติในการใช้ข้อมูลหรือ config เป็นต้นสำหรับสถานการณ์ที่ CopyLocal ไม่ทำงาน:

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

1

ต่อไปนี้ใช้งานได้ใน VS2012 สำหรับโครงการทดสอบที่รวมอยู่ในหลายโซลูชันโดยไม่ต้องใช้ไฟล์ testsettings:

1) จัดเรียงไฟล์และโฟลเดอร์ที่คุณต้องการปรับใช้ลงในโฟลเดอร์ในไดเร็กทอรีโครงการทดสอบ

2) ในคุณสมบัติโครงการสร้างขั้นตอนการสร้างโพสต์

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

$(ProjectDir)และ$(TargetDir)เป็นมาโครที่ VS จะตีความและควรรวมไว้ด้วยเช่นกัน

<Project_Folder_Name> คือชื่อของโฟลเดอร์ที่สร้างในขั้นตอนที่ 1

<Deployment_Folder_Name><Project_Name>_TestInputsเป็นชื่อของโฟลเดอร์ที่ไฟล์ทดสอบจะนำไปใช้และควรจะตั้งชื่อให้ว่ามันจะไม่ซ้ำกันเมื่อโครงการทดสอบหลายนำไปใช้กับไดเรกทอรีเดียวกันเช่น

ไฟล์ทดสอบในตำแหน่งที่ใช้ร่วมกันควรถูกคัดลอกไปยังโฟลเดอร์การปรับใช้ไดเร็กทอรีเป้าหมายเพื่อ จำกัด การโต้ตอบการทดสอบ ระบุเส้นทางต้นทางที่สัมพันธ์กับ$(ProjectDir)แมโคร ตัวอย่างเช่น"$(ProjectDir)..\..\Common Files\C1219TDL-2008.xml".

3) เพิ่ม[DeploymentItem(source, destination)]คุณสมบัติให้กับวิธีการทดสอบแต่ละวิธีที่ใช้ไฟล์การปรับใช้ (แนวทางปฏิบัติที่ดีที่สุด) หรือในคลาสทดสอบ (วิธีปฏิบัติที่ง่ายกว่าสำหรับคนขี้เกียจหรือรีบร้อนและวิธีที่ง่ายที่สุดในการอัปเดตโปรเจ็กต์เส้นทางสัมพัทธ์ที่ใช้ก่อนหน้านี้หรือไฟล์การตั้งค่าการทดสอบ )

บนวิธีการทดสอบsourceคือพา ธ ไปยังไฟล์หรือไดเร็กทอรีที่ใช้ในวิธีการทดสอบที่สัมพันธ์กับไดเร็กทอรีเป้าหมายที่สร้างโดยxcopyและdestinationเป็นพา ธ ไปยังไดเร็กทอรีที่จะสร้างขึ้นโดยสัมพันธ์กับไดเร็กทอรีการปรับใช้ เพื่อให้การทดสอบทำงานสอดคล้องกันทั้งในไดเร็กทอรีเป้าหมายหรือไดเร็กทอรีการปรับใช้ เส้นทางปลายทางควรเหมือนกับเส้นทางต้นทางที่ไม่มีการอ้างอิงไฟล์ ตัวอย่าง: [DeploymentItem("Example_TestInputs\C1219TDL-2008.xml","Example_TestInputs")]. DeploymentItemควรจะรวมอยู่กับวิธีการที่ใช้แฟ้มหรือไดเรกทอรีว่าทุก

บนคลาสsourceและdestinationเป็นทั้งชื่อของโฟลเดอร์ที่สร้างขึ้นในไดเร็กทอรีเป้าหมายโดยxcopy; สิ่งนี้จะคัดลอกโฟลเดอร์ทั้งหมดไปยังไดเร็กทอรีการปรับใช้เมื่อมีการเรียกใช้การทดสอบในคลาส ตัวอย่าง:[DeploymentItem("Example_TestInputs","Example_TestInputs")]

4) ในวิธีการทดสอบตอนนี้คุณสามารถเข้าถึงไฟล์และไดเรกทอรีที่มีความเชื่อมั่นว่าพวกเขาจะอยู่ในไดเรกทอรีการทำงานโดยไม่คำนึงถึงที่ Visual Studio File.Exists(".\Example_TestInputs\C1219TDL-2008.xml")ได้ตัดสินใจที่จะนำมาใส่ในวันนั้นเช่น


0

ลองใช้บรรทัดคำสั่งหลังสร้างเหตุการณ์จากภายใน Visual Studio (ถ้าคุณใช้ IDE นั้น)


3
ฉันเป็น แต่ดูเหมือนจะแฮ็คนิดหน่อย นี่จะต้องเป็นสถานการณ์ที่พบได้บ่อยและฉันหวังว่าจะมีเพียงตัวเลือกหรือคุณสมบัติบางอย่างที่ฉันตั้งค่าไม่ถูกต้อง
Eric Schoonover


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";
}

0

คำตอบที่ยอมรับนั้นถูกต้องและส่วนใหญ่เป็นคำตอบอื่น ๆ อย่างไรก็ตามในช่วงหลายปีที่ผ่านมาฉันพบว่าระบบ Deploment ของ Visual Studio Unit Tests โดยใช้DeploymentAttribtueและCopy to Outputนั้นยุ่งยากหากคุณมีไฟล์ข้อมูลจำนวนมาก ฉันพบว่าการเก็บไฟล์ไว้ในตำแหน่งเดิมทำได้ดีกว่า

รายละเอียดทั้งหมดในคำตอบอื่น ๆ ของฉันที่นี่ https://stackoverflow.com/a/53004985/2989655

หวังว่านี่จะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.