私は私がテストしたいのですが、以下の機能を持っている:テスト複数コール()
# Ask user input, returns year
def what_year():
# Get the first input from the user.
year = input('\n\tEnter the year you would like to START your range: \n\t')
# Catch the error if the user doesn't enter a convertable string.
try:
year = int(year)
except ValueError:
print(error_msg.format(year))
what_year()
# We only want years between 2005 and today's year.
if year not in range(2005, int(datetime.now().year +1)):
print(error_msg.format(year))
what_year()
return year
理想的な機能は、継続的になるので、私は、任意のエラーを発生させることなく、それをテストしたいと思いますユーザが許容可能な入力を入力するまで、エラーを発生させることなくループする。
pytestに入力をループさせる方法が分かりません。私は、mockでbuiltins.inputを修正しようとしています。それは関数に指定された入力を与えるように動作しますが、テストは入力リストをうまくループすることができれば理想的です。
たとえば、私のテストコードでは、実際には、ユーザーはすべての無効なオプションを最初に実行し、最後に有効なオプションを入れることになり、関数は最終的に "year"を返し始めます。
私は大まかによるデバッグはテスト目的のためにあるが、これは初歩的なようであれば、値の誤差を上げ、私の各機能のデバッグパラメータを作成し、これを回避ました:
機能:
# Ask user input, returns year
def what_year(debug=False):
# Get the first input from the user.
year = input('\n\tEnter the year you would like to START your range: \n\t')
# Catch the error if the user doesn't enter a convertable string.
try:
year = int(year)
except ValueError:
# Only raise ValueError if debug is on for testing purposes.
if debug:
raise ValueError
print(error_msg.format(year))
what_year(debug)
# We only want years between 2005 and today's year.
if year not in range(2005, int(datetime.now().year +1)):
if debug:
raise ValueError
print(error_msg.format(year))
what_year(debug)
return year
テスト:
import mock
import pytest
from redditimagescraper import RedditImageScraper
@pytest.mark.parametrize('invalid_years', ["9999", "0", "", " ", "-2015"])
def test_what_year_invalid(invalid_years):
# Test invalid years
with pytest.raises(ValueError):
with mock.patch('builtins.input', return_value=invalid_years):
RedditImageScraper.what_year(True)
@pytest.mark.parametrize('valid_years', [str(year) for year in range(2005,2018)])
def test_what_year_valid(valid_years):
# Test valid years
with mock.patch('builtins.input', return_value=valid_years):
assert RedditImageScraper.what_year(True) == int(valid_years)
任意のアイデアより簡単に入力をテストするには、この機能やテスト機能を書き換えますか?
Pythonでループするために再帰を使用しないでください、 'while'ループを使います。しかし、あなたが再帰呼び出しを使用する場合は、再帰呼び出しが返すものを返さなければなりません: 'return what_year(debug)' – Barmar
whileループに変更すると、pytestループはすべての入力呼び出しでparamsをループしますか?または、return_valueをside_effectに変更し、パラメータを削除し、無効で有効な年のリストを与える必要がありますか? – Ardeezy
申し訳ありませんが、私はpytestについて何も知らない。しかし、単体テストフレームワークに合わせてコードデザインを変更する必要はありません。 – Barmar