python的pytest框架

pytestunittest的区别:

1.安装需求不同。pytest为第三方单元测试库,需额外安装;unittest为标准库,无需额外安装。

2.用例编写规则不同。pytest编写规则较为简单,兼容性较好;unittest需按照固定的格式编写,较为复杂。

 pytest优点:

能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)
pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等
测试用例的skip和xfail处理(执行测试过程中可以将某些测试跳过,或者对某些预期失败的case标记成失败)

可以很好的和jenkins集成
report框架----allure 也支持了pytest

支持运行由nose, unittest编写的测试case

 

Pytest 是 python2 自带的自动化测试框架,python3 的版本的话 pytest 框架独立出来,需要 pip 进行安装

 

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

 

pip install   -u  pytest

 1、测试文件以 test_xx.py 命名需要以 test_开头(或_test 结尾);

2、测试类以 Test_开头,并且不能带有 init 方法;

3、测试函数或方法以 test_xx 开头;

 

一、编写测试用例:

pytest 执行时默认是执行指定路径下以test_开头或者以_test 结尾的文件里的测试类或者方法,默认是执行以 Test_开头的类和 test_开头的方法。

 

用例前置后置方法(可用fixture替代):

与unittest类似,执行前后会执行setup,teardown来增加用例的前置和后置条件。pytest框架使用setup,teardown更为灵活,按照用例运行级别可以分为以下几类

  • setup_module/teardown_module   模块级别,在模块始末调用
  • setup_function/teardown_function 函数级别,在函数始末调用(在类外部)
  • setup_class/teardown_class 类级别,每个类里面执行前后分别执行
  • setup_method/teardown_method 方法级别,在方法始末调用(在类中)
  • setup/teardown 方法级别,在方法始末调用(在类中)

调用顺序:setup_module>setup_class>setup_method>setup>teardown>teardown_method>teardown_class>teardown_module

 

二、断言

pytest 一共有五种断言:

assert xx           判断 xx 为真
assert not xx       判断 xx 不为真
assert a in b         判断 b 包含 a
assert a == b          判断 a 等于 b
assert a !=b         判断 a 不等于 b

 

 

三、用例执行

使用命令行执行

cmd 窗口,然后执行 pytest 文件路径/测试文件名例如 pytest  ./test_tt.py

如果当前路径已经是放测试用例文件的文件夹下,想要测试文件,则直接可以  输入pytest 测试文件名 即可:

如果只输入 pytest,则会默认执行当前文件夹下所有以 test_开头(或_test 结尾)的文件

如果提示pytest不是内部或者外部命令 在cmd下输入:pip install -U pytest    即可

运行参数详解:

a、无参数

    读取路径下符合条件的所有类、函数、方法全部执行

b、-v

   打印详细运行日志

c、-s

pytest test_se.py  -s

  打印print输出

d 、-k

    跳过运行某个或某些用例

    pytest -k '类名'

    pytest -k '方法名

    pytest -k '类名 and not 方法名' #运行类里所有方法,不包含某个方法

 e、-x

   遇到用例失败立即停止运行

f、 --maxfail

    用例失败数达到某个设定的值停止运行

   pytest --maxfail=[num]

   pytest  --maxfail =2   #出现两次失败停止执行

g、 -m

    运行所有@pytest.mark.[标记名] 标记的用例

 可在pycharm中使用参数

pytest.main("-s  test_demo1.py")

 IDE(PyChram)执行

执行当前文件所在路径下的文件,指定文件名则执行指定的文件,若没指定,执行所有 test_开头或者_test 结尾的文件。

 

当使用了pytest框架时,而且py文件是以test_xxx.py格式保存的,那Pycharm会以pytest形式进行运行程序,不过在这里要对pycharm进行一个设置。选择Settings-Tools-Python Integrated Tools
,然后选择Pytest点击确定即可

 

 

 

Pytest Exit Code 含义清单:

Exit code 0 所有用例执行完毕,全部通过
Exit code 1 所有用例执行完毕,存在Failed的测试用例
Exit code 2 用户中断了测试的执行
Exit code 3 测试执行过程发生了内部错误
Exit code 4 pytest 命令行使用错误
Exit code 5 未采集到可用测试用例文件

控制测试用例执行:

以下命令在cmd中输入:
1、在第N个用例失败后,结束测试执行
pytest -x # 第01次失败,就停止测试
pytest --maxfail=2 # 出现2个失败就终止测试

2、指定测试模块
pytest test_demo1.py

3、指定测试目录
pytest testing/

4、通过关键字表达式过滤执行
pytest -k "Test_dd"
这条命令会匹配文件名、类名、方法名匹配表达式的用例

5.通过 node id 指定测试用例
nodeid由模块文件名、分隔符、类名、方法名、参数构成,举例如下:
pytest test_mod.py::test_func
pytest test_mod.py::TestClass::test_method

6.通过标记表达式执行
pytest -m slow
这条命令会执行被装饰器 @pytest.mark.slow 装饰的所有测试用例

7、通过包执行测试
pytest --pyargs Case1
这条命令会自动导入包Case1,并使用该包所在的目录,执行下面的用例

 

多进程运行用例

安装pytest-xdist

pip install -U pytest-xdist

pytest  test_demo1.py -n NUM      其中NUM填写并发的进程数

pytest  test_demo1.py -n 5  

 

重试运行用例

在做接口测试时,有事会遇到503或短时的网络波动,导致case运行失败,而这并非是我们期望的结果,此时可以就可以通过重试运行cases的方式来解决。

安装pytest-rerunfailures

pip install -U pytest-rerunfailures

pytest test_se.py --reruns NUM     NUM填写重试的次数

pytest test_se.py --reruns 3 

 

四、fixture用途:

pytest fixture 与setup,teardown功能一样,但比之更加灵活,完全可以代替setup,teardown

1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现

2.测试用例的前置条件可以使用fixture实现

3.支持经典的xunit fixture ,像unittest使用的setup和teardown

4.fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题

 fixture(scope="function", params=None, autouse=False, ids=None, name=None)

 

fixture通过@pytest.fixture()装饰器装饰一个函数,那么这个函数就是一个fixture
 
上面是通过参数引用fixture
 

 

 

 

#默认为scope='function'

fixture自动调用(autouse=True)

 autouse设置为True,自动调用fixture功能,无需额外继承

fixture参数化(params)

@pytest.fixture有一个params参数,接受一个列表,列表中每个数据都可以作为用例的输入。也就说有多少数据,就会形成多少用例。可以通过'''request.param'''来获取该次调用的参数

fixture返回值

 

 

 

 

 

五、参数化

pytest参数化Pytest是使用@pytest.mark.parametrize装饰器来实现数据驱动测试的

  parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)

常用参数:
argnames:参数名
argvalues:参数对应值,类型必须为list
当参数为一个时 格式:[value]
当参数个数大于一个时,格式为:[(param_value1,param_value2.....),(param_value1,param_value2.....)]
使用方法:
@pytest.mark.parametrize(argnames,argvalues)
️ 参数值为N个,测试方法就会运行N次

 以上是直接传参

 

数据短小还好说,如果数据比较长而复杂的话,那么就会很难看。

@pytest.mark.parametrize() 还提供了第三个 ids 参数来自定义显示结果

    

六、参数化与fixture结合(indirect=True)

#参数化结合fixture使用
#情况一:传入值和数据
#情况二:传入一个fixture方法,将数据传入到fixture方法中,fixture使用request参数来接受这组数据,在方法体中使用request.param来接受这个数据

 conftest.py

1.conftest.py文件名字是固定的,不可以做任何修改

2.文件和用例文件在同一个目录下,那么conftest.py作用于整个目录

3.conftest.py文件不能被其他文件导入

4.所有同目录测试文件运行前都会执行conftest.py文件

 

七、Pytest配置文件

 pytest的配置文件通常放在测试目录下,名称为pytest.ini,命令行运行时会使用该配置文件中的配置

 

 

八、pytest测试报告

pytest-HTML是一个插件,pytest用于生成测试结果的HTML报告。兼容Python 2.7,3.6

安装方式:pip install pytest-html

通过命令行方式,生成xml/html格式的测试报告,存储于用户指定路径。

使用方法: 命令行格式:pytest --html=用户路径/report.html

pytest --html=./report.html

 

 九、跳过测试函数

根据特定的条件,不执行标识的测试函数.
方法:
skipif(condition, reason=None)
参数:
condition:跳过的条件,必传参数
reason:标注原因,必传参数
使用方法:
@pytest.mark.skipif(condition, reason="xxx")

如果不满足条件,则不回跳过函数,正常执行

 

十、标记预期失败函数

标记测试函数为失败函数
方法:
xfail(condition=None, reason=None, raises=None, run=True, strict=False)
常用参数:
condition:预期失败的条件,必传参数
reason:失败的原因,必传参数
使用方法:
@pytest.mark.xfail(condition, reason="xx")

 

 



posted on 2023-04-10 18:24  yanmay  阅读(129)  评论(0编辑  收藏  举报

导航