سؤال

.الإطار الصافي:2.0 اللغة المفضلة:ج#

أنا جديد على TDD (التطوير القائم على الاختبار).

بادئ ذي بدء، هل من الممكن حتى اختبار وحدة خدمة Windows؟

فئة خدمة Windows مشتقة من ServiceBase، والتي تحتوي على أساليب يمكن تجاوزها،

  1. OnStart
  2. OnStop

كيف يمكنني تشغيل هذه الأساليب ليتم استدعاؤها كما لو كان اختبار الوحدة هو خدمة فعلية تستدعي تلك الأساليب بالترتيب الصحيح؟

في هذه المرحلة، هل أقوم باختبار الوحدة؟أو اختبار التكامل؟

لقد ألقيت نظرة على سؤال خدمة WCF ولكن لم يكن الأمر منطقيًا بالنسبة لي لأنني لم أتعامل مطلقًا مع خدمة WCF.

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

المحلول

ربما أوصي بتصميم تطبيقك بحيث يتم تجاوز "OnStart" و"OnStop" في خدمة Windows فقط من خلال استدعاء الأساليب الموجودة في مجموعة مكتبة الفصل.وبهذه الطريقة يمكنك أتمتة اختبارات الوحدة مقابل أساليب مكتبة الفئات، كما يقوم التصميم أيضًا باستخلاص منطق عملك من تنفيذ خدمة Windows.

في هذا السيناريو، سيكون اختبار أساليب "OnStart" و"OnStop" نفسها في سياق خدمة Windows بمثابة اختبار تكامل، وليس شيئًا يمكنك أتمتته.

نصائح أخرى

لقد قمت باختبار خدمات Windows من خلال عدم اختبار الخدمة مباشرة، بل اختبار ما تفعله الخدمة.

عادةً ما أقوم بإنشاء تجميع واحد للخدمة وآخر لما تفعله الخدمة.ثم أكتب اختبارات الوحدة مقابل التجميع الثاني.

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

سأبدأ هنا.يوضح كيفية بدء الخدمات وإيقافها في C#

عينة للبدء هي

public static void StartService(string serviceName, int timeoutMilliseconds)
{
  ServiceController service = new ServiceController(serviceName);
  try
  {
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

    service.Start();
    service.WaitForStatus(ServiceControllerStatus.Running, timeout);
  }
  catch
  {
    // ...
  }
}

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

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

لذا فإن فئة خدمة Windows الخاصة بك هي فئة رفيعة جدًا، يمكن مقارنتها بنموذج Windows.فهو يستدعي منطق عملك/منطق المجال الخاص بك، والذي يقوم بعد ذلك بما يفترض أن يفعله.كل ما عليك فعله هو التأكد من أن الطريقة (الطرق) التي تتصل بها في onStart وonStop تعمل كما ينبغي.على الأقل هذا ما سأفعله ;-)

يعد التصميم للاختبار استراتيجية جيدة، كما تشير العديد من الإجابات من خلال التوصية بذلك OnStart و OnStop تظل الأساليب رفيعة جدًا من خلال التفويض إلى كائنات المجال.

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

serviceInstance.GetType().InvokeMember("OnStart", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, serviceInstance, new object[] {new string[] {}});

اختبار خدمة نافذة الاختبار في الطاقة التلقائية ، قم بإيقاف تشغيل خدمة نافذة الاختبار عند فصل الشبكة ، وخيار خدمة النافذة المتصلة AutostArt ، يدوي إلخ.

ربما يكون الرجل هو أفضل إجابة.

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

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