سؤال

ما هي أفضل الممارسات تسمية وحدة اختبار دروس و طرق الاختبار ؟

وقد نوقش هذا على ذلك من قبل ، ما هي بعض شعبية اصطلاحات التسمية على وحدة الاختبارات ؟

أنا لا أعرف إذا كان هذا هو نهج جيد جدا, ولكن حاليا في بلدي التجارب المشاريع ، أنا واحد-إلى-واحد تعيينات بين كل فئة و فئة الاختبار مثلا Product و ProductTest.

في اختبار الطبقات ثم قد الأساليب مع أسماء أساليب أختبر, تسطير, ثم الوضع و ما أتوقع أن يحدث ، على سبيل المثال Save_ShouldThrowExceptionWithNullName().

هل كانت مفيدة؟

المحلول

أحب روي Osherove تسمية استراتيجية, إنه التالية:

[UnitOfWork_StateUnderTest_Expectedbehavior]

كان لديه كل المعلومات اللازمة على طريقة اسم و بطريقة منظمة.

وحدة العمل يمكن أن تكون صغيرة مثل طريقة واحدة ، فئة أو كبيرة متعددة الطبقات.ينبغي أن تمثل كل الأشياء التي سيتم اختبارها في هذا الاختبار الحالة تحت السيطرة.

على الجمعيات استخدام نموذجي .Tests المنتهية ، والتي أعتقد على نطاق واسع جدا و نفس الطبقات (تنتهي Tests):

[NameOfTheClassUnderTestTests]

في السابق كنت تستخدم اساسيا كما لاحقة بدلا من الاختبارات ولكن أعتقد أن هذا الأخير هو أكثر شيوعا ، ثم غيرت التسمية الاستراتيجية.

نصائح أخرى

أحب أن اتبع "ينبغي" تسمية معيار الاختبارات في حين تسمية المباراة اختبار بعد الوحدة تحت الاختبار (أيالطبقة).

لتوضيح (باستخدام C# و NUnit):

[TestFixture]
public class BankAccountTests
{
  [Test]
  public void Should_Increase_Balance_When_Deposit_Is_Made()
  {
     var bankAccount = new BankAccount();
     bankAccount.Deposit(100);
     Assert.That(bankAccount.Balance, Is.EqualTo(100));
  }
}

لماذا "ينبغي"?

أجد أن قوات اختبار الكتاب اسم الاختبار مع الجملة على غرار "أن [يكون في بعض الدولة] [بعد/قبل/عندما] [تجري]"

نعم الكتابة "ينبغي" في كل مكان لا تحصل المتكررة قليلا, ولكن كما قلت انها قوات الكتاب إلى التفكير في الطريق الصحيح (لذا يمكن أن تكون جيدة بالنسبة للمستخدمين المبتدئين).بالإضافة إلى أنه يؤدي عادة في قراءة اللغة الإنجليزية اسم الاختبار.

التحديث:

لقد لاحظت أن جيمي Bogard هو أيضا من محبي 'ينبغي' و حتى وحدة اختبار مكتبة تسمى يجب أن.

تحديث (4 سنوات)

للراغبين, توجهي إلى تسمية الاختبارات تطورت على مر السنين.واحدة من القضايا مع يجب أن نمط أصف أعلاه ليس من السهل أن تعرف في لمحة الأسلوب الذي هو تحت الاختبار.بالنسبة OOP أعتقد أنه من المنطقي أن تبدأ الاختبار اسم مع أسلوب تحت الاختبار.بالنسبة مصممة بشكل جيد فئة هذا ينبغي أن يؤدي للقراءة طريقة الاختبار الأسماء.أنا الآن استخدام صيغة مشابهة <method>_Should<expected>_When<condition>.من الواضح اعتمادا على السياق قد ترغب في استبدال ينبغي/عندما الأفعال عن شيء أكثر ملاءمة.على سبيل المثال:Deposit_ShouldIncreaseBalance_WhenGivenPositiveValue()

أنا أحب هذه التسمية على غرار:

OrdersShouldBeCreated();
OrdersWithNoProductsShouldFail();

وهلم جرا.يجعل الحقيقة واضحة إلى عدم تستر ما هي المشكلة.

كينت بيك يشير إلى:

  • اختبار واحد اساسيا في "الوحدة" (الدرجة من البرنامج).اختبار تركيبات الطبقات نفسها.الاختبار اساسيا يجب أن يكون اسم:

    [name of your 'unit']Tests
    
  • حالات الاختبار (الاختبار اساسيا طرق) أسماء مثل:

    test[feature being tested]
    

على سبيل المثال ، وجود فئة التالية:

class Person {
    int calculateAge() { ... }

    // other methods and properties
}

اختبارا اساسيا ليكون:

class PersonTests {

    testAgeCalculationWithNoBirthDate() { ... }

    // or

    testCalculateAge() { ... }
}

أسماء فئة.اختبار اساسيا أسماء أجد أن "الاختبار" هو أمر شائع جدا في كل مكان لغة العديد من المجالات.على سبيل المثال ، في مجال الهندسة: StressTest, و في مستحضرات التجميل المجال: SkinTest.آسف أن نختلف مع كينت ، ولكن باستخدام "اختبار" في اختبار تركيبات (StressTestTest?) هو مربكة.

"الوحدة" كما يستخدم في الكثير من المجالات.E. g. MeasurementUnit.هي فئة تسمى MeasurementUnitTest اختبار "القياس" أو "MeasurementUnit"?

ولذلك أود أن استخدام "سؤال وجواب" بادئة لكل اختبار الطبقات.E. g. QaSkinTest و QaMeasurementUnit.انها ليست ابدا في الخلط مع كائنات المجال ، باستخدام بادئة بدلا من لاحقة يعني أن كل اختبار تركيبات العيش معا بصريا (مفيدة إذا كان لديك مزيفة أو غيرها دروس دعم في اختبار المشروع)

مساحات.أنا أعمل في C# و أحافظ على اختبار الفئات في مساحة الاسم نفسه مثل الفئة هم الاختبار.هو أكثر ملاءمة من وجود اختبار منفصل مساحات الأسماء.طبعا الاختبار فصول في مشروع مختلف.

طريقة الاختبار أسماء.أحب أن أسمي أساليب WhenXXX_ExpectYYY.يجعل مسبق واضحة ويساعد الآلي الوثائق (a la TestDox).هذا هو مماثل المشورة على جوجل اختبار بلوق, ولكن مع مزيد من الفصل بين الشروط المسبقة والتوقعات.على سبيل المثال:

WhenDivisorIsNonZero_ExpectDivisionResult
WhenDivisorIsZero_ExpectError
WhenInventoryIsBelowOrderQty_ExpectBackOrder
WhenInventoryIsAboveOrderQty_ExpectReducedInventory

يمكنني استخدام بالنظر إلى حين ثم مفهوم.نلقي نظرة على هذه المقالة القصيرة http://cakebaker.42dh.com/2009/05/28/given-when-then/.المادة يصف هذا المفهوم من حيث BDD, ولكن يمكنك استخدامه في TDD وكذلك دون أي تغيير.

انظر:http://googletesting.blogspot.com/2007/02/tott-naming-unit-tests-responsibly.html

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

أعتقد أن واحدة من أهم الأمور هو أن يتفق في اصطلاح تسمية (و توافق ذلك مع أعضاء آخرين من فريق العمل الخاص بك).إلى مرات عديدة أرى الكثير من الاتفاقيات المختلفة المستخدمة في المشروع نفسه.

كنت مؤخرا قد جاء في أعقاب اتفاقية تسمية بلدي التجارب ، الطبقات التي تحتوي على المشاريع من أجل زيادة descriptivenes:

دعونا نقول أنا اختبار الإعدادات الدرجة في المشروع في اسم التطبيق.التسلسل مساحة الاسم.

أولا أنا سوف إنشاء اختبار المشروع مع اسم التطبيق.التسلسل.الاختبارات مساحة الاسم.

ضمن هذا المشروع و بالطبع مساحة الاسم سوف أقوم بإنشاء فئة تسمى IfSettings (حفظ IfSettings.cs).

دعونا نقول أنا اختبار SaveStrings() الأسلوب.-> أنا سوف اسم الاختبار CanSaveStrings().

عند تشغيل هذا الاختبار وسوف تظهر العنوان التالي:

اسم التطبيق.التسلسل.اختبارات.IfSettings.CanSaveStrings

أعتقد أن هذا يحكي معي بشكل جيد جدا ، ما هو اختبار.

بالطبع هي مفيدة في اللغة الإنجليزية اسم "اختبارات" هو نفس الفعل "الاختبارات".

لا يوجد حد إبداعك في تسمية الاختبارات ، بحيث نحصل على كامل الجملة العناوين بالنسبة لهم.

عادة Testnames يجب أن تبدأ مع الفعل.

ومن أمثلة ذلك:

  • يكتشف (مثلا ، DetectsInvalidUserInput)
  • يلقي (مثلا ، ThrowsOnNotFound)
  • سوف (مثلا ، WillCloseTheDatabaseAfterTheTransaction)

الخ.

وثمة خيار آخر هو استخدام "أن" بدلا من "إذا".

هذا الأخير يوفر لي ضغطات على الرغم من يصف بالضبط ما أفعله منذ أنا لا أعرف ، أن اختبار السلوك الحاضر, ولكن أنا اختبار إذا هو.

[تحرير]

بعد استخدام فوق تسمية الاتفاقية لفترة أطول قليلا الآن, لقد وجدت أن إذا بادئة يمكن أن يكون مربكا ، عند العمل مع الواجهات.انها مجرد أن ذلك يحدث هذا الاختبار الدرجة IfSerializer.cs تبدو مشابهة جدا واجهة ISerializer.cs في "فتح علامة التبويب ملفات".وهذا يمكن الحصول على مزعج جدا عند التبديل ذهابا وإيابا بين اختبارات الصف يجري اختبارها و واجهة.ونتيجة لذلك فإنني الآن اختيار أن أكثر إذا بادئة.

بالإضافة إلى ذلك أنا الآن استخدام - فقط على الطرق في اختبار الطبقات كما أنه لا يعتبر أفضل الممارسات في أي مكان آخر - " _ " إلى كلمات منفصلة في طريقة الاختبار الأسماء كما في:

  • [اختبار] الفراغ العام detects_invalid_User_Input() *

أجد أن هذا أسهل في القراءة.

[نهاية تحرير]

آمل أن يكون هذا يولد المزيد من الأفكار منذ النظر في تسمية الاختبارات من أهمية كبيرة كما أنها يمكن أن توفر لك الكثير من الوقت من شأنه أن تنفق في محاولة لفهم ما الاختبارات يفعلون (مثلا ، بعد استئناف المشروع بعد موسعة الفرجة).

في مقابل + NUnit أنا عادة إنشاء مجلدات في المشروع إلى مجموعة الاختبارات الوظيفية معا.ثم إنشاء وحدة المباراة اختبار فصول اسم لهم بعد النوع من الوظائف أنا اختبار.فإن [اختبار] أساليب اسمه على طول خطوط Can_add_user_to_domain:

- MyUnitTestProject   
  + FTPServerTests <- Folder
   + UserManagerTests <- Test Fixture Class
     - Can_add_user_to_domain  <- Test methods
     - Can_delete_user_from_domain
     - Can_reset_password

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

أنا شخصيا أفضل الممارسات الموصوفة في "JUnit دليل الجيب" ...فإنه من الصعب الفوز الكتاب الذي كتبه المؤلف المشارك JUnit!

اسم الاختبار قضية فئة فو ينبغي FooTestCase أو شيء من مثل ذلك (FooIntegrationTestCase أو FooAcceptanceTestCase) - لأنه هو حالة اختبار.انظر http://xunitpatterns.com/ بعض اصطلاحات التسمية القياسية مثل اختبار, اختبار, اختبار تركيبات, طريقة الاختبار ، إلخ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top