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

相关推荐
99乘法口诀万物皆可变3 小时前
CANoe_TestModule截图功能TestReportAddWindowCapture
测试工具
欲游山河十万里7 小时前
pytest(三)——参数化@pytest.mark.parametrize
pytest
Elastic 中国社区官方博客9 小时前
Elasticsearch:使用 LLM 实现传统搜索自动化
大数据·人工智能·elasticsearch·搜索引擎·ai·自动化·全文检索
99乘法口诀万物皆可变12 小时前
ODX相关基础知识普及
测试工具·测试用例
今天好像不上班13 小时前
软件验证与确认实验二-单元测试
测试工具·算法
南种北李1 天前
Linux自动化构建工具Make/Makefile
linux·运维·自动化
IG工程师1 天前
关于 S7 - 1200 通过存储卡进行程序更新
经验分享·笔记·自动化
wdxylb1 天前
Pyhton爬虫使用Selenium实现浏览器自动化操作抓取网页
爬虫·selenium·测试工具
怒放的生命.1 天前
电器自动化入门08:隔离变压器、行程开关介绍及选型
运维·自动化·电气自动化·电工基础
我爱学Python!1 天前
基于 LangChain 的自动化测试用例的生成与执行
人工智能·自然语言处理·langchain·自动化·llm·测试用例·大语言模型