سؤال

عند استخدام 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

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

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

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