pytest用例编写和执行

一、pytest的优点

  1. 非常容易上手,入门简单,文档丰富,文档中有很多实例可以参考
  2. 可以自动识别测试模块和测试函数,支持用简单的assert语句实现丰富的断言,无需复杂的self.assert*函数
  3. 支持参数化
  4. 执行测试过程中可以将某些测试跳过(skip),或者xfail处理对某些预期失败的case标记成失败
  5. 支持重复执行(rerun)失败的 case
  6. 支持运行由 nose, unittest 编写的测试 case
  7. 可生成 html 报告
  8. 方便的和持续集成工具 jenkins 集成
  9. 可支持执行部分用例
  10. 具有很多第三方插件,,例如报告插件pytest-html、allure-pytest、失败重试插件pytest-rerunfailures,并且可以自定义扩展

二、安装和测试用例编写规则

1.安装

# 安装
pip install -U pytest 
# 换源安装
pip3 install pytest -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
# 查看版本
pytest --version

2.测试用例编写规则

pytest的测试用例不用像unittest一样还要测试类先继承,只需要满足测试用例条件,函数还是类的方法都可以作为测试用例

1.测试模块(py文件)名称必须是 test_*.py 或  *_test.py
2.目录下所有的包 package 必须要有__init__.py 文件,包内的模块(py文件)才能识别为测试模块
3.测试类的类名必须以Test开头,且不能包含 __init__ 方法,不然就算类中有以test开头的方法也不会执行
4.测试用例名称必须是test_开头,无论是单独的一个函数还是测试类下的方法,否则不会识别为测试用例

三、命令行执行测试用例

应用场景:自动化测试需要自动执行命令来运行脚本

1.基础命令

运行方式:cd切换目录到目标目录,执行以下命令可以执行不同的测试用例:

pytest # 【所有】 先cd到某个目录下,执行目录下所有合规模块和包中所有测试用例
pytest test_01.py # 【模块】 执行test_01.py模块下所有测试用例
pytest -v test_01.py::test_3 # 【函数】 运行test_01.py模块里面的test_3用例
pytest test_01.py::TestClass # 【类】 运行test_01.py模块里面TestClass类下所有用例
pytest test_01.py::TestClass::test_4 # 【方法】 运行test_01.py模块里面某个类,某个类里面的方法

2.命令可用参数

除了基础命令,我们可以增加各种参数来达到不同的执行和打印效果,常用参数见下:

-x # 遇到错误时停止测试===============================================================================================
    pytest start.py -x
--maxfail=num,当用例错误个数达到指定数量时,停止测试=====================================================================
    pytest start.py --maxfail=1

-k # 根据用例名称筛选某些用例执行或者不执行==============================================================================
    pytest -v -k test_4 test_01.py # -k 匹配用例名称,执行测试用例名称包含test_4的所有用例
    pytest -v -k "test_4 or test_5" test_01.py # 多个条件去匹配用例名称,符合一个即可执行
    pytest -v -k "not test_4" test_01.py # 根据用例名称排除某些名称包含test_4的用例

-m [标记表达式] # 仅运行与给定标记表达式标记的用例(用例需要提前被自定义mark标记),更详细使用点这里===============================
    eg:
        @pytest.mark.mark1
        def test_01():
            pass
    pytest -m 'mark1' 01_test.py # 01_test.py中其他case都被取消执行,相当于给case打了一个标签,对用例进行了分类,执行一类用例
    pytest -m 'mark1 and not mark2' 01_test.py

# 打印报告相关
-v, --verbose # 详细打印,比默认默认的报告多了session部分的执行结果和进度信息===============================================
    pytest -v start.py
-q, --quiet   # 简单打印,没有session那一整块(平台版本、python和pytest等版本信息、执行结果)===============================
    pytest -q start.py # 简单打印

-r [chars] # 显示字符指定的额外测试摘要信息,可以是多个(默认 "fE" 只显示错误和失败用例)======================================
    # chars可选项:(f)ailed, (E)rror, (s)kipped, (x)failed, (X)passed, (p)assed, (P)assed with output, (a)ll except passed (p/P), or (A)ll
    pytest -rfEp -v 01_test.py # 详细打印,结果显示 失败+错误+常规通过 三种,运行效果见下图

-s # 用例中print打印信息相关,用例默认失败会输出,通过是不会输出打印信息的,加上这个就会
关闭Captured staout call 输出信息功能(用例成功或者失败都不再输出),但是会显示在 test session start部分,更好看,相当于 --capture=no # 其他 --markers #显示标记(内置、插件和每个项目的标记) -x, --exitfirst # 在第一个错误或测试失败时立即退出 --runxfail # 报告xfail测试的结果,就好像它们没有被标记一样 --lf, --last-failed # 仅重新运行上次运行失败的测试(如果没有失败,则全部重新运行)

附图一:-rfEp执行效果

附图二:默认、-v、-q三种模式报告对比

附图三:-s 效果

 四、pytest用例执行顺序

unittest中用例按照根据ASCII码的顺序加载测试用例,数字与字母的顺序为:0-9,A-Z,a-z。所以以A开头的测试用例方法会优先执行,以a开头会后执行

pytest中同一py文件中用例默认是按照该文件从上到下的顺序执行的,但是有个插件,支持我们自定义执行顺序,更加随心所欲,详见:>>安静的博客<<

 

五、pycharm执行测试用例 

第一步:编写用例都是用的编辑器,使用cmd执行的话很麻烦,pycharm中可以直接按照下图设置,之后就会以pytest运行代码

第二步:右键执行测试用例:

  1)执行整个目录:鼠标先点中最左侧目录,右键执行,会执行该目录下所有用例

  2)执行某个模块:鼠标点点中最左侧该模块,或者点到该py文件中空白的地方,右键执行

  3)执行整个测试类:鼠标点中类名,右键执行

  4)执行某个函数或类的方法:鼠标点中函数,右键执行

 

 

posted @ 2022-01-16 19:15  www.pu  Views(599)  Comments(0Edit  收藏  举报