pytest基础介绍与使用

pytest基础介绍与使用

  • pytest概述
    • pytest介绍
    • python测试框架对比
  • pytest使用介绍
    • 安装pytest
    • 运行函数
  • pytest知识点
    • 编写规则
    • mark标记-标记函数
    • mark标记-使用
      • 注册标记
      • 使用标记
      • mark标记-运行指定的标记
      • mark标记应用-参数化
      • mark标记总结
  • 总结

pytest概述

pytest介绍

pytest框架的优点:
1、简单灵活,容易上手,文档丰富
2、支持参数化,可以细粒度地控制要测试的测试用例
3、能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)
4、pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等
5、测试用例的skip和xfail处理
6、可以很好的和CI工具结合,例如与jenkins集成

python测试框架对比

pytest基础介绍与使用_第1张图片
总体来说,unittest比较基础,适合代码能力较强的使用,robot framework易用性更好,但是灵活性及可定制性略差pytest更加方便快捷,效率更高

pytest使用介绍

安装pytest

pytest基础介绍与使用_第2张图片
在命令行运行pip install pytest命令即可安装pytest(首先需要先安装python)

pytest基础介绍与使用_第3张图片
检查你安装的pytest的版本信息是否正确:pytest --version

运行函数

执行命令pytest cases/Study/test_study_pytest.py,单纯执行该python文件
执行命令pytest -v cases/Study/test_study_pytest.py,显示具体的详情信息,一般显示错误的位置及错误的详细信息
执行命令pytest -q cases/Study/test_study_pytest.py,pytest -q等价于Pytest --quiet 可以简化输出信息,pytest -v是显示具体的详细信息,简化了输出的信息
执行pytest -k test_failing cases/Study/test_study_pytest.py,执行指定的测试用例,pytest -k “test_a and test_b” 运行名称包含指定表达式的用例(支持and or not)
执行pytest -v cases/Study/test_study_pytest.py --html=report.html,执行测试用例并且在当前目录下生成report文件

pytest知识点

编写规则

  • 测试文件以test_开头(以_test结尾也可以)
  • 测试类以Test开头,并且不能带有 init 方法
  • 测试函数以test_开头
  • 断言使用基本的assert即可

mark标记-标记函数

在实际工作中,我们要写的自动化用例会比较多,也不会都放在一个py文件中,如果有几十个py文件,上百个方法,而我们只想运行当中部分的用例时怎么办?

标记函数作用:在不用跑全套测试时,用于标记选择需要测试的子集
语法:
  @pytest.mark.xxx(标签可以自定义)
  运行时通过pytest -v -m ‘标记的标签(标记之间可以添加and、or、 not关键字)’ 测试文件
功能:
  一个测试函数可以有多个标记, 一个 marker 也可以用来标记多个测试函数

mark标记-使用

注册标记 --> 使用标记 --> 运行指定的标记

注册标记

1、在项目根目录下创建一个pytest.ini文件,格式:
markers=后面是标签名,如有多个,第二个开始要换行,且要缩进,不然会报错
2、注册完成后,使用pytest --markers来核实标记是否注册成功
3、若标记未注册,运行代码时(pytest的高级版本)可能会报警告让你进行注册

使用标记

1、直接标记类或方法或函数:@pytest.mark.标签名
pytest基础介绍与使用_第4张图片
2、 类属性:pytestmark = [pytest.mark.标签名, pytest.mark.标签名],需要注意的是属性名称是固定的

mark标记-运行指定的标记

1、通过命令行执行命令pytest -m + “标记名”+指定的python文件,进入用例的目录执行命令
pytest基础介绍与使用_第5张图片
单个标签:pytest -m “标记名” (-m意思是执行标记mark),不想执行某个标记可以用not来取反,即pytest -m “not 标记名”

多个标签:可以加上判断,pytest -m “qc and beta” 或者 pytest -m “qc or beta” 效果是一样的

注意:标签名一定要加双引号,单引号是会报错的。
2、通过代码,执行指定标记的测试用例:

if __name__ == '__main__':
    pytest.main(['-m qc and beta', '-s']) # 标签名不需要加引号

-s命令是指打印更加详细的信息

这里普及一下,main()方法是可以接收不定长参数的,因此可以把要执行的命令放在一个列表中
3、mark标记应用-执行跳过
在维护测试用例的过程中,可能在一个阶段某些用例已经不需要了,或者在指定条件下是不需要运行的,那么我们就可以通过mark.skip跳过这些函数或者类,两种跳过方式:

  • 直接跳过: @pytest.mark.skip(reason = “原因”),这里原因是可选参数
  • 条件跳过,即满足某个条件才跳过:@pytest.mark.skipif(a == 1, reason = “原因”)pytest基础介绍与使用_第6张图片

mark标记应用-参数化

当对一个测试函数进行测试时,通常会给函数传递多组参数。比如测试账号登陆,我们需要模拟各种千奇百怪的账号密码。

当然,我们可以把这些参数写在测试函数内部进行遍历。但这样是一个测试,当某组参数导致断言失败,测试也就终止了。

更好的解决方法,就是参数化测试,即每组参数都独立执行一次测试。

使用的工具就是 pytest.mark.parametrize(argnames, argvalues),参数名和参数值。

unittest单元测试框架使用DDT进行数据驱动测试,Pytest是使用@pytest.mark.parametrize装饰器来实现数据驱动测试的。

通过parametrize参数化,传入三组参数,用例会单独执行三次,其中一次执行报错不会影响其他参数的执行

@pytest.mark.parametrize('keyword', ['1', '2', '3'])
def test_companyPS_012(driver, keyword):
    """
    名称:
    步骤:
    测试数据:
    期望:
    """
    page = companyPSPage(driver)  # 引入page页面元素-公用
    page.topMenu[6].click()
    time.sleep(1)
    page.addGroup.click()
    page.nameInput[1].send_keys(keyword)

多个参数:@pytest.mark.parametrize(‘a, b, c’, [(1,2,3), (4,5,9)])

mark标记总结

mark标记还有很多其他的应用场景,比如:
1、与pytest-ordering插件搭配,设置执行顺序:
使用:
#标记指定用例的执行顺序
@pytest.mark.run(order=2)

2、与pytest-rerunfailures插件搭配,设置失败重跑机制
使用:
#执行指定python文件的命令
pytest test_class.py --reruns 5 --reruns-delay 1 -vs (失败后重新运行5次,每次间隔1秒)
#标记指定某个用例失败重跑机制
@pytest.mark.flaky(reruns = 5 ,reruns-delay = 1 )

3、还有很多其他内容,时间有限,仅说明一些常用的知识,可后期自行学习

总结

1、通过整个分享过程中的内容不难发现pytest是一个功能较为齐全的测试框架
2、同时pytest非常优秀的点是可以支持扩展很多插件

推荐几个插件:
1、pytest-html–生成html的测试报告
2、pytest-repeat–重复执行测试
3、pytest-xdist–分布式测试

你可能感兴趣的:(互联网类型,python,selenium,python)