2009-06-21 6 views
22

Ich möchte einen doctest so schreiben:Kann Python Doctest einige Ausgabezeilen ignorieren?

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

Gibt es eine Möglichkeit, dies zu tun? Ich denke, es wäre sinnvoller, zu unittest zu wechseln, aber ich bin gespannt, ob es möglich ist, einen Ausgabebereich anzugeben, der für den Test in doctest nicht übereinstimmen sollte.

Danke!

Antwort

31

Mit doctest.ELLIPSIS können Sie ... verwenden, um "Übereinstimmung mit einer beliebigen Zeichenfolge hier" zu bedeuten. Sie können doctest Optionen mit einer doctest Richtlinie festgelegt, um es nur für einen Testfall aktiv zu machen: ein Beispiel in den online docs ist:

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

Wenn Sie eine doctest Option wollen überall aktiv sein, Sie passieren können es als das Argument optionflags= zu allen Doctest-Funktionen, die Sie verwenden, z doctest.testfile. (Sie können dort mehrere Optionsflags übergeben, indem Sie den Operator | an Bit oder sie verwenden).

+1

Aber wie können wir die ganze Linie ignorieren? –

+1

@ t0ster, setzen Sie einfach '...' als die gesamte "erwartete Ausgabe" (wobei 'doctest.ELLIPSIS' natürlich gesetzt ist), und doctest akzeptiert jeden Inhalt dieser Ausgabezeile, d. H."Ignoriere die ganze Zeile" der Ausgabe. –

+5

"Ignoriere die ganze Zeile" wie oben, funktioniert nicht, da doctest die Ellipse mit einer (Python) Fortsetzung der vorherigen Zeile verwechselt. Ich konnte keine Möglichkeit finden, die ganze Linie zu ignorieren. Eigentlich wollte ich "den gesamten Output ignorieren". –

4

Das Ignorieren der ganzen Zeile ist jedoch etwas knifflig. Hier:

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

Der dreifache Punkt wird als Zeilenfortsetzungs interpretiert werden, und verursacht einen Syntaxfehler.

Wenn Sie die ganze Zeile ignorieren wollen, müssen Sie so etwas wie:

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

Danke, das ist ein nützlicher Hack! –

8

Beantwortung von Fragen zum Thema „Wie können wir die ganze Zeile ignorieren“: ja, die Tatsache, dass“... "Sieht auch nach einer Fortsetzung aus, macht es schwer, die gesamte Ausgabe zu ignorieren. Sie können "#doctest: + SKIP" verwenden, wenn Sie nur das Beispiel vollständig überspringen möchten, aber das wird nicht funktionieren, wenn Sie sich auf seine Nebenwirkungen verlassen. Wenn Sie wirklich Notwendigkeit, dies zu tun, nehme ich an konnte man Affen Patch das doctest Modul selbst, obwohl ich nicht besonders es empfehlen würde: (. Dieser Test bestanden)

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

Oder Sie könnte vorübergehend stdout und/oder stderr unterdrücken: (. dieser Test geht auch)

>>> # 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__ 

0

Can I have an ellipsis at the beginning of the line in a Python doctest? exp zeigt an, wie Sie einen benutzerdefinierten Ausgabe-Checker erstellen, der eine zusätzliche Zeichenfolge als Auslassungszeichen verwendet. Dadurch könnten Sie Folgendes schreiben, während Sie an anderer Stelle immer noch "..." verwenden.

def foo(): 
    """ 
    >>> foo() # doctest: +ELLIPSIS 
    [...] world 
    """ 
    print "hello world" 
5

Ich fand es einfacher, einfach die nicht benötigten Rückgabewerte einer Variablen zuweisen:

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

einfachste, bravo – michaelsnowden

1

Sie können Tupel vor und nach Ihrer Funktion (durch Antwort von Mark Horvath Hack inspiriert) schreiben:

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