【发布时间】:2020-05-21 16:09:34
【问题描述】:
我在单元测试方面有点初学者,但仍在尝试熟悉其中的一些内容。这是我自己项目的一部分,我一直坚持如何全面测试它。
在这个方向上已经有一个问题,但它只关心如何反复询问用户输入,而不是如何对它进行单元测试。
目标:
我有一个要求用户输入并在输入无效时重复请求的功能。我的目标是弄清楚如果用户提供无效输入,如何测试输入请求是否重复。我的意思是,我正在尝试测试在定义的情况下重复输入请求的机制是否按预期工作。
守则:
该函数要求用户提供一个正则表达式,并将其编译为来自重新打包(python 标准库)的 SRE_Pattern 对象。如果用户提供了一个输入并且它不是一个有效的表达式,那么输入请求会被重复。
import re
def request_regex_pattern(input_message):
regex_pattern = None
while True:
regex = input(input_message)
if not regex:
print("No Regex provided.")
break
try:
regex_pattern = re.compile(regex, re.IGNORECASE)
break
except re.error:
print("The input was not valid regular expression")
continue
return regex_pattern
到目前为止的测试:
到目前为止,我可以测试的是,对于有效输入(例如\d\d),我是否使用模拟得到正确的输出(该正则表达式的SRE_Patternobject)。
import unittest as ut
from unittest import mock
import re
class TestUserInput(ut.TestCase):
def test_request_regex_pattern(self):
with mock.patch('builtins.input', return_value='\d\d'):
test_pattern = request_regex_pattern('')
test_string = '01'
self.assertIsNotNone(test_pattern.match(test_string))
我已经考虑过这个问题并在谷歌上搜索了一段时间,但无法得到令人满意的答案。
有没有一种明智的方法来测试输入请求是否被重复? 那里有哪些最佳实践?
对于解决方案,使用 python 的默认 unittest 库不是强制性的。但是,通常会首选使用标准库的解决方案,因为这样可以减少我正在处理的项目所需的需求数量。
非常感谢您的宝贵时间!
【问题讨论】:
-
我最近回复了somewhat similar question - 请检查这是否对您有帮助。
-
@MrBeanBremen Heyya,谢谢你的提示!这些问题看起来确实非常相似,我认为您在那里推荐的内容很可能也适用于此,但我不太了解用于测试的代码,无论是问题还是答案。我知道,与我的第一次测试类似,您修补了内置输入,但是在问答中用于修补的语法让我很困惑。
-
@MrBeanBremen 我想我在那里掌握了一些你的答案,是不是通过修补通用打印函数以在执行实际操作时抛出异常,它会触发“除外”部分main() 中第一个 while 循环的 try-except 语句,触发仅在此处发生的字符串的打印,然后使用 mock_print.assert_call_with() 您可以断言任何打印调用的存在(因为通常打印已修补)与仅出现在该特定“catch”位中的字符串('您需要输入一个数字!')?
-
是的,你没看错。如果需要,我可以整理一个更具体的答案,但看起来你已经得到了这个:)
-
@MrBeanBremen 那么非常感谢您的提示!我想我会根据您在那里建议的回复写出适合此代码的答案。不过,补丁中的语法差异让我很好奇(特别是考虑到最佳实践/最佳可读性的问题)。你愿意评论一下在哪种情况下人们会更喜欢其中一种吗?
标签: python python-3.x unit-testing input