ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Python pytest极简入门,从零学会专业自动化测试

Python pytest极简入门,从零学会专业自动化测试 文章目录前言一、环境准备二、最小可运行示例三、核心概念1. 自动发现2. 断言即测试3. Fixture四、进阶用法fixture 与参数化五、实战场景测试带异常的代码六、常见坑 / 报错1. collected 0 items2. fixture xxx not found3. 断言失败但看不出原因七、总结与下一步P.S. 无意间发现了一个巨牛的人工智能教程非常通俗易懂对AI感兴趣的朋友强烈推荐去看看 传送门https://blog.csdn.net/qq_34419312前言写代码不写测试跟洗完澡不关水龙头一个性质当时觉得没事等水流一地才开始后悔。你改一行代码崩了三处功能然后在报错堆里灵魂三问——我是谁我在哪我昨天到底改了什么Python 标准库其实有个unittest用起来像在写论文样板代码比业务代码还长。而 pytest 主打一个少废话、多办事——更少的样板代码、更聪明的断言、一堆现成的插件社区主流没跑了。一、环境准备装它一条命令的事比下楼取快递还快pip install pytest装完顺手验证一下pytest --version要求 Python 3.8。版本太老的朋友建议先升级别问我怎么知道的往事不堪回首。最关键的一点装完不用配任何东西。pytest 的哲学是约定大于配置——它默认你是个守规矩的人你只要守规矩就行。二、最小可运行示例假设你有个业务函数放在calc.py里就那种算个加法都怕算错的函数# calc.pydefadd(a,b):returnab然后写测试文件叫test_calc.py。注意暗号文件名要以test_开头函数名也要以test_开头接不上头它就当你不存在。# test_calc.pyfromcalcimportadddeftest_add_int():assertadd(1,2)3deftest_add_str():assertadd(a,b)ab终端敲一个pytestpytest 自动把所有test_*用例捡走执行。绿色 PASSED 亮起那一刻你会产生我也是会写测试的人的错觉。别高兴太早是错觉坑在后面排队呢。三、核心概念1. 自动发现默认找test_*.py或*_test.py里面的函数/类以test_开头。也就是说你只要把名字起对pytest 就像饿了三天突然看到外卖的狗自己就冲过去了。2. 断言即测试直接写 Python 原生的assert失败时它自动把变量值给你打出来明明白白。不用像 unittest 那样写self.assertEqual省下来的时间够你多刷一个短视频。3. Fixture用pytest.fixture准备测试前置数据/资源可复用、可依赖。翻译成人话就是开考前先帮你把草稿纸和笔备好的工具人。四、进阶用法fixture 与参数化fixture 帮你共享数据库连接参数化让你一条用例测多组输入——用最少的代码得罪最多的 bugimportpytestpytest.fixturedefsample_data():return[1,2,3,4]deftest_sum(sample_data):assertsum(sample_data)10pytest.mark.parametrize(a,b,expect,[(1,1,2),(0,0,0),(-1,1,0),])deftest_add(a,b,expect):assertadd(a,b)expect看到没一个函数跑出三组用例报告还给你列得清清楚楚。这叫什么这叫花一份工资雇三个质检员。五、实战场景测试带异常的代码有些代码你希望它该出错时就出错比如除数为零它要是没报错你才要慌。验证方式如下importpytestdefdivide(a,b):ifb0:raiseValueError(b 不能为 0)returna/bdeftest_divide_zero():withpytest.raises(ValueError):divide(1,0)pytest.raises这个上下文管理器专门盯异常类型对不上它就给你脸色看。这是测试防御性代码的利器——相当于给代码装了安全气囊平时看不见出事才觉得真香。六、常见坑 / 报错1. collected 0 itemspytest 没找到用例一个都没捡到。先别怀疑人生检查文件名/函数名是不是以test_开头或者你是不是在正确的目录下运行。多数时候不是你代码不行是你没对上暗号。2. fixture ‘xxx’ not found引用的 fixture 没定义或者定义在别的文件里没被发现。公共 fixture 请放进conftest.py放那里面就是全剧组的共用道具谁都能用。3. 断言失败但看不出原因用assert a b而不是自定义比较pytest 会把两侧的实际值都打印出来证据确凿赖不掉。复杂对象做浮点比较就用pytest.approxassert val pytest.approx(0.1)。别问为什么 0.10.2 不等于 0.3问就是二进制不想理你。七、总结与下一步pytest 用极简写法撬动专业测试自动发现、智能断言、fixture 复用、参数化覆盖。基本就四板斧但够用。下一步建议加pytest-cov看测试覆盖率看看你嘴上说的测过了到底覆盖了多少行。用pytest-mock隔离外部依赖把网络、数据库这些猪队友换成替身演员。接入 CI比如 GitHub Actions让每次提交自动跑测试。从此以后代码合不合规机器说了算不用你半夜爬起来手动跑。最后说句掏心窝的写好 pytest你的 Python 代码才真正稳得住。不然哪天改了个配置半夜线上报警你端着保温杯坐电脑前那种酸爽比老坛酸菜还正宗。P.S. 无意间发现了一个巨牛的人工智能教程非常通俗易懂对AI感兴趣的朋友强烈推荐去看看传送门https://blog.csdn.net/qq_34419312
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进