1. Pytest环境配置的常见坑点第一次用Pytest时我在PyCharm里死活跑不起来测试用例后来才发现这破玩意儿默认用的是unittest运行器。如果你也遇到类似问题别急着砸键盘按这个步骤操作打开PyCharm设置File - Settings找到Python Integrated Tools里的Testing选项把Default test runner从unittest改成pytest删掉所有旧的unittest运行配置搞定之后记得重启PyCharm这时候右键运行测试文件就能看到pytest的小绿条了。有个细节要注意测试文件必须用test_开头命名测试函数也要用test_开头这是pytest的默认识别规则。环境装好后我建议先跑个简单测试验证下# test_sample.py def add(a, b): return a b def test_add(): assert add(1, 2) 3用命令行执行pytest -v如果看到绿色的PASSED就说明环境OK。要是报错说pytest命令找不到八成是Python环境没配好可以用python -m pytest试试。2. 测试用例编写的实战技巧2.1 参数化测试的坑参数化测试是pytest的王牌功能但新手经常在这里翻车。比如这个例子import pytest pytest.mark.parametrize(a,b,expected, [ (1, 2, 3), (4, 5, 9), (hello, world, hello world) ]) def test_concat(a, b, expected): assert a b expected看起来没问题对吧但如果参数里有中文描述控制台输出就会变成unicode编码。解决方法是在conftest.py里加个钩子def pytest_collection_modifyitems(items): for item in items: item.name item.name.encode(utf-8).decode(unicode_escape) item._nodeid item.nodeid.encode(utf-8).decode(unicode_escape)2.2 Fixture的使用陷阱Fixture是pytest的依赖注入机制但作用域(scope)设置不对会引发诡异问题。比如这个session级fixturepytest.fixture(scopesession) def db_conn(): conn create_db_connection() yield conn conn.close()如果多个测试用例修改了conn的状态后面的测试就会在脏数据上运行。正确的做法是根据需要选择function或module作用域或者在yield后重置状态。3. 测试报告生成问题排查3.1 HTML报告中文乱码用pytest-html生成报告时中文标题经常显示为乱码。这是因为plugin.py文件里的编码问题找到site-packages/pytest_html/plugin.py约140行处修改# 原代码 self.test_id report.nodeid.encode(utf-8).decode(unicode_escape) # 修改为 self.test_id re.sub(r(\\u[\s\S]{4}), lambda x: x.group(1).encode(utf-8).decode(unicode-escape), report.nodeid)3.2 日志文件覆盖问题默认配置下每次运行测试都会覆盖之前的日志。要保留历史日志需要修改logging.py文件# 找到site-packages/_pytest/logging.py约552行 self.log_file_handler _FileHandler(log_file, modew, encodingUTF-8) # 改为追加模式 self.log_file_handler _FileHandler(log_file, modea, encodingUTF-8)如果想每天生成一个日志文件可以这样改import time log_file_s log_file.partition(.) log_file log_file_s[0] time.strftime(_%Y_%m_%d) log_file_s[1] log_file_s[2]4. 配置文件与插件问题4.1 pytest.ini存放位置pytest.ini必须放在项目根目录否则里面的路径配置会出问题。比如[pytest] testpaths tests norecursedirs .venv log_file logs/pytest.log所有路径都是相对于pytest.ini所在目录解析的。我曾经把它放在子目录里结果测试用例死活找不到排查了半天才发现这个问题。4.2 插件冲突解决安装多个插件时可能会遇到冲突比如同时用pytest-xdist和pytest-cov。这时候可以尝试按正确顺序安装插件pip install pytest-cov pytest-xdist在pytest.ini中调整插件加载顺序使用-p参数手动控制插件加载遇到unrecognized arguments错误时先检查插件是否安装正确。比如报错pytest: error: unrecognized arguments: --count2就需要先安装pytest-repeat插件。