จะใช้แอตทริบิวต์ TestCaseSource และ TestOf ในการทดสอบเดียวกันได้อย่างไร

ฉันกำลังพยายามกำหนด การทดสอบแบบพารามิเตอร์ ที่ได้รับข้อมูลโดยใช้ TestCaseSource แอตทริบิวต์ ฉันยังต้องกำหนดแอตทริบิวต์เพื่อเชื่อมโยงการทดสอบแต่ละครั้งกับตั๋ว Jira และตามที่แนะนำ ที่นี่ ฉันใช้แอตทริบิวต์ TestOf ดังนี้:

[TestOf("SomeId")]
[TestCaseSource(typeof(SomeProviderClass), "someMethod")]
public void SampleTest(dynamic myData)
{
    //do something with myData
    //assert something
}

อย่างไรก็ตาม เมื่อดำเนินการทดสอบ ที่ TearDown ขนาดของ TestContext.CurrentContext.Test.Properties ที่ควรมีค่า TestOf จะว่างเปล่า ฉันจะกำหนดแอตทริบิวต์ให้ NUnit รับรู้ได้อย่างไร


person Gabriel Candia    schedule 03.04.2020    source แหล่งที่มา


คำตอบ (1)


เมื่อคุณใช้ TestCaseSource คุณกำลังสร้าง 'ชุด' ของการทดสอบจริงๆ การทดสอบ NUnit มีโครงสร้างเป็นแผนผัง โดยปกติ แอสเซมบลีของคุณจะเป็นรากด้านบนของแผนผัง และแต่ละคลาสภายในนี้จะเป็นแบรนช์ ซึ่งจะแตกแขนงเพื่อรวมวิธีการทดสอบแต่ละรายการทั้งหมด เช่น.

                           -Test1
              - TestClassA -Test2
                           -Test3
TestAssembly  
                           -Test4
              - TestClassB -Test5
                           -Test6             

คุณสามารถดูโครงสร้างนี้ได้หากคุณดูที่ TestResults.xml

เมื่อคุณใช้ TestCaseSource คุณกำลังสร้างอีกระดับหนึ่งบนแผนผัง ตอนนี้ต้นไม้ของคุณมีลักษณะเช่นนี้

                                                -Test1A
                           -TestCaseSourceSuite -Test1B
                                                -Test1C
              - TestClassA -Test2
                           -Test3
TestAssembly  
                           -Test4
              - TestClassB -Test5
                           -Test6             

ในตัวอย่างของคุณ TestCaseSourceSuite จะถูกตั้งชื่อว่า SampleTest เหตุผลที่สิ่งที่คุณมีอยู่ในปัจจุบันใช้งานไม่ได้ก็คือ แอตทริบิวต์ TestOf ใช้กับ TestCaseSourceSuite แทนที่จะเป็น Test1A, Test1B Test1C (คุณสมบัติเช่น TestOf จะไม่คัดลอกขึ้นหรือลงในแผนผังตามลำดับชั้น)


ถึงอย่างไร. เราจะแก้ไขได้อย่างไร? ???? การใช้ TestCaseData สำหรับ TestCaseSource ของคุณดูเหมือนจะเป็นทางออกที่ดีที่สุด TestOfAttribute ไม่ค่อยมีประโยชน์มากนัก ดังนั้นจึงไม่มี 'คุณสมบัติที่มีชื่อ' สำหรับการตั้งค่า แต่คุณสามารถใช้เมธอด SetProperty และคลาส PropertyNames แทนได้ ลองอะไรประมาณนี้ดูบ้าง...

public class MyTests
{
    [TestCaseSource(typeof(MyDataClass), "TestCases")]
    public void Test(int n, int d)
    {
        Assert.IsTrue(true);
    }
}

public class MyDataClass
{
    public static IEnumerable TestCases
    {
        get
        {
            yield return new TestCaseData(12, 3).SetProperty(PropertyNames.TestOf, "MethodUnderTest");
            yield return new TestCaseData(12, 2).SetProperty(PropertyNames.TestOf, "MethodUnderTest");
        }
    }  
}

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

person Chris    schedule 03.04.2020
comment
ขอบคุณสำหรับคำตอบ! ฉันไม่รู้เกี่ยวกับการสร้างระดับอื่นบนแผนผังเมื่อใช้ TestCaseSource ฉันลองวิธีแก้ปัญหาที่คุณเสนอแล้ว อย่างไรก็ตาม มันอาจไม่เหมาะในกรณีของฉัน เนื่องจากบางครั้ง TestCaseData เดียวกันนั้นถูกใช้สำหรับการทดสอบหลายครั้ง เนื่องจากฉันใช้เนื้อหา json เดียวกันเป็นข้อมูลสำหรับการทดสอบ API ที่แตกต่างกัน ตอนนี้ฉันใช้ TestExecutionContext.CurrentContext.CurrentTest.Properties.Set("JiraID", "SomeID"); ในการทดสอบเพื่อกำหนดคุณสมบัติ อย่างไรก็ตาม ฉันไม่แน่ใจว่านี่เป็นแนวทางที่ดี ข้อเสนอแนะอื่น ๆ จะช่วยได้ ขอบคุณ! - person Gabriel Candia; 06.04.2020
comment
ฉันเกรงว่าคุณพูดถูก ว่านี่ไม่ใช่วิธีที่ดีที่สุด API นี้ไม่ได้ตั้งใจที่จะเปิดเผย ดังนั้นอาจจะหายไปในอนาคต! ดูประวัติปัญหานี้ได้ที่: github.com/nunit/nunit/issues/3136 น่าเสียดายที่ยังไม่มีวิธีที่รองรับในการเพิ่มคุณสมบัติการทดสอบขณะรันไทม์ - นั่นคือสิ่งที่เป็นปัญหา #3136 เกี่ยวกับการเพิ่ม แต่อย่างที่คุณเห็นยังไม่มีใครอาสาที่จะทำสิ่งนั้น ในขณะนี้ วิธีเดียวที่ 'สนับสนุน' ในการทำเช่นนี้คือเวลาสร้างการทดสอบดังที่กล่าวมาข้างต้น คุณสามารถกำหนดพารามิเตอร์ TestCaseSources ของคุณในทางใดทางหนึ่งเพื่อแก้ไขปัญหาของคุณหรือไม่? - person Chris; 07.04.2020
comment
ขอบคุณสำหรับความเป็นมาในฉบับนี้ หลังจากวิเคราะห์สิ่งนี้กับทีมของเราแล้ว เราก็สร้างไฟล์การกำหนดค่าแยกต่างหากซึ่งมีรายการสำหรับวิธีทดสอบทุกวิธี และจับคู่ชื่อกับ ID ที่เกี่ยวข้องที่เราคาดว่าจะใช้ใน Jira มีการเข้าถึงไฟล์นั้นเมื่อสิ้นสุดการทดสอบแต่ละครั้งเพื่อรับรหัส เราเลือกสิ่งนั้นเนื่องจากเราคิดว่ามันจะง่ายกว่าที่จะรักษาให้ทันเวลา ซึ่งคล้ายกับสิ่งที่คุณเสนอ ซึ่งจะเป็นตัวเลือกที่ดีหากเราไม่ได้นำข้อมูลกรณีทดสอบกลับมาใช้ใหม่ ขอขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณ! - person Gabriel Candia; 23.04.2020