تأكيد الرسائل في الاختبارات

مرحبا مجددا. قبل بدء دورة "C # Developer" ، قمنا بترجمة مواد مثيرة للاهتمام حول تأكيد الرسائل في الاختبارات ويسعدنا مشاركة الترجمة معك.




سنتحدث في هذا المنشور عما إذا كان يجب عليك استخدام رسائل التأكيد في اختباراتك.

تلقيت سؤالًا مثيرًا للاهتمام من زميل قارئ ، والذي أود أن أتطرق إليه بمزيد من التفصيل:

لدي سؤال حول رسائل التأكيد: هل يجب أن أستخدم التحميل الزائد الذي يحتوي على معلمة الرسالة وأستخدمه لإرسال سلسلة تصف سبب فشل Assert (أيضًا "المطالبات") ؟؟؟

الجواب على هذا السؤال ينقسم إلى جانبين:

  • قراءة الاختبار - مدى سهولة فهم ما يفعله الاختبار.
  • سهولة التشخيص - مدى سهولة فهم سبب فشل الاختبار.

دعونا نناقش كل واحد على حدة

اختبار القراءة


غالبًا ما يستخدم الأشخاص رسائل التأكيد لمساعدة أعضاء الفريق وأنفسهم في المستقبل على فهم ما يحدث في الاختبار. دعونا نلقي نظرة على المثال التالي:

[Test]
public void Hiring_a_new_team_member()
{
    var company = new Company();
    var person = new Person(UserType.Customer);

    company.HireNewMember(person);

    Assert.AreEqual(UserType.Employee, person.Type); //  
    Assert.AreEqual(1, company.NumberOfEmployees); //  
}

بدلاً من التأكيد العاري ، يمكنك أيضًا الإشارة إلى سبب التحقق من صحة الاختبار في تأكيد ما:

[Test]
public void Hiring_a_new_team_member()
{
    var company = new Company();
    var person = new Person(UserType.Customer);

    company.HireNewMember(person);

    Assert.AreEqual(UserType.Employee, person.Type, "Person must become an employee after hiring");
    Assert.AreEqual(1, company.NumberOfEmployees, "Number of employees must increase");
}

مثل هذه التصريحات تساعد ، لكنها تأتي بثمن. تتطلب منك هذه الرسائل

  • اقضِ وقتًا في كتابتها
  • اجعلهم يتحركون إلى الأمام

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

أدخل رسائل التأكيد فقط عند الضرورة القصوى - عندما لا يمكنك تحسين إمكانية قراءة الاختبار بأي طريقة أخرى. ولكن حتى ذلك الحين ، تميل إلى اختيار عدم كتابتها.

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

[Test]
public void Hiring_a_new_team_member()
{
    var company = new Company();
    var person = new Person(UserType.Customer);

    company.HireNewMember(person);

    Assert.That(person.Type, Is.EqualTo(UserType.Employee));
    Assert.That(company.NumberOfEmployees, Is.EqualTo(1));
}

أو يمكنك استخدام التأكيدات بطلاقة المفضلة :

[Test]
public void Hiring_a_new_team_member()
{
    var company = new Company();
    var person = new Person(UserType.Customer);

    company.HireNewMember(person);

    person.Type.Should().Be(UserType.Employee);
    company.NumberOfEmployees.Should().Be(1);
}

تتم قراءة هذه العبارات باللغة الإنجليزية العادية - تمامًا بالطريقة التي ترغب في قراءة جميع التعليمات البرمجية بها. نحن البشر نفضل أن ندرك المعلومات في شكل قصص. تلتزم جميع القصص بهذا النموذج:

[] [] [].

على سبيل المثال،

  .

هنا - الموضوع ، - الفعل ، و - الكائن. وينطبق الشيء نفسه على التعليمات البرمجية.

هذه النسخة

company.NumberOfEmployees.Should().Be(1);

يقرأ أفضل من

Assert.AreEqual(1, company.NumberOfEmployees);

على وجه التحديد لأنه يتم تتبع التاريخ هنا.
, . , .


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

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


هرم الاختبار

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

ولكن حتى مع اختبارات التكامل والاختبار الشامل ، هناك طرق لتسهيل التشخيص دون اللجوء إلى تأكيد الرسائل:

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

ولا تنس أنه حتى بدون بيانات المستخدم ، لا تزال لديك الرسائل التي تولدها بيئة اختبار الوحدة لك.

على سبيل المثال ، خطأ في العبارة التالية:

person.Type.Should().Be(UserType.Employee);

يعطي رسالة الخطأ التالية:

Xunit.Sdk.EqualException: Assert.Equal() Failure
Expected: Employee
Actual:   Customer

إن الجمع بين هذه الرسائل الناتجة عن البيئة وأسماء الاختبارات المقروءة من قبل الإنسان يجعل 90٪ من الرسائل التي يؤكدها المستخدم عديمة الفائدة حتى من حيث سهولة التشخيص. الاستثناء الوحيد هو الاختبارات المطولة من طرف إلى طرف. غالبًا ما تحتوي على فحوصات متعددة المراحل ، لذلك من المنطقي استخدام رسائل تأكيد إضافية لفهم أي من الخطوات فشلت. ومع ذلك ، لا ينبغي أن يكون هناك العديد من الاختبارات من طرف إلى طرف.

بالطبع ، للاستفادة من رسائل الخطأ التي تم إنشاؤها بواسطة إطار العمل ، تحتاج إلى تجنب المقارنات المنطقية الشائعة ، مثل:

(person.Type == UserType.Employee).Should().BeTrue();

لأنها تؤدي إلى رسالة الخطأ التالية:

Xunit.Sdk.TrueException: Assert.True() Failure
Expected: True
Actual:   False

وهو ما لا يساعد في التشخيص على الإطلاق.

ملخص


هل تشعر بالكسل في كثير من الأحيان عندما يتعلق الأمر بكتابة البيانات؟ حسنًا ، يمكنك الآن تبريره وإرسال زملائك إلى هذه المقالة.


"أنا سعيد لأن هذا له اسم"

جانبا ، ولكن هنا ملخص:

  • هناك جانبان لاستخدام رسائل التأكيد:
    • قراءة الاختبار (مدى سهولة فهم ما يفعله الاختبار).
    • سهولة التشخيص (مدى سهولة فهم سبب فشل الاختبار أثناء بناء CI).
  • من حيث سهولة الاختبار ، رسائل التأكيد هي عبارة عن تعليقات برمجية. بدلًا من الاعتماد عليها ، قم بإعادة صياغة الاختبار لتحقيق سهولة القراءة.
  • من حيث سهولة التشخيص ، فإن أفضل بديل لتأكيد الرسائل هو:
    • اختبار وحدة سلوك واحدة عن طريق اختبار
    • اختبارات التسمية من حيث الأعمال
  • الاستثناء الوحيد هو الاختبارات المطولة من طرف إلى طرف.

هذا كل شئ. يمكنك معرفة المزيد عن دورتنا في الندوة المجانية على الإنترنت ، والتي ستعقد اليوم.

All Articles