захват stdout и stderr с помощью capsys - PullRequest
3 голосов
/ 30 марта 2020

У меня есть код, где мне нужно проверить, не введен ли пароль. Если да, распечатайте сообщение и выйдите из скрипта.

Я использую pytest для проверки этого кода и захвата вывода с помощью приспособления capsys. Но capsys.readouterr() не захватывает выходные данные.

Код для тестирования

def get_password():
    password = getpass.getpass('Password required :', stream=None)
    if not password:
        print("NoPasswordError: Password not provided.Exiting from run")
        '''return -1'''
        sys.exit(-1)
    else:
        return password

код Pytest

def test_input_validation_nopass(self,getpass,capsys):
    getpass.return_value = ''
    get_password()
    out, err = capsys.readouterr()
    sys.stdout.write(out)
    assert re.match('NoPasswordError',out,re.I)

Однако если я удаляю sys.exit и ставлю return, вывод захватывается. В настоящее время я получаю ниже ошибка:

pytest -q UnitTest.py -k test_input_validation_nopass -rx -rP
F                                                                                                                                                                 [100%]
=============================================================================== FAILURES ================================================================================
________________________________________________________________ TestClass.test_input_validation_nopass _________________________________________________________________

self = <UnitTest_buildUpgrade.TestClass object at 0x10d179978>, getpass = <MagicMock name='getpass' id='4514617832'>
capsys = <_pytest.capture.CaptureFixture object at 0x10d179a20>

    def test_input_validation_nopass(self,getpass,capsys):
        getpass.return_value = ''
>       get_password()

UnitTest_buildUpgrade.py:78: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

    def get_password():
        password = getpass.getpass('Password required :', stream=None)
        if not password:
            print("NoPasswordError: Password not provided .Exiting from run")
            '''return -1'''
>           sys.exit(-1)
E           SystemExit: -1

CitrixADCUpgrade.py:19: SystemExit
------------------------------------------------------------------------- Captured stdout call --------------------------------------------------------------------------
NoPasswordError: Password not providedExiting from run
1 failed, 7 deselected in 0.45s

1 Ответ

4 голосов
/ 30 марта 2020

Вызов sys.exit повысит SystemExit. Вам нужно поймать это исключение в тесте:

import pytest

def test_input_validation_nopass(getpass, capsys):
    getpass.return_value = ''
    with pytest.raises(SystemExit):
        get_password()
    out, err = capsys.readouterr()
    assert re.match('NoPasswordError', out, re.I)
...