Hoe kan ik de normale afdrukuitvoer zien die is gemaakt tijdens pytest-run?

Soms wil ik gewoon wat printstatements in mijn code invoegen en kijken wat er wordt afgedrukt als ik het oefen. Mijn gebruikelijke manier om het te “oefenen” is met bestaande pytest-tests. Maar als ik deze uitvoer, lijk ik geen standaarduitvoer te kunnen zien (tenminste vanuit PyCharm, mijn IDE).

Is er een eenvoudige manier om de standaarduitvoer te zien tijdens een pytest-run?


Antwoord 1, autoriteit 100%

De -s-schakelaarschakelt het vastleggen per test uit (alleen als een test mislukt).

-sis gelijk aan --capture=no.


Antwoord 2, autoriteit 21%

pytest legt de stdout van individuele tests vast en geeft ze alleen onder bepaalde voorwaarden weer, samen met de samenvatting van de tests die standaard worden afgedrukt.

Extra overzichtsinformatiekan worden weergegeven met de ‘-r’ optie:

pytest -rP

toont de vastgelegde uitvoer van geslaagde tests.

pytest -rx

toont de vastgelegde uitvoer van mislukte tests (standaardgedrag).

De opmaak van de uitvoer is mooier met -r dan met -s.


Antwoord 3, autoriteit 7%

In een opgewaardeerde opmerkingnaar het geaccepteerde antwoord, Joevraagt:

Is er een manier om naar de console af te drukken ENde uitvoer vast te leggen zodat deze wordt weergegeven in het junit-rapport?

In UNIX wordt dit gewoonlijk teeinggenoemd. Idealiter zou afslaan in plaats van vastleggen de py.test-standaard zijn. Niet ideaal, noch py.test, noch enige bestaande externe py.test-plug-in (…die ik ken, in ieder geval) ondersteunt afslaan – ondanks dat Python triviaal afslaan ondersteunt out-of-the-box.

Monkey-patching py.test om ietste doen dat niet wordt ondersteund, is niet triviaal. Waarom? Omdat:

  • De meeste py.test-functionaliteit is vergrendeld achter een privé _pytest-pakket nietbedoeld om extern te worden geïmporteerd. Als u dit probeert te doen zonder te weten wat u doet, resulteert dit meestal in het openbare pytest-pakket dat tijdens runtime obscure uitzonderingen genereert. Heel erg bedankt, py.test. Echt robuuste architectuur heb je daar.
  • Zelfs als je welweet hoe je de privé _pytestAPI op een veilige manier kunt patchen, moet je dit voordatdoen het uitvoeren van het openbare pytest-pakket dat wordt uitgevoerd door de externe opdracht py.test. U kuntdit niet doen in een plug-in (bijv. een conftest-module op het hoogste niveau in uw testsuite). Tegen de tijd dat py.test er lui toe komt om je plug-in dynamisch te importeren, is elke py.test-klasse die je wilde apen-patchen al lang geïnstantieerd – en je hebt geentoegang tot die instantie. Dit houdt in dat, als u wilt dat uw monkey-patch zinvol wordt toegepast, u het externe py.test-commando niet langer veilig kunt uitvoeren. In plaats daarvan moet je het uitvoeren van die opdracht omwikkelen met een aangepaste setuptools test-opdracht die (in volgorde):
    1. Monkey-patcht de privé _pytestAPI.
    2. Roept de openbare functie pytest.main()aan om de opdracht py.testuit te voeren.

Dit antwoord monkey-patches py.test’s -sen --capture=noopties om stderr maar nietstdout vast te leggen. Deze opties leggen standaard noch stderr noch stdout vast. Dit is natuurlijk niet helemaal denderend. Maar elke geweldige reis begint met een vervelende prequel die iedereen over vijf jaar vergeet.

Waarom doe je dit? Ik zal het je nu vertellen. Mijn py.test-gestuurde testsuite bevat trage functionele tests. Het weergeven van de standaard van deze tests is nuttig en geruststellend, omdat het voorkomt dat leycecnaar killall -9 py.testwanneer weer een langlopende functionele test wekenlang niets oplevert. Het weergeven van de stderr van deze tests verhindert echter dat py.test tracebacks van uitzonderingen op testfouten rapporteert. Wat totaal nutteloos is. Daarom dwingen we py.test om stderr vast te leggen, maar nietstdout.

Voordat we er aan beginnen, gaat dit antwoord ervan uit dat je al een aangepast setuptools testcommando hebt dat py.test aanroept. Als je dat niet doet, bekijk dan de Handmatige integratiesubsectie van de goed geschreven pagina met goede praktijkenvan py.test.

Installeer nietpytest-runner, een derde -party setuptools plug-in die een aangepast setuptools testcommando levert dat ook py.test aanroept. Als pytest-runner al is geïnstalleerd, moet u waarschijnlijk dat pip3-pakket verwijderen en vervolgens de handmatige aanpak gebruiken waarnaar hierboven is gelinkt.

Ervan uitgaande dat u de instructies in Handmatige integratiehierboven gemarkeerd, zou uw codebase nu een PyTest.run_tests()methode moeten bevatten. Pas deze methode aan zodat deze lijkt op:

class PyTest(TestCommand):
             .
             .
             .
    def run_tests(self):
        # Import the public "pytest" package *BEFORE* the private "_pytest"
        # package. While importation order is typically ignorable, imports can
        # technically have side effects. Tragicomically, that is the case here.
        # Importing the public "pytest" package establishes runtime
        # configuration required by submodules of the private "_pytest" package.
        # The former *MUST* always be imported before the latter. Failing to do
        # so raises obtuse exceptions at runtime... which is bad.
        import pytest
        from _pytest.capture import CaptureManager, FDCapture, MultiCapture
        # If the private method to be monkey-patched no longer exists, py.test
        # is either broken or unsupported. In either case, raise an exception.
        if not hasattr(CaptureManager, '_getcapture'):
            from distutils.errors import DistutilsClassError
            raise DistutilsClassError(
                'Class "pytest.capture.CaptureManager" method _getcapture() '
                'not found. The current version of py.test is either '
                'broken (unlikely) or unsupported (likely).'
            )
        # Old method to be monkey-patched.
        _getcapture_old = CaptureManager._getcapture
        # New method applying this monkey-patch. Note the use of:
        #
        # * "out=False", *NOT* capturing stdout.
        # * "err=True", capturing stderr.
        def _getcapture_new(self, method):
            if method == "no":
                return MultiCapture(
                    out=False, err=True, in_=False, Capture=FDCapture)
            else:
                return _getcapture_old(self, method)
        # Replace the old with the new method.
        CaptureManager._getcapture = _getcapture_new
        # Run py.test with all passed arguments.
        errno = pytest.main(self.pytest_args)
        sys.exit(errno)

Om deze aap-patch in te schakelen, voer je py.test als volgt uit:

python setup.py test -a "-s"

Stderr maar nietstdout wordt nu vastgelegd. Handig!

Het uitbreiden van de bovenstaande aap-patch naar tee stdout en stderr wordt overgelaten als een oefening voor de lezer met een vat vol vrije tijd.


Antwoord 4, autoriteit 7%

Gebruik bij het uitvoeren van de test de optie -s. Alle afdrukinstructies in exampletest.pyworden afgedrukt op de console wanneer de test wordt uitgevoerd.

py.test exampletest.py -s

Antwoord 5, autoriteit 5%

Volgens pytest-documentatie , versie 3 van pytest kan het vastleggen in een test tijdelijk uitschakelen:

def test_disabling_capturing(capsys):
    print('this output is captured')
    with capsys.disabled():
        print('output not captured, going directly to sys.stdout')
    print('this output is also captured')

Antwoord 6, autoriteit 3%

pytest --capture=tee-sysis onlangs toegevoegd (v5.4.0). U kunt zowel de uitvoer vastleggen als bekijken op stdout/err.


Antwoord 7, autoriteit 3%


Probeer pytest -s -v test_login.pyvoor meer informatie in de console.

-vhet is een korte --verbose

-sbetekent ‘alle vastleggen uitschakelen’




Antwoord 8

U kunt ook live-logginginschakelen door de volgen in pytest.iniof tox.iniin de hoofdmap van uw project.

[pytest]
log_cli = True

Of specificeer het direct op cli

pytest -o log_cli=True

Antwoord 9

pytest test_name.py -v -s

Eenvoudig!


Antwoord 10

Als u PyCharm IDE gebruikt, kunt u die individuele test of alle tests uitvoeren met de werkbalk Uitvoeren. Het venster Hulpprogramma Uitvoeren geeft de uitvoer weer die door uw toepassing is gegenereerd en u kunt alle afdrukinstructies daarin zien als onderdeel van de testuitvoer.


Antwoord 11

Ik raad aan om het -h commando te gebruiken. Er kunnen best interessante commando’s voor worden gebruikt.
maar voor dit specifieke geval: -ssnelkoppeling voor –capture=no.is genoeg

pytest <test_file.py> -s

Antwoord 12

Als u logginggebruikt, moet u specificeren dat u naast -sook de logoutput wilt inschakelen voor generieke stdout. Op basis van Logging binnen pytest-tests, gebruik ik:

pytest --log-cli-level=DEBUG -s my_directory/

Other episodes