pytest基本使用

一、pytest 安装

官方文档:https://docs.pytest.org/en/latest/

1. pytest安装
	pip install pytest -U -i https://pypi.tuna.tsinghua.edu.cn/simple
	
# 常用插件
1. html 报告插件
	pip install pytest-html
	使用方法:pytest --html=report.html
2. 分布式运行
	pip install pytest-xdist
	使用方法:
		pytest  -n  2   (2代表2个CPU)
		pytest  -n  auto
3.失败重跑插件
	pip install pytest-rerunfailures
	使用方法:
		1. 指定单个用例:@pytest.mark.flaky(reruns = 5 ,reruns-delay = 1 )
		2. 命令行运行:pytest test_demo.py --reruns 5 --reruns-delay 1 -vs
4.allure报告
	pip install allure-pytes
    注意:allure win上需要单独下载安装
5.执行顺序插件
	pip install  pytest-ordering
	使用方法  :  @pytest.mark.run(order=2)
6.多重校验
	pip install  pytest-assume
	使用方法:pytest.assume(1==3)
7. 用例依赖
	pip install pytest-dependency
	使用方法:
		@pytest.mark.dependency()对所依赖的方法进行标记
		@pytest.mark.dependency(depends=["test_name"])引用依赖,test_name可以是多个

二、pytest 用例识别规范

  1. 测试用例所有的包中必须有__init__.py
  2. 测试模块以 test_ 开头(或者 _test 结尾也可以) 【下划线不能少】
  3. 测试函数以 test 开头
  4. 测试类以 Test 开头 【大写 T 开头,并且不能带有 init 构造方法】
  5. 测试类中的方法以 test 开头

三、运行方式

3.1 命令行运行

pytest -v -s --maxfail=3 --reruns=3 -n=3
pytest -v -s --maxfail=3 --reruns=3 --reruns-delaey=3 -n=3

3.2 在代码中运行

pytest.main(["-v", "-s", '--reruns=3','-n=2'])

3.3 常用参数

1.  -s 输出 print 信息
2.  -q 简略输出
3.  -v 显示更详细的信息,也可 -vv -vvv
4.  通过节点格式 模块路径名::类名/函数名::方法名 来指定测试用例的执行
5.  -k 指定 关键字执行,支持and or not 逻辑运算符,可以匹配文件名、函数名、类名、方法名
	1.  -k login:只会找用例节点信息中包含login关键字的用例并执行
	2.  -k login and baidu:只会去找项目中用例节点信息中包含 login 关键字且包含 baidu 关键字的用例执行
	3.  -k login or baidu:找用例节点包含login'或者baidu关键字的用例并执行
	4.  -k not login :找项目节点中找用例节点信息中不包含login 关键字的用例并执行

6.  -m 通过模块执行用例
	1.  先需要在【配置文件】中定义 项目的模块名
		1.  markers = 模块名:模块注释
		2.  声明用例所属模块,在用例上方使用 @pytest.mark.模块名
		3.  执行对应模块用例
			1.  -m 模块名 :执行该项目中指定模块用例,同时支持 and or not 逻辑运算符
			2.  -m login and user:执行既是login也是user的模块
			3.  -m login or user:执行login或者user的模块
			4.  -m not login:执行非login的模块

7.  -n=线程数:多线程执行,需要安装 pip install pytest-xdist
8.  --reruns=重跑次数 :失败重跑n次,需要安装 pip install pytest-rerunfailures
	1.  如果直接写在参数中,表示对所有用例都生效
	2.  在用例上面 @pytest.mark.flaky(reruns=重跑次数)
9.  --count=重复执行次数 ,重复执行 ,需安装:pip install pytest-repeat
	1.  直接写在参数中,表示针对所有用例重复执行
	2.  在用例上方 @pytest.mark.repeat(次数) ,表示针对单个用例重复执行
10.  -x :断言,失败即停止,遇到断言错误立马停止
11.  --maxfail=最大失败个数,当失败的个数等于最大失败个数,则停止运行
12.  断言错误后继续运行用例后续的代码,pytest.assume(要断言的内容) ,需要安装install pytest-assume

四、断言

  1. assert 断言
    1. 语法: assert 断言,断言出错时的提示 【断言的结果是 True 或者 False】
    2. 方式:
      1. assert a==b 判断 a 等于 b
      2. assert a!=b 判断 a 不等于 b
      3. assert a>=b
      4. assert ab)
      6. assert hasattr(object,name)   【hasattr 有没有属性】
      7. assert 1 in [1,2,3]
      
  2. 多重校验
    语法: pytest.assume(1==3)

五、固件

  1. 固件:满足场景就会执行
  2. 常规固件,pytest已经定义实现好的固件,直接使用即可

5.1前后置操作

1.  setup_class :类中所有用例执行前,执行一次(可以用它替代` __init__`操作),只会执行一次--->在类里面进行定义
2.  teardown_class :类中所有用例执行后执行一次,只会执行一次。--->在类里面进行定义
3.  setup:每个用例执行前执行一次,在类外面定义则指对类外面的函数生效,在类里面定义则只对类里面的方法生效
4.  teardown:每个用例执行后执行一次,在类外面定义则指对类外面的函数生效,在类里面定义则只对类里面的方法生效
5.  setup_function:每个函数执行前执行一次
6.  teardown_function:每个函数执行后执行一次
7.  setup_module:每个模块执行前执行一次。每一个py文件为一个模块
8.  teardown_module:每个模块执行后执行一次。每一个py文件为一个模块
9.  setup_method: 在类里面定义,每个方法执行前先执行
10.  teardown_method:在类里面定义,每个方法执行后再执行

六、参数化

  1. 参数化:数据以参数的实行传入就叫做参数化
  2. 数据驱动:数据的个数决定 case 执行的次数,数据驱动用例的执行
  3. 实现:
    1. @pytest.mark.parametrize(argnames,argvalues)
    2. argnames:表示要接受的参数名称,建议直接个双引号,然后复制相应的参数即可
    3. argvalues:表示要传递给参数的值,可以用列表进行存放。

七、allure 报告

allure 是 java 写的一个报告生成工具,是一个独立工具,不依赖 pycharm python

  1. 安装:pip install allure-pytest
  2. 添加 allure 数据的配置,在pytest.ini 中添加参数 --alluredir=temp --clean-alluredir
    1. –alluredir :指定测试运行过程中数据的存放目录
    2. –clean-alluredir:每次运行前清空上一次的数据
  3. 使用:
    1. 一般在入口文件使用 os.system(终端命令)执行终端命令
    2. os.system('allure generate ./temp -o ./report --clean')

八、配置文件

  1. 一般在项目文件的根目录下 定义一个 pytest.ini (固定命名方式,不能进行更改),如果文件里面包含中文注释,则只能使用 GBK 编码,
  2. 这个配置文件,帮着我们修改一些默认的配置
  3. 如果没有定义这个配置文件,pytest 会按照默认的方式去执行一些用例
[pytest]
# 配置pytest命令行运行参数
# 空格分隔,可添加多个命令行参数 -所有参数均为插件包的参数
addopts = -s
# 配置测试搜索的路径
# 当前目录下的testcase文件夹 -可自定义
testpaths = ./testcase
# 配置测试搜索的文件名
# 当前目录下的testcase文件夹下,以test_开头,以.py结尾的所有文件 -可自定义
python_files = test_*.py *_test.py
# 配置测试搜索的测试类名
# 当前目录下的testcase文件夹下,以test_开头,以.py结尾的所有文件中,以Test开头的类 -可自定义
python_classes = Test*
# 配置测试搜索的测试函数名
# 当前目录下的testcase文件夹下,以test开头,以.py结尾的所有文件中,以Test_开头的类内,以test_开头的方法 -可自定义
python_functions = test*
# 标记用例,-m可以进行选择执行
markers =  
    smoking: 冒烟  
    normal: 一般

九、fixture

  1. 作用:单独给用例添加前后置操作
def myfixture():
        print('执行前要做的操作') #用例执行前要执行的代码
        yield						#一定要使用yield,yield后跟返回值,相当于函数中的return
        print('执行后要做的操作')	#用例执行后要执行的代码
  1. 在用例上方声明:@pytest.mark.usefixtures('myfixture') # myfixture 就是自己定义的函数名称

  2. 通过参数调用:def 用例方法(self,myfixture):#myfixture 就是自己定影的函数名称

  3. 一定要使用 yield,yield 后跟返回值,相当于函数中的 return

  4. conftest.py 文件【文件名字不能修改】

    1. pytest 专门用来存放自定义固件的文件,可以将自己写的固件写在该文件中,其他模块中用例使用固件时不予要额外进行导入,一般该文件放在项目根目录,与 pytest.ini 同级。
  5. fixture 参数化

    1. 语法在自定义配置文件中方法上使用 @pytest.fixture(params=[(a,b),(a,b)]) 装饰器
    2. 必须 params 进行传参,参数最外层为列表,内层为可迭代对象,有几个可迭代的对象就运行几次
    3. 定义的固件,接受参数,必须使用 requset 形参
    4. 在函数内部必须使用 request.param 获取传递的参数,使用下标获取具体的值
  6. fixture 自动运行

    1. 语法:@pytest.fixture(scope='function',aotuouse=True)
    2. “”" "function"(default), 默认为每个函数运行
      "class", 每个类运行一次
      "module", 每个模块运行一次
      "package" 每个package运行一次
      "session".“”" # 一次会话只运行一次
	    @pytest.fixture(scope='function',autouse=True)  
	    def auto():  
	    print('自动运行前')  
	    yield  
	    print('自动运行后')

你可能感兴趣的:(UI自动化,pytest)