如何用pytest测试函数无无限循环?避免程序挂起的单元测试
没问题,我来帮你设计一套实用的pytest测试用例,既能验证chew_repeated_leading_characters的功能正确性,又能确保它不会出现无限循环或挂起的情况。
用pytest测试函数避免无限循环与挂起
首先,我们需要针对函数的核心逻辑和防挂起机制设计多维度的测试用例,同时可以借助超时机制来强制检测潜在的挂起问题。
测试前准备
先确保你已经安装了必要的依赖(如果需要超时检测功能,额外安装pytest-timeout插件):
pip install pytest pytest-timeout
编写测试用例
创建一个测试文件(比如test_chew.py),内容如下:
import pytest from your_module import chew_repeated_leading_characters # 替换成你的函数所在模块名 def test_normal_functionality(): # 测试正常场景:开头有重复的leader字符 result = chew_repeated_leading_characters("xxxhello world", "x") assert result == "hello world" # 测试多字符leader的重复场景 result = chew_repeated_leading_characters("abababtest", "ab") assert result == "test" def test_empty_leader_raises_error(): # 验证空leader时直接抛出错误,不会进入循环导致挂起 with pytest.raises(ValueError, match="leader cannot be empty"): chew_repeated_leading_characters("any string", "") def test_all_leader_string(): # 测试字符串全是leader的极端场景,确保能处理完成返回空串,不会挂起 result = chew_repeated_leading_characters("aaaaa", "a") assert result == "" result = chew_repeated_leading_characters("ababab", "ab") assert result == "" def test_leader_longer_than_string(): # 测试leader长度大于原字符串的情况,确保直接返回原串不进入循环 result = chew_repeated_leading_characters("short", "longer") assert result == "short" def test_no_leader_at_start(): # 测试开头无leader的场景,确保直接返回原串 result = chew_repeated_leading_characters("hello xxx", "x") assert result == "hello xxx" # 带超时的测试:如果函数真的挂起,会在1秒内终止测试并报错 @pytest.mark.timeout(1) def test_no_infinite_loop_with_timeout(): # 集中测试所有可能触发挂起的边界场景 chew_repeated_leading_characters("aaaaa", "a") chew_repeated_leading_characters("abababtest", "ab") with pytest.raises(ValueError): chew_repeated_leading_characters("test", "")
测试用例说明
- 正常功能测试:验证函数核心逻辑正确的同时,因为这些用例能快速执行完成,侧面证明函数没有挂起。
- 空leader异常测试:确保函数在传入空leader时直接抛出错误,不会进入while循环导致无限挂起。
- 全leader字符串测试:这是最容易触发无限循环的高危场景,验证函数能正确处理并返回空串,不会陷入死循环。
- 超时标记测试:借助
pytest-timeout插件给关键测试设置超时时间(比如1秒),如果函数真的出现无限循环,测试会自动终止并标记失败,避免测试一直挂起占用资源。
运行测试很简单,在终端执行:
pytest test_chew.py -v
这样就能全方位验证你的函数既功能正确,又不会出现无限循环或挂起的问题。
内容的提问来源于stack exchange,提问作者drhagen
相关产品推荐
相关产品推荐

