求助:如何用pytest为自定义Python游戏函数编写测试用例
测试方案与修正
现有测试的问题
当前test_get_number_of_people存在逻辑错误:get_people函数不需要接收参数,它通过input()获取用户输入,直接传参"8"会触发参数不匹配的异常,并非预期的测试逻辑。针对这类依赖用户输入的函数,需要用pytest的monkeypatch工具模拟输入,而非直接传参。
逐个函数编写测试
1. 测试get_people函数
该函数负责获取3-8之间的玩家数量,需验证合法输入、非法输入(数值范围外、非数字)的处理逻辑:
def test_get_people_valid_input(monkeypatch): # 模拟输入合法数值8 monkeypatch.setattr('builtins.input', lambda _: '8') assert get_people() == 8 def test_get_people_below_min(monkeypatch): # 先输入小于3的2,再输入合法的5 inputs = iter(['2', '5']) monkeypatch.setattr('builtins.input', lambda _: next(inputs)) assert get_people() == 5 def test_get_people_non_numeric(monkeypatch): # 先输入非数字字符串,再输入合法的6 inputs = iter(['abc', '6']) monkeypatch.setattr('builtins.input', lambda _: next(inputs)) assert get_people() == 6
2. 测试bet函数
该函数获取正整数赌注,需验证合法输入、0/负数、非数字输入的处理:
def test_bet_valid_positive(monkeypatch): monkeypatch.setattr('builtins.input', lambda _: '10') assert bet() == 10 def test_bet_zero_input(monkeypatch): # 先输入0,再输入合法的5 inputs = iter(['0', '5']) monkeypatch.setattr('builtins.input', lambda _: next(inputs)) assert bet() == 5 def test_bet_non_numeric(monkeypatch): # 先输入非数字字符串,再输入合法的15 inputs = iter(['ten', '15']) monkeypatch.setattr('builtins.input', lambda _: next(inputs)) assert bet() == 15
3. 测试get_names函数
该函数会修改全局players列表,测试前后需清空列表避免干扰。验证输入的名字是否被正确格式化,玩家字典是否符合预期:
import pytest from project import get_names, players @pytest.fixture(autouse=True) def reset_players(): # 测试前后自动清空players列表 players.clear() yield players.clear() def test_get_names(monkeypatch): # 模拟输入两个名字:alice、bob inputs = iter(['alice', 'bob']) monkeypatch.setattr('builtins.input', lambda _: next(inputs)) get_names(2) assert len(players) == 2 assert players[0]['name'] == 'Alice' assert players[0]['chips'] == 3 assert players[1]['name'] == 'Bob' assert players[1]['chips'] == 3
4. 测试run_game函数
该函数涉及随机投掷和游戏循环,需固定随机结果避免测试不稳定,验证筹码变化和游戏结束条件:
def test_run_game_roll_L(monkeypatch): test_players = [ {'name': 'Alice', 'chips': 1}, {'name': 'Bob', 'chips': 3} ] # 固定随机投掷结果为'L' monkeypatch.setattr('random.choice', lambda _: 'L') # 模拟游戏结束条件:仅Alice有筹码且投出🔴 def mock_choice(chips_list): # 第一次投L,第二次投🔴触发结束 if not hasattr(mock_choice, 'called'): mock_choice.called = True return 'L' return '🔴' monkeypatch.setattr('random.choice', mock_choice) run_game(test_players) # 验证投L后的筹码变化:Alice投L给左边的Bob,Alice筹码-1,Bob筹码+1,之后投🔴回到初始值 assert test_players[0]['chips'] == 1 assert test_players[1]['chips'] == 3 def test_run_game_end_condition(monkeypatch): test_players = [ {'name': 'Winner', 'chips': 1}, {'name': 'Loser1', 'chips': 0}, {'name': 'Loser2', 'chips': 0} ] # 固定投出🔴触发游戏结束 monkeypatch.setattr('random.choice', lambda _: '🔴') run_game(test_players) # 游戏结束时Winner的筹码保持1(投🔴:+1后-1) assert test_players[0]['chips'] == 1
内容的提问来源于stack exchange,提问作者user23800117
相关产品推荐
相关产品推荐

