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)主函数模式。

运行所有:

python 复制代码
pytest.main()

带参数运行:

python 复制代码
pytest.main(['-s'])
pytest.main(['-v'])
pytest.main(['-vs'])

指定模块运行:

python 复制代码
pytest.main(['-vs', 'test_login.py'])

指定目录:

python 复制代码
pytest.main(['-vs', './interface_testcase'])

通过nodeid

python 复制代码
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默认的行为。

运行的规则:不管是主函数的模式运行,命令行模式运行,都会读取该文件。

格式:

python 复制代码
[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标记,如下所示:

python 复制代码
@pytest.mark.run(order=1)

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

smoke:冒烟用例,分布在各个模块里

在pytest.ini中加入:

python 复制代码
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)无条件跳过

python 复制代码
@pytest.mark.skip(reason="不合适")

(2)有条件跳过

python 复制代码
@pytest.mark.skipif(age>=18,reason="已成年")

生成报告文件:

python 复制代码
addopts = -vs --html ./report/report.html

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

(1)setup/teardown,setup_class/teardown_class

python 复制代码
    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()装饰器来实现部分用例的前后置

python 复制代码
@pytest.fixture(scope="", params="", autouse="", ids="", name="")

scope:表示的是被@pytest.fixture标记的方法的作用域,function、class、module、package/session。

params:参数化(支持:列表[]、元祖()、字典列表[{},{},{}]、字典元祖({},{},{}))。

autouse=True:自动执行,默认False。

ids:当使用params参数化时,给每一个值设置一个变量名。

name:给表示的是被@pytest.fixture标记的方法取一个别名。

python 复制代码
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

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

相关推荐
CIb0la17 分钟前
Ai自动补全编程工具:llama vscode
运维·开发语言·学习·测试工具·程序人生
孙克旭_1 小时前
day030-Shell自动化编程-函数
linux·运维·自动化
面朝大海,春不暖,花不开3 小时前
管理数据洪流:自动化处理与归档每日数据文件的策略与实践
运维·python·自动化
程序员的世界你不懂11 小时前
Appium+python自动化(十)- 元素定位
python·appium·自动化
钢铁男儿21 小时前
一文掌握 Tombola 抽象基类的自动化子类测试策略
运维·自动化
痴人说梦梦中人1 天前
SwaggerFuzzer:一款自动化 OpenAPI/Swagger 接口未授权访问测试工具
网络安全·渗透测试·自动化·api测试·漏洞利用·信息搜集
代码的乐趣1 天前
支持selenium的chrome driver更新到137.0.7151.68
chrome·selenium·测试工具
Kookoos1 天前
Dynamics 365 Finance + Power Automate 自动化凭证审核
运维·自动化·dynamics 365·power automate
半导体守望者2 天前
ADVANTEST R3764 66 R3765 67爱德万测试networki connection programming网络程序设计手册
经验分享·笔记·功能测试·自动化·制造