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

求助:如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:54:53