You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写带有两个输入函数的单元测试函数?

如何编写带有两个输入函数的单元测试函数?

我懂你的痛点——这个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,提问作者Дмитрий Сатлер

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 13:25:31