【问题标题】:How to test a function call using Python and unittest library如何使用 Python 和 unittest 库测试函数调用
【发布时间】:2024-05-03 18:40:02
【问题描述】:

我刚刚问了一个问题,您如何为以下函数编写测试?这是我对所涵盖部分的测试,但我不确定如何更改测试以涵盖打印语句并再次调用get_employee_name 函数。任何帮助将不胜感激!

这是我测试覆盖部分的代码:

DATA = {
"employee_name": "Brian Weber",
"minutes": 120,
"task_name": "Surfing",
"notes": "These are my notes.",
"date": "2016-12-25"
}
​
​
class WorkLogTests(unittest.TestCase):
    def test_get_employee_name(self):
        with mock.patch('builtins.input',
            return_value=DATA["employee_name"]):
            assert worklog.get_employee_name() == DATA["employee_name"]

【问题讨论】:

  • ...真的吗?!那么,您认为在什么情况下会执行这些线路?
  • 好吧,如果没有输入,那么这部分代码就会运行。很抱歉在这里进行测试。
  • 不,我不是这么说的。如果要覆盖这些行,则需要使用 不同的 输入数据编写另一个测试。这将说明为什么您当前的实现被破坏了。另外,请注意递归不是最好的方法。参见例如*.com/q/23294658/3001761.
  • 好的,我会使用 side_effect 属性来使用不同的输入数据吗?我只是对如何编写测试的语法感到困惑。
  • 你试过了吗?发生了什么?

标签: python unit-testing python-unittest python-mock


【解决方案1】:

如果用户没有输入任何内容,我遇到的第一个问题是使用递归。因此,如果没有用户输入,我将代码重构为使用 continue 的 while 循环。 这是新代码和覆盖所有行的测试:

def get_employee_name():
    """Prompt the employee for their name."""
    while True:
        employee_name = input("Enter employee name: ")
        if len(employee_name) == 0:
            print("\nYou must enter your name!\n")
            continue
        else:
            return employee_name

def test_get_employee_name(self):
    with mock.patch('builtins.input', side_effect=["", "Brian Weber"],
        return_value=DATA["employee_name"]):
        assert worklog.get_employee_name() == DATA["employee_name"]

【讨论】: