سؤال
عند استخدام Nosetests ل Python، من الممكن تعطيل اختبار الوحدة عن طريق تعيين وظيفة الاختبار __test__
سمة إلى false. لقد قمت بتنفيذ هذا باستخدام الديكور التالي:
def unit_test_disabled():
def wrapper(func):
func.__test__ = False
return func
return wrapper
@unit_test_disabled
def test_my_sample_test()
#code here ...
ومع ذلك، فإن هذا له تأثير جانبي للاتصال المجمع كاختبار الوحدة. سوف يمر المجمع دائما ولكن يتم تضمينه في إخراج Nosetests. هل هناك طريقة أخرى من هيكلة Decorator بحيث لا يعمل الاختبار ولا يظهر في إخراج Nosetests.
المحلول
أعتقد أنك ستحتاج أيضا إلى إعادة تسمية ديكورك إلى شيء لم يحصل عليه. وفشل أدناه فقط في الاختبار الثاني بالنسبة لي والأول لا يظهر في مجموعة الاختبار.
def unit_disabled(func):
def wrapper(func):
func.__test__ = False
return func
return wrapper
@unit_disabled
def test_my_sample_test():
assert 1 <> 1
def test2_my_sample_test():
assert 1 <> 1
نصائح أخرى
يحتوي الأنف بالفعل على ديكور مدمج لهذا:
from nose.tools import nottest
@nottest
def test_my_sample_test()
#code here ...
تحقق أيضا من الأشياء الجيدة الأخرى التي يوفرها الأنف: https://nose.readtheedoc.org/en/latest/testing_tools.html.
تستطيع ايضا استخذام unittest.skip
ديكور:
import unittest
@unittest.skip("temporarily disabled")
class MyTestCase(unittest.TestCase):
...
يوجد أيضا مكون إضافي لمكافحة الأنف، مما سيؤدي إلى عرض الاختبار في إخراج الاختبار كما تم تخطيه. هنا هو ديكور لذلك:
def skipped(func):
from nose.plugins.skip import SkipTest
def _():
raise SkipTest("Test %s is skipped" % func.__name__)
_.__name__ = func.__name__
return _
مثال الإخراج:
$ nosetests tests
..........................................................................
..................................S.............
----------------------------------------------------------------------
Ran 122 tests in 2.160s
OK (SKIP=1)
يمكنك فقط بدء تشغيل الفصل أو الأسلوب أو الوظيفة باستخدام الأسفل السفلية والأنف.
@nottest
له استخداماته ولكني أجد أنه لا يعمل بشكل جيد عندما تستمد الفصول الدراسية من بعضها البعض، ويجب تجاهل بعض الفئات الأساسية عن طريق الأنف. يحدث هذا في كثير من الأحيان عندما يكون لدي سلسلة من وجهات نظر Django مماثلة لاختبار. غالبا ما يشاركون الخصائص التي تحتاج إلى اختبار. على سبيل المثال، يمكن الوصول إليها فقط للمستخدمين بأذونات معينة. بدلا من كتابة نفس إذن التحقق من كل منهم، وضعت هذا الاختبار المشترك في فئة أولية تستمد منها الفصول الأخرى. المشكلة على الرغم من أن الفئة الأساسية موجودة فقط ليتم استكشافها من قبل الفصول اللاحقة وليس المقصود أن يتم تشغيلها بمفردها. إليك مثال على المشكلة:
from unittest import TestCase
class Base(TestCase):
def test_something(self):
print "Testing something in " + self.__class__.__name__
class Derived(Base):
def test_something_else(self):
print "Testing something else in " + self.__class__.__name__
والإخراج من الجري الأنف عليه:
$ nosetests test.py -s
Testing something in Base
.Testing something in Derived
.Testing something else in Derived
.
----------------------------------------------------------------------
Ran 3 tests in 0.000s
OK
ال Base
يتم تضمين الفئة في الاختبارات.
لا أستطيع صفعة @nottest
على Base
لأنه سيمثل التسلسل الهرمي بأكمله. في الواقع إذا أضفت فقط @nottest
إلى الكود أعلاه أمام class Base
, ، ثم لن يدير الأنف أي اختبارات.
ما أقوم به هو إضافة تسطير أسفل الفئة الأساسية:
from unittest import TestCase
class _Base(TestCase):
def test_something(self):
print "Testing something in " + self.__class__.__name__
class Derived(_Base):
def test_something_else(self):
print "Testing something else in " + self.__class__.__name__
وعند تشغيله _Base
يتم تجاهل:
$ nosetests test3.py -s
Testing something in Derived
.Testing something else in Derived
.
----------------------------------------------------------------------
Ran 2 tests in 0.000s
OK
لم يتم توثيق هذا السلوك جيدا ولكن الرمز الذي يختار الاختبارات يتحقق صراحة عن تسطير الأسفل في بداية أسماء الفئة.
يتم إجراء اختبار مماثل عن طريق الأنف على أساس الوظائف وأسماء الأسلوب حتى يكون من الممكن استبعادها عن طريق إضافة تسطير تحت السفلية في بداية الاسم.