gpt4 book ai didi

python - 测试对 input() 的多次调用

转载 作者:行者123 更新时间:2023-11-28 18:23:41 25 4
gpt4 key购买 nike

我想测试以下功能:

# 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)

关于如何重写此函数或测试函数以更轻松地测试输入有什么想法吗?

最佳答案

不知道为什么,但 Barmar 对我的问题的评论让我兴奋不已。

无论如何,这里是给看过问题的人的答案。根据 Barmar 的评论,我还更新了我的功能。

what_year() 函数:

# Ask user input, returns year
def what_year(start_or_end):
while True:
try:
# Catch the error if the user doesn't enter a convertable string.
# Get input from the user.
year = int(input('\n\tEnter the year you would like to {} your range: '.format(start_or_end)))

# We only want years between 2005 and today's year.
if year in range(2005, int(datetime.now().year + 1)):
# Success!
break
else:
print(error_msg.format(year))
except:
print(error_msg.format('ValueError'))
pass

return year

测试函数:

# Parametrize my valid answers
@pytest.mark.parametrize('valid_year', [str(year) for year in range(2005, datetime.now().year + 1)])
def test_what_year(valid_year):

# years = a bunch of invalid inputs with a valid input at the end
years = ["9999", "0", "", " ", "-2015", "-30", str(10^1000), valid_year]

# side_effect, when given an iterable, iterates through
# each time the patched function is called (in this case input())
with mock.patch('builtins.input', side_effect=years):
assert RedditImageScraper.what_year('start') == int(valid_year)

运行 pytest -v 给我这个:

============================= test session starts ==============================
platform linux -- Python 3.6.0, pytest-3.0.7, py-1.4.33, pluggy-0.4.0 -- /home/ardeaf/Projects/RedditImageScraper/venv/bin/python3
cachedir: .cache
rootdir: /home/ardeaf/Projects/RedditImageScraper, inifile: setup.cfg
collecting ... collected 12 items

tests/RedditImageScraper_test.py::test_what_year[2005] PASSED
tests/RedditImageScraper_test.py::test_what_year[2006] PASSED
tests/RedditImageScraper_test.py::test_what_year[2007] PASSED
tests/RedditImageScraper_test.py::test_what_year[2008] PASSED
tests/RedditImageScraper_test.py::test_what_year[2009] PASSED
tests/RedditImageScraper_test.py::test_what_year[2010] PASSED
tests/RedditImageScraper_test.py::test_what_year[2011] PASSED
tests/RedditImageScraper_test.py::test_what_year[2012] PASSED
tests/RedditImageScraper_test.py::test_what_year[2013] PASSED
tests/RedditImageScraper_test.py::test_what_year[2014] PASSED
tests/RedditImageScraper_test.py::test_what_year[2015] PASSED
tests/RedditImageScraper_test.py::test_what_year[2016] PASSED
tests/RedditImageScraper_test.py::test_what_year[2017] PASSED

========================== 12 passed in 0.31 seconds ===========================

关于python - 测试对 input() 的多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43087191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com