يمكن بيثون doctest تجاهل بعض خطوط الانتاج؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

وأود أن أكتب doctest مثل هذا:

"""
>>> print a.string()
          foo : a
          bar : b
         date : <I don't care about the date output>
          baz : c
"""

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

وشكرا!

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

المحلول

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

>>> print range(20) # doctest:+ELLIPSIS
[0, 1, ..., 18, 19]

إذا كنت تريد الخيار doctest إلى أن تكون نشطة في جميع أنحاء، يمكنك تمرير بأنها حجة optionflags= إلى أي وظائف doctest التي تستخدمها، على سبيل المثال، doctest.testfile. (يمكنك تمرير العديد من الأعلام خيار هناك عن طريق استخدام المشغل | إلى بت أو لهم).

نصائح أخرى

وردا على أسئلة حول "كيف يمكننا تجاهل خط كامل": نعم، حقيقة أن "..." يبدو أيضا مثل استمرار مثل يجعل من الصعب تجاهل إخراج كامل. يمكنك استخدام "#doctest: + تخطي" إذا كنت ترغب فقط في تخطي سبيل المثال تماما، ولكن ذلك لن تعمل إذا كنت تعتمد على آثارها الجانبية. إذا كنت <م> حقا تحتاج إلى القيام بذلك، وأنا افترض أنك يمكن أن القرد تصحيح doctest الوحدة نفسها، على الرغم من أنني لن أوصي به على وجه الخصوص:

>>> import doctest
>>> doctest.ELLIPSIS_MARKER = '-etc-'
>>> print 12 # doctest: +ELLIPSIS
-etc-

و(هذا الاختبار يمر).

وأو هل يمكن أن قمع مؤقتا المعياري و / أو ستدير:

>>> # Suppress stdout
>>> import sys
>>> class DevNull:
...     def noop(*args, **kwargs): pass
...     close = write = flush = writelines = noop
>>> sys.stdout = DevNull()
>>> # Run a test and ignore output (but we need its side effects)
>>> print 12 # NOTE: stdout is suppressed!
>>> # Restore stdout
>>> sys.stdout = sys.__stdout__

و(يمر هذا الاختبار أيضا.)

وتجاهل الخط كله هو صعب بعض الشيء على الرغم من. هنا:

"""
>>> do_your_thing() #doctest:+ELLIPSIS
...
"""

وسيتم تفسير النقطة الثلاثية كما استمرار الخط، وتسبب خطأ في بناء الجملة.

إذا كنت ترغب في تجاهل خط كامل، سوف تحتاج إلى شيء مثل:

"""
>>> sys.stdout.write('skip from here '); do_your_thing() #doctest:+ELLIPSIS
skip from here ...
"""

ولقد وجدت أنه من الأسهل لمجرد تعيين قيم الإرجاع غير الضرورية إلى متغير:

>>> _ = do_something()
>>> check_something()
True

ويمكنك كتابة الصفوف قبل وبعد الدالة (الإختراق مستوحاة من إجابة لكافة هورفاث):

def foo():
    """
    >>> ();foo();() # doctest: +ELLIPSIS
    (...)
    """
    print "Hello world"
    return "Hello world"

<وأ href = "https://stackoverflow.com/questions/5812833/can-i-have-an-ellipsis-at-the-beginning-of-the-line-in-a-python-doctest" > هل لدي القطع في بداية السطر في بيثون doctest؟ يوضح كيفية إنشاء الناتج المدقق مخصص يستخدم سلسلة إضافية باعتبارها القطع. وهذا من شأنه تمكنك من كتابة ما يلي، في حين لا تزال تستخدم '...' في مكان آخر.

def foo():
  """
  >>> foo() # doctest: +ELLIPSIS
  [...] world
  """
  print "hello world"
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top