全网最全Pytest框架使用教程和项目实战~从入门到精通

这篇具有很好参考价值的文章主要介绍了全网最全Pytest框架使用教程和项目实战~从入门到精通。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Pytest简介

1.1 pytest介绍

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

一般项目作者会把依赖文件附到项目中一起上传,将这个文件移动到venv文件夹中,打开pycharm中的命令行,这里注意,要在命令行里激活当前的虚拟环境,用的pip才是这个环境的,pip才会把依赖包下载到这个虚拟环境里。激活虚拟环境的方法是cd到venv\Scripts文件夹,输入activate.bat命令进入虚拟环境后,cd …退出到venv文件夹(这里放着requirements.txt),然后输入以下指令:pip install -r requirements.txt等待安装即可,安装的依赖包位置在:项目路径\venv\Lib\site-packages

1.2、Pytest默认规则

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

全网最全Pytest框架使用教程和项目实战~从入门到精通,Pytest,Python 接口自动化测试,pytest,python,开发语言,单元测试

二、 Pytest测试用例执行方式

2.1 主函数模式

1、运行所有:pytest.main()
2、指定模块:pytest.main([‘-vs’,‘test_login.py’])
3、指定目录:pytest.main([“-vs”,“testcase”])
4、通过nodeid指定用例运行:nodeid由模块名,分隔符,类名,方法名,函数名组成
pytest.main([“-vs”,“./interface_testcase/test_interface.py::Testinterface::test_03_zhiliao”])

'''
前置条件:
    在test_login.py下创建两条测试用例
    在test_pass.py下创建两条测试用例
    一共4条测试用例
'''
import pytest
class TestLogin:

    def test_01(self):
        print("测试")

if __name__ == '__main__':
    pytest.main(["-vs"])
    
    
# pytest.main(["-vs"])    将会执行所有的测试用例,4条测试用例都会执行
#pytest.main(["-vs","./test_login.py"]   只会执行test_login.py下的两条测试用例

2.2 命令行模式

1、运行所有:pytest 指定模块:pytest -vs
2、test_login.py 指定目录:pytest -vs ./interface_testcase
3、指定nodeid:pytest -vs ./interface_testcase/test_interface.py::Testinterface::test_03_zhiliao

全网最全Pytest框架使用教程和项目实战~从入门到精通,Pytest,Python 接口自动化测试,pytest,python,开发语言,单元测试

2.3 参数详解

-s:表示输出调试信息,包括print打印的信息
-v:显示详细信息
-vs:一般这两个参数一起使用
-n:支持多线程或分布式运行测试用例
	例如:pytest -vs ./testcase/test_login.py -n 2
	例如:pytest.main(["-vs", "./test_login.py", "-n=2"])
--return:失败用例重跑
-x:表示只要一个用例报错,就停止测试
--maxfail=2:出现两个用例失败就停止
-k:根据测试用例的部分字符串指定测试用例
	例如:pytest -vs -k "te"

2.4 通过读取pytest.ini配置文件运行(重点)

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

#文件名pytest.ini

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

三、Pytest执行顺序

unittest执行顺序:按照ascli的大小来执行
pytest执行顺序:默认从上到下执行

改变pytest的默认执行顺序:使用@pytest.mark.run(order=1)

'''
需求:将test_02第一个先执行
'''
import pytest


class TestLogin:

    def test_01(self):
        print("测试-1")

    @pytest.mark.run(order=1)     #.run(order=1) 要手动敲不会自动补全
    def test_02(self):
        print("测试-2")

全网最全Pytest框架使用教程和项目实战~从入门到精通,Pytest,Python 接口自动化测试,pytest,python,开发语言,单元测试

四、如何分组执行

我们在测试过程中经常会有冒烟测试、分模块测试、分接口测试和web测试等等,那么如何使用pytest进行分组执行测试?

在pytest.ini文件中添加markers字段

[pytest]
addopts = -vs
testpaths = ./testcase
python_files = test*.py
python_classes = Test*
python_functions = test
markers =
    smoke:冒烟用例
    usermanage:用户管理模块
    productmangage:商品管理模块

全网最全Pytest框架使用教程和项目实战~从入门到精通,Pytest,Python 接口自动化测试,pytest,python,开发语言,单元测试
全网最全Pytest框架使用教程和项目实战~从入门到精通,Pytest,Python 接口自动化测试,pytest,python,开发语言,单元测试

五、Pytest跳过用例

5.1 无条件跳过

无条件跳过: @pytest.mark.skip(reason"跳过")

import pytest
class TestLogin:
    @pytest.mark.usermanage
    @pytest.mark.skip(reason="跳过")
    def test_01(self):
        print("测试-1")

    @pytest.mark.run(order=1)
    @pytest.mark.smoke
    def test_02(self):
        print("测试-2")

#执行结果:
testcase/test_login.py::TestLogin::test_01 SKIPPED (跳过)

5.2 有条件跳过

有条件跳过: @pytest.mark.skipif(age=18,reason=“年龄等于18则跳过”)

import pytest
class TestLogin:
    age = 18

    @pytest.mark.usermanage
    @pytest.mark.skip(reason="跳过")
    def test_01(self):
        print("测试-1")

    @pytest.mark.skipif(age=18,reason="年龄等于18则跳过")
    @pytest.mark.run(order=1)
    @pytest.mark.smoke
    def test_02(self):
        print("测试-2")

#执行结果
testcase/test_login.py::TestLogin::test_02 SKIPPED (年龄等于18则跳过)
interfacecase/test_inter.py::TestPass::test_05 测试-5
PASSED
interfacecase/test_inter.py::TestPass::test_06 测试-6
PASSED
testcase/test_login.py::TestLogin::test_01 SKIPPED (跳过)
testcase/test_pass.py::TestPass::test_03 测试-3
PASSED
testcase/test_pass.py::TestPass::test_04 测试-4
PASSED

======================== 4 passed, 2 skipped in 0.03s =========================

六、前后置(夹具、固件)

6.1 setup/teardown,setup_class/teardown_class实现前后置

为什么要使用前后置?
比如:web自动化执行用例之前,请问需要打开浏览器嘛?用例执行后需要关闭浏览器嘛?

用法:
def setup(self):和def teardown(self): 在每个用例执行前后执行一次。
def setup_class(self): 和def teardown_class(self): 在当前类的所有用例执行前后执行一次

class TestWeb:

    #这个在所有的用例之前只执行一次
	def setup_class(self):
        print('在每个类执行前的初始化的工作:比如:创建日志对象,创建数据库的连接,创建接口的请求对象。')

    #在每个用例之前执行一次。
 	def setup(self):
        print('\n在执行测试用例之前初始化的代码:打开浏览器,加载网页')

    def test_01_baili(self):
        print('测试-01')

    def test_02_xingyao(self):
        print('测试-02')

    def teardown(self):
        print('\n在执行测试用例之后的扫尾的代码:关闭浏览器')

    def teardown_class(self):
        print('在每个类执行后的扫尾的工作:比如:销毁日志对象,销毁数据库的连接,销毁接口的请求对象。')

6.2 使用@pytest.fixture()装饰器来实现用例的前后置

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

	scope:表示的是被@pytest.fixture标记的方法的作用域。function(默认),class,module,	package/session
	params:参数化
	autouse:默认False   autouser=Ture 自动执行
	ids:当使用params参数化时,给每一个值设置一个变量,意义不大
	name:表示的是被@pytest.fixture标记的方法取一个别名
import pytest

class TestLogin:
    age = 18

    #部分用例前置,后置,yield表示后置
    @pytest.fixture()
    def my_fixtre(self):
        print("前置")
        yield
        print("后置")
        
    #将my_fixture函数传入,将此用例进行前后置
    def test_01(self,my_fixtre):
        print("测试-1")

    def test_02(self):
        print("测试-2")

执行结果:
test_login.py::TestLogin::test_02 测试-2
PASSED
test_login.py::TestLogin::test_01 前置
测试-1
PASSED后置

参数化:(一般不用,了解)

注:写在最外层,不在类中填写,函数名中传入request是注定写法,request.param 返回参数也是固定写法

import pytest

@pytest.fixture(scope="function", params=["成龙", "甄子丹", "蔡依林"])

#函数名中传入request是注定写法,request.param 返回参数也是固定写法
def my_fixtre(request):
    yield request.param    #retuen和yield都表示返回的意思,但是yield后面可以跟代码
    print("前置")

class TestLogin:
    age = 18

    @pytest.mark.usermanage
    def test_01(self,my_fixtre):
        print("测试-1")
        print(my_fixtre)

    @pytest.mark.run(order=1)
    @pytest.mark.smoke
    def test_02(self):
        print("测试-2")

#执行结果:
test_login.py::TestLogin::test_02 测试-2
PASSED
test_login.py::TestLogin::test_01[\u6210\u9f99] 测试-1
成龙
PASSED前置

test_login.py::TestLogin::test_01[\u7504\u5b50\u4e39] 测试-1
甄子丹
PASSED前置

test_login.py::TestLogin::test_01[\u8521\u4f9d\u6797] 测试-1
蔡依林
PASSED前置

test_pass.py::TestPass::test_03 测试-3
PASSED
test_pass.py::TestPass::test_04 测试-4
PASSED

6.3 通过conftest.py和@pytest.fixture()结合使用实现全局的前后置应用

使用规则:

  1. conftest.py文件是单独存放的一个夹具配置文件,名称不能更改
  2. 用处可以在不同的py文件中使用同一个fixture函数
  3. 原则上conftest.py需要和运行的测试用例放到同一层级,并且不需要做任何的import导入的操作

全局的conftest.py文件,在最外层
全网最全Pytest框架使用教程和项目实战~从入门到精通,Pytest,Python 接口自动化测试,pytest,python,开发语言,单元测试
内部的conftest.py文件
全网最全Pytest框架使用教程和项目实战~从入门到精通,Pytest,Python 接口自动化测试,pytest,python,开发语言,单元测试
用例调用
全网最全Pytest框架使用教程和项目实战~从入门到精通,Pytest,Python 接口自动化测试,pytest,python,开发语言,单元测试


执行结果:
testcase/test_login.py::TestLogin::test_02 测试-2
PASSED
testcase/test_login.py::TestLogin::test_01[\u4ed8\u4f1f\u6770-\u6210\u9f99] 测试-1
付伟杰
成龙
PASSED全局前置
用户管理前置

testcase/test_login.py::TestLogin::test_01[\u4ed8\u4f1f\u6770-\u7504\u5b50\u4e39] 测试-1
付伟杰
甄子丹
PASSED全局前置
用户管理前置

testcase/test_login.py::TestLogin::test_01[\u4ed8\u4f1f\u6770-\u8521\u4f9d\u6797] 测试-1
付伟杰
蔡依林
PASSED全局前置
用户管理前置

testcase/test_login.py::TestLogin::test_01[\u5c0f\u5218-\u6210\u9f99] 测试-1
小刘
成龙
PASSED全局前置
用户管理前置

testcase/test_login.py::TestLogin::test_01[\u5c0f\u5218-\u7504\u5b50\u4e39] 测试-1
小刘
甄子丹
PASSED全局前置
用户管理前置

testcase/test_login.py::TestLogin::test_01[\u5c0f\u5218-\u8521\u4f9d\u6797] 测试-1
小刘
蔡依林
PASSED全局前置
用户管理前置

testcase/test_login.py::TestLogin::test_01[\u5c0f\u5b5f-\u6210\u9f99] 测试-1
小孟
成龙
PASSED全局前置
用户管理前置

testcase/test_login.py::TestLogin::test_01[\u5c0f\u5b5f-\u7504\u5b50\u4e39] 测试-1
小孟
甄子丹
PASSED全局前置
用户管理前置

testcase/test_login.py::TestLogin::test_01[\u5c0f\u5b5f-\u8521\u4f9d\u6797] 测试-1
小孟
蔡依林
PASSED全局前置
用户管理前置


================================================================= 10 passed in 0.04s =================================================================


七、pytest结合allure-pytest插件生成allure测试报告

7.1 allure环境搭建

全网最全Pytest框架使用教程和项目实战~从入门到精通,Pytest,Python 接口自动化测试,pytest,python,开发语言,单元测试
全网最全Pytest框架使用教程和项目实战~从入门到精通,Pytest,Python 接口自动化测试,pytest,python,开发语言,单元测试

7.2 生成allure测试报告实例

全网最全Pytest框架使用教程和项目实战~从入门到精通,Pytest,Python 接口自动化测试,pytest,python,开发语言,单元测试

import os
import pytest

class TestApi:

    def test_01(self):
        print("测试-1")

    def test_02(self):
        print("测试-2")

if __name__ == '__main__':
    pytest.main(['-vs', '--alluredir', './tmp'])
    os.system('allure generate ./tmp -o ./report --clean')


全网最全Pytest框架使用教程和项目实战~从入门到精通,Pytest,Python 接口自动化测试,pytest,python,开发语言,单元测试

八、@pytest.mark.parametrize—参数化

@pytest.mark.parametrize(args_name,args_value)

args_name:参数名
args_value:参数值(列表,元祖,字典列表,字典元祖) 有多少个值用例就会执行多少次
import pytest
class TestLogin:
    age = 18

    @pytest.mark.parametrize("args", ["老付", "小刘", "小孟"])
    def test_01(self, args):
        print("测试-1")
        print(args)

    def test_02(self):
        print("测试-2")

if __name__ == '__main__':
    pytest.main()
    
#执行结果
test_login.py::TestLogin::test_01[\u8001\u4ed8] 测试-1
老付
PASSED
test_login.py::TestLogin::test_01[\u5c0f\u5218] 测试-1
小刘
PASSED
test_login.py::TestLogin::test_01[\u5c0f\u5b5f] 测试-1
小孟
PASSED
test_login.py::TestLogin::test_02 测试-2
PASSED

九、YAML文件详解–实现接口自动化

9.1 YAML介绍

全网最全Pytest框架使用教程和项目实战~从入门到精通,Pytest,Python 接口自动化测试,pytest,python,开发语言,单元测试文章来源地址https://www.toymoban.com/news/detail-742261.html

9.2 YAML编写测试用例常用关键字

feature: 模块名(必填)
story: 接口名(必填)
title: 用例标题(必填)
request:请求(必填)
    method:请求方法(必填)
    url:请求路径(必填)
    headers:请求头
    params:url之后的参数
    data:表单数据
    json:json数据
    files:文件上传
extract:
    access_token: $.access_token    接口关联提取
vaildate:断言(必填)
    codes:断言状态码
    equals:相等断言
    contains:包含断言
    db_equals: 数据断言

9.3 示例

#test_api.yaml文件-

  name: 获取token鉴权码的接口
  request:
    url: https://www.baidu.com/
    method: get
    headers:
      Content-type: application/json
      User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36
  vaildate:
    eq: 200
#yaml.util.py文件

import yaml
class YamlApi:
    def __init__(self, yaml_file):
        """
        通过init方法把yaml文件传入到这个类
        :param yaml_file: yaml文件路径
        """
        self.yaml_file = yaml_file

    def write_yaml(self):
        """
        读取yaml,对yaml反序列化,就是把我们的yamk格式转成dict格式
        :return:
        """
        with open(self.yaml_file, encoding="utf-8") as f:
            value = yaml.load(f, Loader=yaml.FullLoader)
            print(value, type(value))

        return value


if __name__ == '__main__':
    YamlApi("./test_api.yaml").write_yaml()

#test_api.py 文件

import pytest
import requests

from testcase.yaml_util import YamlApi


class TestApi:

    @pytest.mark.parametrize("args", YamlApi("./test_api.yaml").write_yaml())
    def test_10_baidu(self, args):
        print(args)
        url = args["request"]["url"]
        code = args["vaildate"]["eq"]
        res = requests.get(url)
        code1 = res.status_code
        print(code1)
        assert code == code1


if __name__ == '__main__':
    pytest.main(["-vs", "./test_api.py"])



# 执行结果
test_api.py::TestApi::test_10_baidu[args0] PASSED

============================== 1 passed in 0.46s ==============================

到了这里,关于全网最全Pytest框架使用教程和项目实战~从入门到精通的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 全网最全的 postman 工具使用教程

    postman是一款支持http协议的接口调试与测试工具,其主要特点就是功能强大,使用简单且易用性好 。 无论是开发人员进行接口调试,还是测试人员做接口测试,postman都是我们的首选工具之一 。 那么接下来就介绍下postman到底有哪些功能,它们分别都能干些什么 。下面先通过

    2024年03月21日
    浏览(27)
  • node npm 下载,安装,使用 全网最全教程

    node npm 下载,安装,使用 全网最全教程 1.前段时间 使用到vue的时候 需要下载node.js 废话不多说看步骤, 到node.js官网下载 最新的下载地址:[https://nodejs.org/en/download/] 个人建议安装在d盘好点 ![在这里插入图片描述] 最后完成安装 Node.js已经安装完成,可以先进行下简单的测试

    2023年04月15日
    浏览(30)
  • 全网最细最全Appium自动化测试 iOS入门教程,App自动化测试教程,精细整理

    目录:导读 一、MAC电脑上 Appium 的安装流程 二、流程图 三、下载AppiumServerGui和AppiumInspector 四、开始测试       1、真机测试                 1.1 准备工作                 1.2 获取 开发包 .app 结尾                 1.3 WebDriverAgent使用                 1.4 配置 Appium Inspec

    2024年02月07日
    浏览(42)
  • QT使用QAxObject读取Excel教程-全网最全

    QT中没有操作Excel的官方库,本文章介绍的是Windows系统的ActiveX对象(QAxObject)操作Excel。 当然还有一些开源库可以用来操作Excel,详见:Qt处理Excel的一些库 本文只对QAxObject读取Excel作说明。 首先,我们先来解释一些概念,方面我们去理解Qt操作excel的基本流程。 Qt中,QAxObject对

    2024年02月15日
    浏览(30)
  • 2023全网最细最全保姆级gitlab+Jenkins+maven自动化部署springboot项目教程

    如果没有Linux基础请仔细看好每一个步骤,避免出错,从0到1带你搭建自动化部署环境,包括服务器安装,自动化部署所需各类软件安装配置,详细贴出每一步,不断步骤,让你一次搭建部署完成,希望这篇文章能给大家带来一定的帮助,话不多说开始整 2.0 CentOs安装 2.0.1 下载VM虚拟机 我直

    2024年02月08日
    浏览(47)
  • Nuxt3 全栈 项目服务器部署 全网最全最细保姆级教程 解决各种小坑 时光小灶

    服务器:Nginx 面板:宝塔面板 个人博客:https://timebk.cn/ 原文地址:原文 第一步肯定是打包咯,前提是项目已开发好了以及没有啥Bug了哈 打包好后,你会在项目根目录下发现多了个 .output 文件夹 打开这个文件夹,将里面的所有文件压缩成压缩包 压缩包格式推荐 .rar ,其它格

    2024年02月12日
    浏览(29)
  • pytest 测试框架使用和实战

    目录 一、pytest测试框架概述 二、使用pytest测试框架的使用规范和使用格式 三、pytest案例 and 实战         pytest是一个非常成熟的测试框架,pytest可以让不懂代码的人也可以使用pytest框架进行测试,且容易上手,对比其它框架也更为灵活,pytest可以结合一些python库来实现web自

    2024年02月14日
    浏览(29)
  • 超详细从入门到精通,pytest自动化测试框架实战-fixture多样玩法(九)

    在编写测试用例,都会涉及到用例执行之前的环境准备工作,和用例执行之后的环境清理工作。 代码版的测试用例也不例外。 pytest自动化测试框架:https://www.bilibili.com/video/BV18K411m7FH/ 在自动化测试框架当中,我们也需要编写: 用例执行之前的环境准备工作代码(前置工作代码

    2023年04月11日
    浏览(36)
  • 从零开始的Django框架入门到实战教程(内含实战实例) - 01 创建项目与app、加入静态文件、模板语法介绍(学习笔记)

      Django是目前比较火爆的框架,之前有在知乎刷到,很多毕业生进入大厂实习后因为不会git和Django框架3天就被踢掉了,因为他们很难把自己的工作融入到整个组的工作中。因此,我尝试自学Django并整理出如下笔记。   在这部分,我将从Django的安装讲起,从创建项目到制

    2024年02月09日
    浏览(50)
  • Python+Requests+Pytest+Excel+Allure 接口自动化测试项目实战【框架之间的对比】

            --------UnitTest框架和PyTest框架的简单认识对比与项目实战-------- 定义: Unittest是Python标准库中自带的单元测试框架,Unittest有时候也被称为PyUnit,就像JUnit是Java语言的标准单元测试框架一样,Unittest则是Python语言的标准单元测试框架。 Pytest是Python的另一个第三方单元测

    2024年02月09日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包