2017-09-17 4 views
1

Ich versuche, einige Debugging (speziell auf pytest/testing/test_doctest.py) und ich möchte einige Code in IPython Schritt. Ich habe Erfahrung mit Pytest, aber ich mache nie etwas zu ausgefallenes damit, also habe ich mich nie tief in die "magischen" Dinge vertieft, die es tut. Im Test, den ich durchgehen möchte (potentiell einige der Objekte inspizieren), gibt es ein Argument namens testdir, aber nirgends in dieser Datei wird darauf verwiesen, was testdir ist oder wie ich möglicherweise eines erstellen könnte.Wie erstellt man eine Instanz von _pytest.pytester.Testdir

Nach einigen Graben scheint es, dass dies eine magische Vorrichtung ist, die automatisch konstruiert und an Ihre Funktion als Parameter gesendet wird, wenn Sie pytest mit dem pytester Plugin ausführen. Als ich diese Klasse aufspürte, wird sie wieder über eine magische request Param erstellt, wo der Code massiv nicht hilfreich ist, dir zu sagen, was diese magische request ist oder wie man eine macht.

Um dieses zu konkretisieren ich einfach einen Test wie dieser nehmen will:

def test_reportinfo(self, testdir): 
    ''' 
    Test case to make sure that DoctestItem.reportinfo() returns lineno. 
    ''' 
    p = testdir.makepyfile(test_reportinfo=""" 
     def foo(x): 
      ''' 
       >>> foo('a') 
       'b' 
      ''' 
      return 'c' 
    """) 
    items, reprec = testdir.inline_genitems(p, '--doctest-modules') 
    reportinfo = items[0].reportinfo() 
    assert reportinfo[1] == 1 

und seine Logik läuft in IPython. Betrachtet man, was das Objekt testdir tut, scheint es ziemlich cool. Es erstellt automatisch eine Datei für Sie und führt pytest problematisch anstatt über die Befehlszeile aus. Wie kann ich eins davon machen? Gibt es Unterlagen, die ich übersehen habe und die klar machen, dass sie weniger verdeckt sind?

Wenn ich etwas so verwenden möchte ist meine Tests gibt es eine Möglichkeit, wie ich den magischen testdir Parameter etwas expliziter machen könnte, so dass der nächste Coder, der es ansieht, sein Haar nicht wie ich herauszieht bin ich?

Antwort

0

Nach vielen Qualen habe ich herausgefunden, wie man einen Fixture-Wert instanziiert.

import _pytest 
    config = _pytest.config._prepareconfig(['-s'], plugins=['pytester']) 
    session = _pytest.main.Session(config) 
    _pytest.tmpdir.pytest_configure(config) 
    _pytest.fixtures.pytest_sessionstart(session) 
    _pytest.runner.pytest_sessionstart(session) 

    def func(testdir): 
     return testdir 

    parent = _pytest.python.Module('parent', config=config, session=session) 
    function = _pytest.python.Function(
     'func', parent, callobj=func, config=config, session=session) 
    _pytest.fixtures.fillfixtures(function) 
    testdir = function.funcargs['testdir'] 

Die Hauptidee besteht darin, eine Dummy-Pytest-Sitzung zu erstellen. Das ist ein bisschen schwierig. Es ist kritisch, dass ['-s' in _prepareconfig übergeben wird. Andernfalls wird stdout nicht gedruckt, oder es stürzt ab, wenn es in IPython ausgeführt wird.

Bei einer Barebone-Konfiguration und -Sitzung besteht der nächste Schritt darin, die Fixture-Funktionalität, die Sie verwenden möchten, manuell zu laden. Dies bedeutet, dass Sie die Hooks manuell aufrufen müssen, die Pluggy normalerweise für Sie erledigt. Ich habe diese gefunden, indem ich auf den Attributfehler geschaut habe, den ich bekommen habe, als ich versucht habe, Code ohne sie auszuführen. Normalerweise ist es nur aufgrund der Sitzung oder Konfiguration fehlt ein erforderliches Attribut. Es kann einen besseren Weg geben, dies zu tun (automatisch über Pluggy).

Als nächstes erstellen wir eine Funktion, die das spezifische Gerät anfragt, an dem wir interessiert sind. Es liegt an Ihnen zu wissen, wie diese Namen lauten. Schließlich richten wir eine Dummy-Modul/Funktion Baumstruktur und Aufruf fillfixtures, die die Magie macht. Die funcargs enthält dann ein Wörterbuch dieser gebrauchsfertigen Objekte. Seien Sie vorsichtig, wenn Sie etwas Teardown-Funktionalität erwarten. Ich bin mir nicht sicher, ob das das deckt, aber ich brauche es nicht wirklich für das, was ich tue.

Hoffe das hilft jemand anderem. Hinweis: Dieses Gespräch half mir zu verstehen, was unter der Haube in pytest etwas besser passiert: https://www.youtube.com/watch?v=zZsNPDfOoHU

Verwandte Themen