您的位置:首页 > 健康 > 美食 > Pytest学习总结

Pytest学习总结

2024/10/7 4:26:10 来源:https://blog.csdn.net/qq_45283185/article/details/139687724  浏览:    关键词:Pytest学习总结

文章目录

  • 前言
  • 一、pytest单元测试框架
    • 1.单元测试框架和自动化测试框架的关系
    • 2.pytest简介
  • 二、pytest使用
    • 1.使用规则
    • 2.运行方式
      • 参数详解
    • 3.运行顺序
    • 4.分组执行(冒烟、分模块执行、分接口和web执行)
    • 5.pytest跳过测试用例
    • 6.使用@pytest.fixture()实现部分测试用例的前后置(固件、夹具)
    • 7.通过conftest.py和@pytest.fixture()结合实现全局的前置应用(如:项目的全局登录、模块的全局处理)
    • 8.断言
    • 9.生成allure测试报告
  • 三、pytest实战
    • 1.yaml接口自动化实战


前言

本篇文章主要记录pytest的学习历程,其中包括pytest的语法、用法、实战等。


一、pytest单元测试框架

单元测试是指在软件开发中针对软件的最小单位(函数、方法)进行正确性的检查测试。
单元测试框架:
java:junit和testng(可以看看我之前的文章)。
python:unittest和pytest。
单元测试框架主要做:
(1)测试发现:从多个文件里面去找到测试用例;
(2)测试执行:按照一定的顺序和规则去执行,并生成结果;
(3)测试判断:通过断言判断预期结果和实际结果的差异;
(4)测试报告:统计测试进度、耗时、通过率,生成测试报告。

1.单元测试框架和自动化测试框架的关系

(1)什么是自动化测试框架:封装自动化的基础模块、管理模块、统计模块。
(2)作用
1)提高测试效率,降低维护成本;
2)减少人工干预,提高测试的准确性,增加代码的重用性;
3)核心思想是让不懂代码的人也能够通过这个框架去实现自动化测试。
(3)pytest单元测试框架和自动化测试框架的关系
单元测试框架:只是自动化测试框架中的组成部分之一。
pom设计模式:只是自动化测试框架中的组成部分之一,
数据驱动、关键字驱动、全局配置文件的封装、日志监控、selenium、requests、断言、报告邮件…

2.pytest简介

(1)pytest是一个非常成熟的python的单元框架,比unit test更灵活,容易上手。
(2)pytest可以和selenium、requests、appium结合实现web自动化、接口自动化、app自动化。
(3)pytest可以实现测试用例的跳过以及reruns 失败用例重试。
(4)pytest可以和allure生成美观的测试报告。
(5)pytest可以和Jenkins持续集成。
(6)pytest有很多非常强大的插件,这些插件能够实现很多的使用操作。
 pytest-html:生成html格式的自动化测试报告。
 pytest-xdist:测试用例分布式执行,多CPU分发。
 pytest-ordering:用于改变测试用例的执行顺序。
 pytest-rerunfailures:用例失败后重跑。
 allure-pytest:用于生成美观的测试报告。

二、pytest使用

1.使用规则

(1)模块名必须以test_开头或 _test结尾。
(2)测试类必须以Test开头,并且不能有init方法。
(3)测试方法必须以test开头。

2.运行方式

(1)主函数模式。
运行所有:

pytest.main()

带参数运行:

pytest.main(['-s'])
pytest.main(['-v'])
pytest.main(['-vs'])

指定模块运行:

pytest.main(['-vs', 'test_login.py'])

指定目录:

pytest.main(['-vs', './interface_testcase'])

通过nodeid

pytest.main(['-vs', './interface_testcase/test_interface.py::test_04_func'])

(2)命令行模式。
运行所有:pytest
带参数执行:pytest -s
指定模块运行:pytest -vs test_login.py
指定目录:pytest.main -vs ./interface_testcase

(3)通过读取pytest.ini配置文件运行。
pytest.ini这个文件是pytest单元测试框架的核心配置文件。
位置:一般放在项目的根目录。
编码:必须是ANSI,可以使用notepad++修改编码格式。
作用:改变pytest默认的行为。
运行的规则:不管是主函数的模式运行,命令行模式运行,都会读取该文件。
格式:

[pytest]
# 命令行参数,用空格分割
addopts = -vs
# 测试用例文件夹,可自己配置,../pytestproject为上一层的pytestproject文件夹
testpaths = ../testcase
# 配置测试搜索的模块文件名称
python_files = test*.py
# 配置测试搜索的测试类名
python_classes = Test*
# 配置测试搜索的测试函数名
python_functions = test

参数详解

-s:表示输出调试信息,包括print打印。
-v:显示更详细的信息。
-vs:两个参数可以一起用。
-n:支持多线程或者分布式运行测试用例(如:pytest -vs ./testcase/test_login.py -n 2)
–reruns NUM:失败用例重跑。
-x:表示只要有一个用例失败,测试停止。
–maxfail=2:出现两个用例失败停止。
-k:根据测试用例的部分字符串指定测试用例(如:pytest -vs ./testcase -k “bai”)

3.运行顺序

(1)unittest:ascII的大小绝对的执行的顺序。
(2)pytest:默认从上到下。
pytest改变默认的执行顺序:使用mark标记,如下所示:

@pytest.mark.run(order=1)

4.分组执行(冒烟、分模块执行、分接口和web执行)

smoke:冒烟用例,分布在各个模块里
在pytest.ini中加入:

markers =smoke: 冒烟用例usermanage: 用户管理模块productmanage:商品管理模块

函数块加上分组:
@pytest.mark.smoke
@pytest.mark.usermanage
命令行输入:
pytest -vs -m “smoke”
pytest -vs -m “smoke or usermanage or productmanage”

5.pytest跳过测试用例

(1)无条件跳过

@pytest.mark.skip(reason="不合适")

(2)有条件跳过

@pytest.mark.skipif(age>=18,reason="已成年")

生成报告文件:

addopts = -vs --html ./report/report.html

6.使用@pytest.fixture()实现部分测试用例的前后置(固件、夹具)

(1)setup/teardown,setup_class/teardown_class

    def setup(self):print('\n在执行测试用例之前执行的代码:代开浏览器,加载网页')def setup_class(self):print('在每个类执行前的初始化工作:比如:创建日志对象、创建数据')def test_01_baidu(self):print('\n测试百度')def test_02_bilibili(self):print('\n测试哔哩哔哩')def teardown(self):print('\n在执行测试用例之后:关闭浏览器')def teardown_class(self):print('\n在每个类执行后的扫尾的工作:比如:销毁日志对象,销毁数据库的连接,销毁接口的请求对象')

(2)使用fixture()装饰器来实现部分用例的前后置

@pytest.fixture(scope="", params="", autouse="", ids="", name="")

scope:表示的是被@pytest.fixture标记的方法的作用域,function、class、module、package/session。
params:参数化(支持:列表[]、元祖()、字典列表[{},{},{}]、字典元祖({},{},{}))。
autouse=True:自动执行,默认False。
ids:当使用params参数化时,给每一个值设置一个变量名。
name:给表示的是被@pytest.fixture标记的方法取一个别名。

import pytest# @pytest.fixture(scope='function', params="", autouse="", ids="", name="")
@pytest.fixture(scope='function', params=['小明', '小王', '小红'], ids=['a', 'b', 'c'], name='aaa')
def my_fixture(request):# print('这是前后置的方法,可以实现部分以及全部用例的前后置')# yield# print('这是后置的方法')# print('前置')# yield# print('后置')return request.paramclass TestBeforeAfter:# def setup(self):#     print('\n在执行测试用例之前执行的代码:代开浏览器,加载网页')## def setup_class(self):#     print('在每个类执行前的初始化工作:比如:创建日志对象、创建数据')def test_01_baidu(self):print('测试百度')def test_02_bilibili(self, aaa):print('测试哔哩哔哩')# print('-----------' + str(my_fixture))print('-----------' + str(aaa))# def teardown(self):#     print('\n在执行测试用例之后:关闭浏览器')## def teardown_class(self):#     print('\n在每个类执行后的扫尾的工作:比如:销毁日志对象,销毁数据库的连接,销毁接口的请求对象')if __name__ == '__main__':pytest.main()

7.通过conftest.py和@pytest.fixture()结合实现全局的前置应用(如:项目的全局登录、模块的全局处理)

(1)conftest.py文件是单独存放的一个夹具配置文件,名称不能更改。
(2)用处可以在不用的py文件中使用同一个fixture函数。
(3)conftest.py需要和运行的用例放到统一层,并且不需要做任何的import导入的操作。
setup/teardown,setup_class/teardown_class:作用于所有用例或者所有的类。
@pytest.fixture():既可以作用于部分又可以作用于全部的前后置。
conftest.py和@pytest.fixture()结合使用,作用于全局的前后置。

8.断言

(1)assert

assert 1==2

9.生成allure测试报告

插件下载:allure-pytest。

(1)pytest-html

(2)allure-pytest

三、pytest实战

1.yaml接口自动化实战

(1)断言的封装

(2)allure报告的定制

(3)关键字驱动和数据驱动结合实现

(4)python的反射
通过对象的到类对象,再通过类对象调用方法。
(5)Jenkins的持续集成和allure报告集成,并根据自动化报告的错误率发送邮件。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com