سؤال

أنا أحاول أن تبدأ مع اختبار وحدة في بيثون و أنا أتساءل عما اذا كان شخص ما يمكن أن يوضح مزايا وعيوب doctest و unittest.

ما هي الشروط سوف تستخدم كل ؟

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

المحلول

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

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

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

نصائح أخرى

يمكنني استخدام unittest بشكل حصري تقريبا.

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

95% من حالات الاختبار unittest.

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

وثمة ميزة أخرى من doctesting هو أن تحصل للتأكد من التعليمات البرمجية يفعل ما تقول وثائق يفعل. بعد فترة من الوقت، يمكن أن التغييرات البرنامج جعل وثائق ورمز تفعل أشياء مختلفة. : -)

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

في هذه الحالة، كتابة unittests كبيرة قد تكون مبالغة، وdoctests هم حلا وسطا مفيدا. فهي أسرع في الكتابة، ونظرا لأنها تدرج عادة في قانون، فهي تسمح للحفاظ دائما العين على كيف يجب أن تتصرف رمز، من دون ان يكون لدينا ملف آخر مفتوح. هذا مفيد عند كتابة نصي صغير.

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

وهكذا، لاستئناف جوابي: doctests مفيدة عندما يكون لديك لكتابة البرامج النصية الصغيرة، وعندما يكون لديك لتمرير لهم أو تظهر لهم للباحثين ليست علماء الكمبيوتر

.

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

وأود أن أقترح unittest إذا كنت قادما من خلفية أنه استخدم أداة JUnit أو شيئا من هذا القبيل، حيث كنت تريد أن تكون قادرة على إرسال وحدة الاختبارات في عموما بنفس الطريقة التي كانت في مكان آخر.

وأنا استخدم unittest حصرا. أعتقد doctest يبعثر فوق وحدة رئيسية أكثر من اللازم. وهذا ربما له علاقة مع الكتابة اختبارات شاملة.

وباستخدام كل من هو خيار صحيح وبسيط إلى حد ما. وتوفر وحدة doctest الطرق DoctTestSuite وDocFileSuite التي تخلق testsuite-unittest متوافق من وحدة نمطية أو الملف، على التوالي.

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

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

أنا لا استخدام doctest كبديل عن unittest.على الرغم من أنها تتداخل قليلا ، وحدتين لا يكون لها نفس وظيفة:

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

  • يمكنني استخدام doctest كما تضمن تعليقات (وهي docstrings) لا تزال ذات الصلة النسخة الحالية من القانون.

على نطاق واسع توثيق فوائد اختبار مدفوعة التنمية من unittest. doctest يحل أكثر دهاء خطر وجود عفا عليها الزمن تعليقات مضللة صيانة رمز.

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

وDoctest يمكن في بعض الأحيان تؤدي إلى نتيجة خاطئة. خاصة عندما يحتوي الناتج الهروب متواليات. على سبيل المثال

def convert():
    """
    >>> convert()
    '\xe0\xa4\x95'
    """
    a = '\xe0\xa4\x95'
    return a
import doctest
doctest.testmod()

وتعطي

**********************************************************************
File "hindi.py", line 3, in __main__.convert
Failed example:
    convert()
Expected:
    'क'
Got:
    '\xe0\xa4\x95'
**********************************************************************
1 items had failures:
   1 of   1 in __main__.convert
***Test Failed*** 1 failures. 

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

وأنا أفضل أنظمة اكتشاف أساس ( "الأنف" و "py.test"، وذلك باستخدام السابق حاليا).

وdoctest هو لطيف عند الاختبار هي أيضا جيدة باعتبارها وثائق، وإلا فإنها تميل إلى فوضى رمز أكثر من اللازم.

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