测试一个从用户输入的函数(python)

时间:2014-10-28 13:42:15

标签: python unit-testing mocking

以下功能从用户获取密码。我需要使用单元测试/(模拟)来测试它。

def create_auth():
    username = '{user}'.format(user=getpass.getuser())
    pwd = getpass.getpass()
    auth_string = '{username}:{pwd}'.format(username=username, pwd=pwd)
    return auth_string

我是python的新手,任何提示都会有所帮助

由于

2 个答案:

答案 0 :(得分:6)

一般来说,您应该始终将用户输入与程序/业务逻辑分开

def create_auth_interactive():
    return create_auth(getpass.getuser(), getpass.getpass())

def create_auth(user, pwd):
    username = '{user}'.format(user=user) # do you really need this line??
    auth_string = '{username}:{pwd}'.format(username=username, pwd=pwd)
    return auth_string

这使您的代码更易于维护:

  • 您的核心逻辑与用户输入是分开的,因此您可以轻松切换将来输入的位置(可能您希望在HTTP或RPC服务器上公开您的程序?或者从GUI而不是从GUI获取输入CLI)
  • 您可以在不进行嘲笑的情况下进行单元测试。模拟是非常有用的,但是如果你发现随着时间的推移你需要嘲笑越来越多的东西,这很好地表明你的代码没有跟随separation of concerns。请查看dependency injection

  • 使用输入值列表构建多个测试用例要容易得多(但有些人更愿意进行多项独立测试,请与您的团队/项目核实)

答案 1 :(得分:3)

使用mock.patch

class TestCreateAuth(unittest.TestCase):
    @mock.patch('getpass.getpass')
    @mock.patch('getpass.getuser')
    def test_create_auth(self, getuser, getpw):
        getuser.return_value = 'user'
        getpw.return_value = 'pass'
        self.assertEqual(create_auth(), 'user:pass')