如何编写带有两个输入函数的单元测试函数?
如何编写带有两个输入函数的单元测试函数?
我懂你的痛点——这个get_dictionary()函数里前后调用了两次input():一次用来获取订单总数,另一次在循环里逐个获取每笔订单的客户、披萨名称和数量。直接跑测试的话总需要手动输入,根本没法自动化测试对吧?别慌,咱们可以用Python自带的unittest.mock模块来模拟input的返回值,轻松搞定单元测试。
先把你的原函数代码放出来方便参考:
name_of_numbers = {1: 'Первый', 2: 'Второй', 3: 'Третий', 4: 'Червертый', 5: 'Пятый', 6: 'Шестой', 7: 'Седьмой', 8: 'Восьмой', 9: 'Девятый', 10: 'Десятый', 11: 'Одиннадцатый', 12: 'Двенадцатый', 13: 'Тринадцатый', 14: 'Четырнадцатый', 15: 'Пятнадцатый', 16: 'Шестнадцатый', 17: 'Семнадцатый', 18: 'Восемнадцатый', 19: 'Девятнадцатый'} def get_dictionary() -> dict: database = dict() amount_of_orders = int(input('Количество заказов: ')) for number in range(1, amount_of_orders + 1): customer, pizza_name, count = input(f'{name_of_numbers[number]} заказ: ').split() if customer in database: if pizza_name in database[customer]: database[customer][pizza_name] += int(count) else: database[customer][pizza_name] = int(count) else: database[customer] = dict({pizza_name: int(count)}) return database
核心测试思路
我们需要用unittest.mock.patch替换掉内置的input函数,让它在测试时返回我们预先设定好的输入值,完全不需要手动操作。下面给你两个典型测试场景的例子:
测试代码示例
import unittest from unittest.mock import patch from your_module import get_dictionary # 这里替换成你存放原函数的模块文件名 class TestGetDictionary(unittest.TestCase): @patch('builtins.input') def test_multiple_different_customers(self, mock_input): # 预设输入序列:先输入订单数量2,再输入两笔不同客户的订单 mock_input.side_effect = [ '2', 'Иван Пепперони 3', 'Мария Маргарита 2' ] # 定义我们期望得到的结果字典 expected_result = { 'Иван': {'Пепперони': 3}, 'Мария': {'Маргарита': 2} } # 调用原函数并断言结果符合预期 self.assertEqual(get_dictionary(), expected_result) @patch('builtins.input') def test_same_customer_repeat_order(self, mock_input): # 预设输入序列:订单数量2,同一个客户两次订购同一种披萨 mock_input.side_effect = [ '2', 'Иван Пепперони 3', 'Иван Пепперони 2' ] expected_result = { 'Иван': {'Пепперони': 5} } self.assertEqual(get_dictionary(), expected_result) if __name__ == '__main__': unittest.main()
关键细节说明
@patch('builtins.input')装饰器会自动创建一个模拟的input对象,并把它作为参数传入测试函数side_effect属性用来指定每次调用input时的返回值,顺序必须和原函数中调用input的顺序完全对应:第一个值对应订单数量的输入,后面的每个值对应一笔订单的输入- 你可以根据需求扩展更多测试场景,比如同一个客户订购不同披萨、订单数量为1、订单数量为0(此时函数会返回空字典)等情况
备注:内容来源于stack exchange,提问作者Дмитрий Сатлер
相关产品推荐
相关产品推荐

