เป็นไปได้ไหมที่จะรันโค้ดหนึ่งครั้งก่อนการทดสอบทั้งหมดจะทำงาน


112

โดยทั่วไปฉันต้องการบอกให้ MSTest รันโค้ดเล็กน้อยก่อนที่จะเปิดตัวในชุดการทดสอบโดยพื้นฐานแล้วสิ่งที่ฉันต้องการจะทำคือสิ่งเดียวกับการติดโค้ดใน Main()ในการดำเนินการบิตของรหัสก่อนที่จะเปิดเป็นชุดของการทดสอบวิ่งเป็นหลักสิ่งที่ฉันต้องการจะทำคือสิ่งเดียวกับที่ติดรหัสบางอย่างใน

เหตุผลที่ฉันต้องการทำเช่นนี้คือฉันต้องการทำการบันทึกด้วย log4net ในระหว่างการทดสอบการรวมระบบของฉัน ฉันไม่สามารถเพียงแค่ใช้แอตทริบิวต์การชุมนุมตั้งแต่ตามเวลาที่มันอ่านมันในการทดสอบของฉันการชุมนุมจะได้เรียกแล้วlog4net.Config.XmlConfigurator LoggerManagerเอกสารนี้แนะนำให้กำหนดค่า log4net อย่างชัดเจนที่จุดป้อนรหัส - แต่ในการทดสอบของฉันอยู่ที่ไหน

ฉันต้องสามารถทำการทดสอบใน TestDriven.NET และ MSTest runner ได้

คำตอบ:


153

FWIW คุณสามารถใช้แอตทริบิวต์AssemblyInitializeเพื่อรันโค้ดก่อนการทดสอบหน่วยทั้งหมดในแอสเซมบลีดำเนินการ:

[TestClass]
public class SetupAssemblyInitializer
{
    [AssemblyInitialize]
    public static void AssemblyInit(TestContext context)
    {
        // Initalization code goes here
    }
}

หากคุณมีชุดทดสอบมากกว่าหนึ่งชุดฉันไม่ทราบว่ามีชุดประกอบมากกว่าหนึ่งชุด

เท่าที่ฉันทราบมันใกล้มากที่สุดเท่าที่คุณจะเทียบเท่ากับ Main ได้

โปรดสังเกตว่าAssemblyInitializeเมธอด -decorated ต้องอยู่ในTestClassคลาส -decorated ซึ่งมีอย่างน้อยหนึ่งTestMethod-decorated method มิฉะนั้นจะไม่ถูกเรียกใช้งาน!


1
ฉันมีปัญหาที่คล้ายกัน (สำหรับ MSTest เท่านั้น) และทำงานได้ดี ขอบคุณ :)
Oscar Foley

1
สำหรับใครก็ตามที่มีปัญหาในการทำงานนี้จากทั้ง MsTest และ TestDriven.NET คุณสามารถใช้แฟล็กแบบคงที่เพื่อกำหนดว่าจะรันโค้ดใน ClassInitialize หรือไม่ (ซึ่งใช้ไม่ได้ใน MsTest)
Carl

7
หมายเหตุ: เอ็นจินการทดสอบจะรันเมธอดที่ทำเครื่องหมายด้วยแอ็ตทริบิวต์ AssemblyInitialize ก็ต่อเมื่อเมธอดนั้นเป็นสมาชิกของคลาสที่ถูกทำเครื่องหมายด้วยแอ็ตทริบิวต์ TestClass
Jowen

5
@Jowen: ทดสอบเครื่องยนต์ทำงานวิธีการที่ถูกทำเครื่องหมายด้วยแอตทริบิวต์ AssemblyInitialize เฉพาะในกรณีที่วิธีการที่เป็นสมาชิกของชั้นเรียนที่ถูกทำเครื่องหมายกับ TestClass and contains methods that are marked with the TestMethod attributeแอตทริบิวต์
ถึง

3
วิธีการที่มีเครื่องหมาย AssemblyInitialize จะทำงานใน Visual Studio 2015 Ultimate โดยไม่มีวิธีการอื่นที่ทำเครื่องหมายด้วยแอตทริบิวต์ TestMethod
คริส

63

เพื่อให้เสร็จสมบูรณ์นี่คือตัวเลือก "รันโค้ดก่อนหน้า" สำหรับ MSTest:

  • ใช้[AssemblyInitialize]เพื่อรันโค้ดหนึ่งครั้งต่อแอสเซมบลีก่อนการทดสอบในแอสเซมบลีนั้นจะรัน
  • ใช้[ClassInitialize]เพื่อรันโค้ดหนึ่งครั้งต่อคลาสก่อนการทดสอบในคลาสที่กำหนดเมธอด
  • ใช้[TestInitialize]เพื่อรันโค้ดก่อนการทดสอบแต่ละครั้งในคลาสที่กำหนดวิธีการ

12
คู่ล้างของแอตทริบิวต์เหล่านี้คือคำต่อท้าย Cleanup (เช่น ClassCleanup) สำหรับการดำเนินการแบบฉีก
Yair Nevet

13

ฉันเห็นสิ่งนี้ในส่วนหัวของ MS Test

// Use ClassInitialize to run code before running the first test in the class
//[ClassInitialize()]
//public static void MyClassInitialize(TestContext testContext) { }

สิ่งนี้จะทำงานก่อนการทดสอบในชั้นเรียนเดียว

ดูเหมือนว่าคุณต้องการเรียกใช้บางอย่างก่อนการทดสอบทั้งหมด

นอกจากนี้ยังมีตัวเลือกสคริปต์การตั้งค่าในการกำหนดค่าการทดสอบการทำงาน


สคริปต์การตั้งค่าไม่ได้ช่วยในการรันโค้ดใน AppDomain ทดสอบเว้นแต่ฉันจะหายไป
George Mauer

2
คงเป็นฉันสินะ ฉันไม่แน่ใจว่าฉันติดตามคุณเมื่อคุณพูดว่า "กำลังเรียกใช้โค้ดในการทดสอบ AppDomain" ฉันอ่านคำถามของคุณว่าต้องการรันโค้ดก่อนชุดการทดสอบถ้าเป็นอย่างอื่นที่แตกต่างออกไป "สคริปต์การตั้งค่าและสคริปต์การล้างข้อมูลจะทำงานก่อนและหลังการทดสอบโดยไม่คำนึงถึงประเภทของการทดสอบที่อยู่ในการทดสอบเหล่านั้น" msdn.microsoft.com/en-us/library/ms182480%28VS.80%29.aspx
Maestro1024
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.