قم بتوسيع xUnit.NET لاستخدام التعليمات البرمجية المخصصة عند معالجة الفصل الدراسي وتحديد موقع طرق الاختبار

StackOverflow https://stackoverflow.com/questions/488121

  •  20-08-2019
  •  | 
  •  

سؤال

أنا معجب كبير بإطار عمل xUnit.NET؛أجدها خفيفة وبسيطة ونظيفة وقابلة للتوسيع.

الآن لنفترض أن لدي فصلًا مثل هذا:

public class AdditionSpecification
{
  static int result;

  public void Because()
  {
    result = 2 + 2;
  }

  public void Result_is_non_zero()
  {
    Assert.True(result <> 0);
  }

  public void Result_is_correct()
  {
    Assert.Equal(4, result);
  }
}

مع فئة الاختبار المذكورة أعلاه، أريد أن يرى xUnit.NET حالتي اختبار وأن يقوم بتشغيل طريقة Due() قبل كل منهما.

بغض النظر عن أي مشكلات قد تكون لديك مع أسماء الفصول أو الطرق الخاصة بي، أو بنية هذا الاختبار/المواصفات، أو إطار عمل xUnit.NET، أو BDD، إليك سؤالي:

كيف يمكنني إخبار xUnit.NET أنني أريد تخصيص كيفية تحديد وتنفيذ طرق الاختبار خارج هذه الفئة بدون باستخدام سمة مخصصة تشبه [حقيقة] في كل طريقة اختبار مستهدفة؟

أعلم أنه يمكنني الاشتقاق من BeforeAfterAttribute لتزيين كل طريقة اختبار بشكل مخصص قبل التنفيذ وبعده.كيف يمكنني القيام بذلك على مستوى الفصل؟هل يجب علي أن أكتب عداء مخصص؟

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

المحلول 2

لذلك اتضح أنني كنت أبحث عن طريقة ITestClassCommand.EnumerateTestMethods().

  1. عداء اختبار xUnit.NET الافتراضي سيتم التكرار على جميع الفصول في تجميع الاختبار الخاص بك.
  2. لكل واحد سوف يتحقق من وجود RunWithAttribute؛هذه هي فرصتك لتجاوز تنفيذ ITestClassCommand التي تستخدم لتحديد الأساليب تحتوي على اختبارات.(RunWithNUnit مثال جيد)
  3. يتم استدعاء ITestClassCommand.EnumerateTestMethods() لمعالجة فئة الاختبار وإرجاع IEnumerable من أساليب الاختبار.
  4. يتم بعد ذلك تمرير كل اختبار IMethodInfo إلى ITestClassCommand.EnumerateTestCommands(IMethodInfo testMethod) للحصول على IEnumerable من ITestCommands
  5. يتم بعد ذلك تنفيذ كل ITestCommand ومنحه الفرصة لإرجاع النتيجة.

في حالة المثال أعلاه، سأحتاج إلى شيء مثل:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class RunWithMyTestClassCommandAttribute : RunWithAttribute
{
   public RunWithMyTestClassCommandAttribute()
               : base(typeof(MyTestClassCommand)) {}
}

ثم يمكنني تزيين المثال أعلاه بما يلي:

[RunWithMyTestClassCommand]
public class AdditionSpecification
{
  static int result;

  public void Because()
  {
    result = 2 + 2;
  }

  public void Result_is_non_zero()
  {
    Assert.True(result <> 0);
  }

  public void Result_is_correct()
  {
    Assert.Equal(4, result);
  }
}

أخيرًا، في MyTestClassCommand، أتيحت لي فرصة بين EnumerateTestMethods() و EnumerateTestCommands(IMethodInfo testMethod) لاستخدام أي منطق أريد تحديد موقع مثيلات ITestCommand وإنشائها التي يتم تنفيذها كاختبارات فردية.

راجع للشغل، أثناء عملية البحث في هذه المشكلة، واجهت خطأً صغيرًا في إطار عمل xUnit.NET حيث لم يظهر IMethodInfo المخصص الذي تم إنشاؤه بواسطة EnumerateTestMethods() مطلقًا في EnumerateTestCommands(..) لأنه تم فك تغليفه وإعادة تغليفه بواسطة الاختبار runner أو أحد مصانعها .

لقد قدمت هذه المسألة لمشروع xUnit على codeplex وكان تم تصحيحه في 30 مايو, ، 2009 لـ xUnit.NET 1.5 CTP 2

نصائح أخرى

يتيح لك IUseFixture الخاص بـ xUnit.net إجراء إعداد لكل وحدة.لذلك يمكنك تحديد فئة التثبيت الخاصة بك:

public class AdditionFixture : IDisposable
{
  public int Because() 
  {
    return 2 + 2;
  }

  public void Dispose()
  {
   //test tear down code
  }      
}

يمكن لفئة الاختبار الخاصة بك بعد ذلك تنفيذ هذا (مع طلب setFixture للتنفيذ):

public class AdditionSpecification : IUseFixture<AdditionFixture>
{
  int result;

  public void SetFixture(AdditionFixture Fixture)
  {
   result = Fixture.Because();
  }

  [Fact]
  public void Result_is_non_zero()
  {
   Assert.True(result <> 0);
  }

  [Fact]
  public void Result_is_correct()
  {
   Assert.Equal(4, result);
  }
}

سيقوم مشغل xUnit بإنشاء مثيل واحد للتركيبة الخاصة بك، وتمريرها إلى SetFixture قبل تشغيل كل اختبار.بعد إجراء جميع اختباراتك، سيتخلص العداء من الأداة إذا كان يطبق IDisposable.أتمنى أن يساعد ذلك!

يحتوي موقع xUnit wiki على codeplex على مزيد من المعلومات، بما في ذلك مثال جيد لكيفية تنفيذ IUseFixture لإدارة اتصال قاعدة البيانات لاختبار التركيبات.

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