ھل ﯾﻣﮐن ﺗﺣﺳﯾن اﺧﺗﺑﺎرات وﺣدات ﻧﻣط اﺧﺗﺑﺎر اﻻﺧﺗﺑﺎر ﻟﺗﺗﺑﻊ ﻣﻣﺎرﺳﺎت ﺗﺻﻣﯾم TDD اﻟﺟﯾد؟

هل يمكن تحسين القدرة التالية على اتباع ممارسات تصميم TDD الجيدة (التسمية ، استخدام rowtests ، تصميم الفئات) في أي من أطر عمل .NET TDD/BDD؟

أيضا ، هل هناك طريقة أفضل في أي من أطر العمل التي لديها rowtests حيث يمكنني الحصول على توقعات فردية لكل صف ، مثلما أفعل ذلك في هذا المثال (NUnit)؟

النظام الخاضع للاختبار هنا هو فئة القيد التي يمكن أن تحتوي على نطاقات متعددة من الأعداد الصحيحة الصالحة. اختبار اختبار NarrowDown الطريقة التي يمكن أن تجعل النطاقات صالحة أصغر استناداً إلى قيد آخر.

[TestFixture]
internal class ConstraintTests
{
    [Test]
    public void NarrowDown_Works()
    {
        RowTest_NarrowDown(
            new Range[] { new Range(0, 10), new Range(20, 30), new Range(40, 50) },
            new Range[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) },
            new Range[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) });

        RowTest_NarrowDown(
            new Range[] { new Range(0, 10), new Range(20, 30), new Range(40, 50), new Range(60, 70) },
            new Range[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) },
            new Range[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) });

        RowTest_NarrowDown(
            new Range[] { new Range(0, 10), new Range(20, 30), new Range(40, 50) },
            new Range[] { new Range(1, 9), new Range(21, 29), new Range(41, 49), new Range(60, 70) });
    }

    private static void RowTest_NarrowDown(IEnumerable sut, IEnumerable context)
    {
        Constraint constraint = new Constraint(sut);
        Constraint result = constraint.NarrowDown(new Constraint(context));
        Assert.That(result, Is.Null);
    }

    private static void RowTest_NarrowDown(IEnumerable sut, IEnumerable context, IEnumerable expected)
    {
        Constraint constraint = new Constraint(sut);
        Constraint result = constraint.NarrowDown(new Constraint(context));
        Assert.That(result, Is.Not.Null);
        Assert.That(result.Bounds, Is.EquivalentTo(expected));
    }
}
1
يجب أن تكون كل مجموعة من المدخلات اختبارًا مستقلًا. إذا كان منطق الاختبارات المتعددة متطابقًا بين المدخلات والمخرجات ، فاستخدم "الاختبارات المعتبرة". يستخدم NUnit سمات أو طريقة توفر مجموعات الإدخال المختلفة إلى اختبار ذو معلمات. يتم تنفيذ/إعداد كل مجموعة كحالة اختبار مختلفة بواسطة عداء الاختبار.
وأضاف المؤلف Gishu, مصدر

2 إجابة

أولاً ، يمكنك تحسين اسم اختبار الوحدة NarrowDown_Works غامض للغاية ، ولا يمكنني معرفة ما هو المفترض أن يقوم به الاختبار.

لديك الكثير من التأكيدات الجارية والكثير من البيانات ، لا أستطيع أن أقول ما هو مهم. حاول الخروج من الاختبار إلى اختبارات أصغر وسيكون من الأسهل تسميتها أيضًا. استخدم ، إن أمكن ، تأكيدًا واحدًا لكل اختبار .

يعد بناء بيانات الاختبار أمرًا معقدًا للغاية ، فكّر في استخدام أدوات التطابق مثل NHamcrest لتقليل كمية بيانات التأكيد التي تحتاج إليها بدلاً من استخدام Is.EquivalentTo .

يمكنك أيضًا استخدام أداة بناء أو مصنع لإنشاء جعل التهيئة أبسط للفئة القيد أبسط بدلاً من المرور في صف نطاقات .

2
وأضاف
+1 للإشارة إلى NHamcrest
وأضاف المؤلف bitbonk, مصدر

يجب عليك استخدام طريقة تعتمد على البيانات مع مصانع البيانات (في NUnit-speak ، وهي تسمى مصادر حالة الاختبار ). هذا يجعل اختباراتك أكثر سهولة في القراءة والفهم والتعديل والمحافظة (أو ، بشكل أعم ، أكثر نظافة):

[TestFixture]
internal class ConstraintTests
{
    static object[] TwoRanges = 
    {
        new object[]
            {
                new[] { new Range(0, 10), new Range(20, 30), new Range(40, 50) },
                new[] { new Range(1, 9), new Range(21, 29), new Range(41, 49), new Range(60, 70) }
            }
    };

    static object[] ThreeRanges = 
    {
        new object[]
            {
                new[] { new Range(0, 10), new Range(20, 30), new Range(40, 50) },
                new[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) },
                new[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) }
            },
        new object[]
            {
                new[] { new Range(0, 10), new Range(20, 30), new Range(40, 50), new Range(60, 70) },
                new[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) },
                new[] { new Range(1, 9), new Range(21, 29), new Range(41, 49) }
            }
    };

    [Test, TestCaseSource("TwoRanges")]
    public void NarrowDown_WhenCalledWithTwoRanges_GivesTheExpectedResult(IEnumerable sut, IEnumerable context)
    {
        Constraint constraint = new Constraint(sut);
        Constraint result = constraint.NarrowDown(new Constraint(context));
        Assert.That(result, Is.Null);
    }

    [Test, TestCaseSource("ThreeRanges")]
    public void NarrowDown_WhenCalledWithThreeRanges_GivesTheExpectedResult(IEnumerable sut, IEnumerable context, IEnumerable expected)
    {
        Constraint constraint = new Constraint(sut);
        Constraint result = constraint.NarrowDown(new Constraint(context));
        Assert.That(result, Is.Not.Null);
        Assert.That(result.Bounds, Is.EquivalentTo(expected));
    }
}

ترى كم أبسط طرق الاختبار الخاصة بك أصبحت الآن؟ أيضا ، هذا سيجعل كل مجموعة من البيانات من مصدر حالة الاختبار الأصلي تعمل في اختبار منفصل ، لذا لن يفشل كل شيء فقط لأن مجموعة واحدة من البيانات تتسبب في فشل. تذكر: يجب أن يؤكد الاختبار على شيء واحد فقط.

HTH!

0
وأضاف