Pytest学习总结


前言

本篇文章主要记录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.param

class 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报告集成,并根据自动化报告的错误率发送邮件。

  • 13
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pytest 是一个常用的 Python 测试框架,用于编写和执行自动化测试用例。以下是 Pytest 接口自动化测试的一般步骤: 1. 安装 Pytest:使用 pip 工具安装 Pytest,可以通过以下命令进行安装: ``` pip install pytest ``` 2. 准备测试文件:创建一个以 `test_` 开头的 Python 文件,例如 `test_api.py`。 3. 导入依赖库:在测试文件中,导入需要用到的依赖库,例如 requests 库用于发送 HTTP 请求,json 库用于处理 JSON 数据等。 4. 编写测试用例:在测试文件中,编写测试用例。使用 `def` 关键字定义一个测试函数,函数名以 `test_` 开头,例如 `test_login()`。 5. 准备测试数据:根据测试需要,准备好需要发送的请求数据和预期的响应结果。可以将测试数据保存在一个字典中,方便后续使用。 6. 发送请求并断言:在测试用例中,使用相应的方法发送请求,并通过断言语句对响应结果进行验证。例如使用 requests 库发送 POST 请求,并使用 assert 语句判断返回的状态码和响应内容是否符合预期。 7. 执行测试用例:在终端中切换到测试文件所在目录,并执行以下命令运行测试用例: ``` pytest ``` 8. 查看执行结果:Pytest 会自动搜索当前目录及其子目录中以 `test_` 开头的文件,并执行其中的测试用例。执行完毕后,会显示测试用例的执行结果,包括通过的用例数、失败的用例数和运行时间等信息。 以上就是使用 Pytest 进行接口自动化测试的一般步骤。根据具体的测试需求,可以进一步优化测试结构和编写更多的测试用例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值