Проверьте, если __name__ == "__main__": с помощью click и pytest - PullRequest
0 голосов
/ 20 марта 2019

У меня есть следующий код в test.py:

import click

@click.command()
@click.option('--text', default='hello world', help='Text to display.')
def say(text):

    print(text)


if __name__ == "__main__":

    say()

Если я вызываю это в командной строке, это работает:

python test.py --text=hi!
>>hi!

Если я хочу проверить свой код, я бы использовал:

from click.testing import CliRunner


runner = CliRunner()
result = runner.invoke(test.say, ['--text=blablabla'])

assert result.output == 'blablabla

Это тоже работает.

Однако, если я проведу свой тест через cover.py, я увижу, что код под if __name__ == "__main__": не тестируется. Есть ли способ достичь этого?

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Возможно, вы не понимали, что коды ниже __name__ == "__main__" никогда не вызывались вашим тестовым кодом

result = runner.invoke(test.say, ['--text=blablabla'])

Даже если вы измените «test.py», как этот, ваш тест не будет жаловаться.

if __name__ == "__main__":
    raise RuntimeError("Something is wrong")
    say()

Причина в том, что __name__ == "__main__" будет ложным, если импортирован файл модуля "test.py". Поэтому любые коды внутри предложения if будут игнорироваться.

Чтобы получить 100% охват, введите команду напрямую

$ coverage run test.py --text=blablabla
  blablabla
$ coverage report
  Name      Stmts   Miss  Cover                                                                                                             
  -----------------------------                                                                                                             
  test.py       6      0   100%  
0 голосов
/ 20 марта 2019

__name__ != "__main__" , если вы звоните из другого модуля.

Что должно работать:

import click

@click.command()
@click.option('--text', default='hello world', help='Text to display.')
def say(text):

    print(text)

say()

Посмотрите этот другой SO ответ, если вы не хотите делать это таким образом. https://stackoverflow.com/a/5850364/10813463

...