سؤال

أنا باستخدام C# 3.0 و NUnit.أنا أتساءل عما إذا كان هناك طريقة قياسية لأداء اختبارات الوحدة على التعليمات البرمجية التي تنفذ بعد بعض الوقت.على سبيل المثال لدي بسيط ثابت الدرجة التي يمكن تسجيلها الأساليب, و يسمى n ميلي ثانية في وقت لاحق.أريد أن أؤكد أن البرمجية في مندوب أساليب يسمى.

على سبيل المثال, الاختبار التالي سوف تمر دائما, لأنه لا توجد تأكيدات حتى بعد الطريقة قد خرجت.

[Test]
public void SampleTest()
{
    IntervalManager.SetTimeout(delegate{ 
        Assert.Equals(now.Millisecond + 100, DateTime.Now.Millisecond); 
    }, 100);
}

هل من الممكن أن اختبار الوحدة البرمجية التي لا تنفذ على الفور ؟

الهتافات ،

بول

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

المحلول

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

public void Foo() {
    AutoResetEvent evt = new AutoResetEvent(false);
    Timer t = new Timer(state => {
        // Do work
        evt.Set();
    }, null, 100, Timeout.Infinite);
    if (evt.WaitOne(500)) {
        // method called and completed
    } else {
        // timed out waiting
    }
}

نصائح أخرى

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

وكملاحظة جانبية. ونحن عادة في محاولة لاحياء لدينا بطيئة اختبارات تشغيل مع rel="nofollow فئة NUnit و يمكن أن تختار لتخطي تلك الاختبارات على تبني بعض.

نعم، فعل ذلك كما في المثال لن تعمل لديك.

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

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

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

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

  1. عند تسجيل توقيت مندوب التنفيذ السليم يتم تعيين الوقت.ومن المحتمل أن يحتاج إلى اختبار مع مجموعات مختلفة من مهلة و أرقام المندوبين.
  2. مندوب يتم تنفيذها بالطريقة الصحيحة.

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

وبالطبع يمكنك اختبار ذلك. عليك أن انتظر حتى تنفيذ.

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

    #region Additional test attributes
    // 
    //You can use the following additional attributes as you write your tests:
    //
    //Use ClassInitialize to run code before running the first test in the class
    //[ClassInitialize]
    //public static void MyClassInitialize(TestContext testContext) {
    //}
    //
    //Use ClassCleanup to run code after all tests in a class have run
    //[ClassCleanup()]
    //public static void MyClassCleanup()
    //{
    //}
    //
    //Use TestInitialize to run code before running each test
    //[TestInitialize()]
    //public void MyTestInitialize()
    //{
    //}
    //
    //Use TestCleanup to run code after each test has run
    //[TestCleanup()]
    //public void MyTestCleanup()
    //{
    //}
    //
    #endregion

وذلك باستخدام [ClassInitialize] يجب أن تسمح لك أن يكتب كل ما لديها لتنفيذه أولا إلى أسلوب. ثم اختبارات إعلاناتك. أو يمكنك استخدام [TestInitialize] لتشغيل التعليمات البرمجية قبل كل اختبار.

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