كيف يمكنني اختبار الوحدة النسبية الأداء ؟

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

  •  11-09-2019
  •  | 
  •  

سؤال

نظرا لأني لا أعرف في الوقت نشر أي نوع من نظام قانون بلدي سوف تكون قيد التشغيل على كيف أكتب قياس الأداء التي تستخدم إمكانات نظام مسبارا.

ما أعنيه هو أنه إذا كان النظام قادر على تشغيل قطعة من التعليمات البرمجية 1000 مرة في الثانية ، أود الاختبار لضمان ذلك يأتي في إطار أقرب إلى 1000 ممكن.إذا كان يمكن أن تفعل سوى 500, ثم أن معدل أود أن مقارنة.

إذا كان ذلك يساعد في جعل إجابة أكثر تحديدا, أنا باستخدام JUnit4.

شكرا لك.

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

المحلول

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

إذا كنت لا تستطيع الفشل، فأنت معيار، وليس في الواقع اختبار.

عندما تتحدث عن "النظام قادر على تشغيل" عليك تحديد "قادر". يمكنك استخدام أي عدد كبير من معايير أداء الأجهزة. Whetstone، Dhrystone، إلخ، تحظى بشعبية. أو ربما يكون لديك تطبيق مكثف قاعدة البيانات، ثم قد ترغب في إلقاء نظرة على معيار TPC. أو ربما لديك تطبيق كثيف الشبكة وتريد استخدام NetPerf. أو تطبيق مكثف واجهة المستخدم الرسومية وتريد استخدام نوع من معيار الرسومات.

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

بمجرد تشغيل المعيار، يمكنك بعد ذلك تشغيل البرنامج ومعرفة ما يفعله النظام فعليا.

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

مع وجود بيانات كافية من صناديق كافية باستخدام تكوينات مختلفة كافية، ستتمكن في نهاية المطاف من تطوير نموذج أداء يقول "نظرا لهذه الأجهزة والبرامج والضبط المعلمات والتكوين، أتوقع أن يقوم برامجي بالمعاملات [X] في الثانية الواحدة." هذا تعريف قوي "قادر".

بمجرد أن يكون لديك هذا النموذج، يمكنك بعد ذلك مقارنة برنامجك مقابل رقم القدرة. حتى يكون لديك نموذج كامل للغاية، فأنت لا تعرف حقا أن الأنظمة غير قادرة على تشغيل قطعة رمز 1000 مرة في الثانية.

نصائح أخرى

أنا لا استخدام وحدة اختبار اختبارات الأداء لبضعة أسباب.

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

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

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

import static org.junit.Assert.*;
import org.junit.Test;

package com.stackoverflow.samples.tests {

    @Test
    public void doStuffRuns500TimesPerSecond() {
        long maximumRunningTime = 1000;
        long currentRunningTime = 0;
        int iterations = 0;

        do {
            long startTime = System.getTimeMillis();

            // do stuff

            currentRunningTime += System.getTimeMillis() - startTime;
            iterations++;
        }
        while (currentRunningTime <= maximumRunningTime);

        assertEquals(500, iterations);
    }
}

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

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

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

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

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

في حالتي، قد يقوم بالفعل بتنزيل البرامج الثابتة إلى DSP، قم بتزويدها عن بعد، وقراءة الرد من منفذ تسلسلي أو عدم الرد أي استجابة لأنه تحطمت!

- jeffk ++.

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