كيفية استخدام مجموعات من مجموعات اختبار البيانات

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

سؤال

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

(inf,0,-1), (5,10,1000), (10,5,5), (0,-1,5), (1000,inf,inf),
...

كملاحظة:في الواقع أنا أعرف الجواب على هذا, ولكن قد تكون مفيدة للآخرين, و تحديا للناس هنا!--سيتم نشر جوابي في وقت لاحق.

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

المحلول

على الاطلاق, خصوصا التعامل مع الكثير من هذه التباديل/تركيبات أنا يمكن أن نرى بالتأكيد أن يمر أولا من شأنه أن يكون مشكلة.

تنفيذ مثيرة للاهتمام في بيثون ، على الرغم من أنني كتبت لطيفة واحد في C و Ocaml على أساس "خوارزمية 515" (انظر أدناه).كتب في Fortran كما كان شائعا آنذاك للجميع "خوارزمية العشرين" أوراق, حسنا, تلك الجمعية أو ج.اضطررت إلى إعادة كتابة وتقديم بعض التحسينات الصغيرة إلى العمل مع المصفوفات لا نطاقات الأرقام.هذا واحد لا الوصول العشوائي, أنا لا تزال تعمل على الحصول على بعض لطيفة تطبيقات تلك المذكورة في كانوث 4 حجم كراسة 2.سوف شرح كيف يعمل هذا القارئ.على الرغم من إذا كان شخص ما هو الغريب, أنا لا أعترض على كتابة شيء ما.

/** [combination c n p x]
 * get the [x]th lexicographically ordered set of [p] elements in [n]
 * output is in [c], and should be sizeof(int)*[p] */
void combination(int* c,int n,int p, int x){
    int i,r,k = 0;
    for(i=0;i<p-1;i++){
        c[i] = (i != 0) ? c[i-1] : 0;
        do {
            c[i]++;
            r = choose(n-c[i],p-(i+1));
            k = k + r;
        } while(k < x);
        k = k - r;
    }
    c[p-1] = c[p-2] + x - k;
}

~"خوارزمية 515:الجيل متجه من المعجمية مؤشر" ؛ الأبازيم, B.P. ، Lybanon م ، ACM المعاملات على البرامج الرياضية ، المجلد.3, لا.2 ، يونيو / حزيران 1977.

نصائح أخرى

مع العلامة التجارية الجديدة بيثون 2.6 لديك الحل القياسية مع itertools وحدة إرجاع المنتج الديكارتي من iterables :

import itertools

print list(itertools.product([1,2,3], [4,5,6]))
   [(1, 4), (1, 5), (1, 6),
   (2, 4), (2, 5), (2, 6),
   (3, 4), (3, 5), (3, 6)]

يمكنك توفير "تكرار" الحجة لأداء المنتج مع iterable و نفسه:

print list(itertools.product([1,2], repeat=3))
[(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2),
(2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]

يمكنك أيضا قرص شيء مع تركيبات أيضا :

print list(itertools.combinations('123', 2))
[('1', '2'), ('1', '3'), ('2', '3')]

وإذا أمر من الأمور ، هناك التباديل :

print list(itertools.permutations([1,2,3,4], 2))
[(1, 2), (1, 3), (1, 4),
   (2, 1), (2, 3), (2, 4),
   (3, 1), (3, 2), (3, 4),
   (4, 1), (4, 2), (4, 3)]

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

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

مسألة مثيرة للاهتمام!

وأود أن تفعل هذا من خلال اختيار تركيبات شيء مثل التالية في بيثون.الجزء الأصعب هو ربما يمر أولا التحقق ، أي if f(1,2,3) returns true, هل هذا صحيح النتيجة ؟ وبمجرد الانتهاء من التحقق من ذلك, ثم وهذا هو أساس جيد اختبار الانحدار.

ربما انها فكرة جيدة لجعل مجموعة من حالات الاختبار التي تعرف سوف يكون كل شيء صحيح (على سبيل المثال3 و 4 و 5 من أجل هذا المثلث الحالة) ، و مجموعة من حالات الاختبار التي تعرف سوف تكون جميع كاذبة (مثل0,1,inf).ثم يمكنك بسهولة التحقق من الاختبارات صحيحة.

# xpermutations from http://code.activestate.com/recipes/190465
from xpermutations import *

lengths=[-1,0,1,5,10,0,1000,'inf']
for c in xselections(lengths,3):        # or xuniqueselections
    print c
(-1,-1,-1);
(-1,-1,0);
(-1,-1,1);
(-1,-1,5);
(-1,-1,10);
(-1,-1,0);
(-1,-1,1000);
(-1,-1,inf);
(-1,0,-1);
(-1,0,0);
...

أعتقد أنك يمكن أن تفعل هذا مع الصف الاختبار السمة (متوفر في MbUnit والإصدارات الأحدث من NUnit) حيث يمكن تحديد عدة مجموعات لملء وحدة واحدة اختبار.

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

من نموذجي QA منظور ، قد ترغب في تحديد تصنيفات مختلفة من المدخلات.تنتج مجموعة من قيم الإدخال لكل تصنيف و تحديد النواتج.

هنا عينة الدراسة من قيم الإدخال

  • صالح مثلثات مع أعداد صغيرة مثل (1 مليار, 2, مليار, 2 مليار)
  • صالح مثلثات مع أعداد كبيرة مثل (0.000001, 0.00002, 0.00003)
  • صالح منفرجة المثلثات التي هي 'تقريبا'flat مثل (10, 10, 19.9999)
  • صالح الحادة المثلثات التي هي 'تقريبا' مسطحة مثل (10, 10, 0000001)
  • صالح مثلثات مع واحد على الأقل قيمة سالبة
  • صالح مثلثات حيث مجموع الجانبين يساوي الثالث
  • صالح مثلثات حيث مجموع الجانبين أكبر من الثالث
  • إدخال القيم غير الرقمية

...

مرة كنت راضيا عن قائمة المدخلات التصنيفات لهذه المهمة, ثم يمكنك إنشاء بيانات الاختبار الفعلي.الأرجح أنه سيكون من المفيد اختبار جميع التباديل من كل بند.(مثلا ، (2,3,4), (2,4,3), (3,2,4), (3,4,2), (4,2,3), (4,3,2)) عادة, سوف تجد أن هناك بعض التصنيفات فاتك (مثل مفهوم inf كمدخل المعلمة).

بيانات عشوائية لفترة من الوقت قد تكون مفيدة أيضا ، التي يمكن أن تجد غريب الخلل في القانون ، ولكن عموما ليست منتجة.

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

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