一、安装pytest
- 命令行 pip install -U --user pytest
- pycharm—preferences—project Interpreter搜索pytest下载
二、运行方式
- 去settings里面设置单元测试框架为Pytest(Settings-Tools-Python Integrated Tools),右击运行
- 命令行运行pytest
- python程序运行 pytest.main()
三、pytest命名规则
- 模块名称:test_开头或者 _test 结尾
- 函数、类方法名称 test_开头
- 测试类:Test<someting>
注意点:类:如果使用了 unittest, 遵循 unittest 的规则. 如果没有继承 unittest.TestCase, 不要使用 init, 一旦使用 init, 就是一个普通的类,不会被当成测试类了
四、运行结果解析
- test session starts 测试会话开始,一段会话就是一次pytest的调用
- platform darwin -- Python 3.8.6, pytest-6.0.2, py-1.9.0, pluggy-0.13.1 -- /usr/local/bin/python3.8 mac电脑这边显示的就是platform darwin,windows电脑显示的不太一样,后面显示的是python、pytest、pytest包的版本
- rootdir: /Users/shiqi/Desktop/python/pycharm_Workspace/caixin/interface/manager/py_业务接口/test_case, configfile: pytest.ini pytest搜索代码的目录,后面的是配置文件
- collected 3 items 搜索范围内找到3个测试条目
- test_1.py .. .点号表示通过 Failure(失败) error (异常) skip (跳过) xfail(预期失败) xpass(预期失败且通过)
- 3 passed in 5.29s 测试通过的数量以及会话花费的时间
五、常用命令
- pytest --help 查看全部选项
- pytest --collect-only(这里要注意only前面千万不要有空格) 查看当前配置下哪些测试用例会被执行
- -k 允许使用表达式指定希望执行的用例 pytest -k "debug" 如果要知道满足指定表达式的有几个测试用例 pytest -k "debug" --collect-only
- -v 输出的信息更详细
- -s 允许终端输出运行结果(--capture=no)
- -x 执行时遇到失败立刻停止运行(不加-x的话标记失败还是会继续运行)可以加个--tb=no关闭错误信息
- -m 用于标记测试分组(@pytest.mark.run,warnings)pytest -k "run_these" --collect-only 查询符合标记条件的测试用例
- --maxfail=num 明确失败几次后再停止,num=数量,=1的话,与-x的作用一样
- --lf,--last-failed 只重新运行上次运行失败的用例(或如果没有失败的话会全部跑)
- --ff, --failed-first 运行所有测试,但首先运行上次运行失败的测试(这可能会重新测试,从而导致重复的fixture setup/teardown)
- -q 与-v相反,简化输出信息,与--tb=line搭配
- --tb=style,经常用的有3种,short、line、no(long、auto默认值、native标准库回朔)
Short:输出assert的一行以及系统判定内容
Line:只使用一行输出显示所有的错误信息(具体到文件位置)
No:直接屏蔽全部回搠信息()
对比
Short
- --durations=N,N=0显示全部用例的运行时间,N=0筛选出运行最慢的3条用例
用例运行的时候会经历3个阶段:setup,call,teardown。call就是测试用例,setup和teardown就是用例的fixture部分。
- marker 标记功能使用步骤
第一步:注册。 pytest.ini [pytest] markers=success
第二部: 打标签。 @pytest.mark.success
第三部:执行用例: pytest -m "success"
注:
- @pytest.mark 可以加到类上
- 可以同时运行多个标签- "login and demo" "login or demo" "login and not demo"
坑: 表达式只支持双引号,不支持单引号。
- skip
@pytest.mark.skip(reason="跳过原因")
某个功能被废弃,不需要测试。
- skipif
@pytest.mark.skipif(sys.platform=="linux", reason="os系统因为环境不同跳过。")
- 如果只运行一个模块的一个类下面的某一个方法(pytest 模块名::类名::方法名)
命令行 pytest test_demo.py::Testdemo::test_demo