智能体测开Day30pytest测试框架

环境搭建

'''

1)python自带了测试框架,unittest

2)pytest第三方测试框架,功能比unittest更强大

组织测试用例

配置用例失败的策略

生成测试报告

配置用例执行的策略

安装配置pytest

pip install pytest

pip install pytest-html 生成html报告

pip install allure-pytest 生成allure报告

pip install pytest-rerunfailures 失败重执行的策略

配置pytest.ini配置文件

pytest

addopts = -v -s --html=report/report.html --self-contained-html --alluredir=areport --reruns=0

-v -s 详细的报告

--html=report/report.html html报告的生成位置,依赖于pytest-html

--alluredir=areport allure包括的生成位置,依赖于allure-pytest

reruns 失败重执行的次数

测试命名规则

测试文件:test_开头,或者_test结尾

测试类:Test开头,不能有__init__()函数

测试函数、测试方法:test_开头

'''

test001

python 复制代码
'''
assert:校验真实结果和预期结果
assert 后面跟布尔值
校验的分类?
assert xx 判断xx是否为真
assert not xx 判断xx是否为假
assert a in b 判断b中是否含有a  判断字符串b中是否含有子字符串a
assert a==b   判断a和b是否相同
assert a!=b   判断a和b是否不同
'''

def add(a,b):
    return a+b

# 对add()函数进行测试
def test_add1():
    print("测试用例:输入两个整数,校验add函数的正确性")
    real = add(4,5) # 执行测试内容
    # 校验结果:预期结果,和真实的运行结果进行对比
    assert real==9

def test_add2():
    print("测试用例:输入两个小数,校验add函数的正确性")
    real = add(4.1,5.9) # 执行测试内容
    # 校验结果:预期结果,和真实的运行结果进行对比
    assert real==10.0

def test_add3():
    print("测试用例:输入两个字符串,校验add函数的正确性")
    real = add("4.1","5.9") # 执行测试内容
    # 校验结果:预期结果,和真实的运行结果进行对比
    assert real=="4.15.9"

test002

python 复制代码
'''
方法的前置后置
前置:测试之前的准备工作,打开浏览器 登录 准备测试数据 setup
后置: 测试之后的还原清理工作,删除测试数据 退出登录 关闭浏览器 teardown

级别
    setup_module teardown_module 在模块的前后执行一次
    setup_function teardown_function 在函数的前后执行一次
    setup_class teardown_class 在类的前后执行一次
    setup_method teardown_method 在类的方法前后执行一次
'''
def setup_module():
    print("打开浏览器")

def teardown_module():
    print("关闭浏览器")

def setup_function():
    print("登录")

def teardown_function():
    print("退出登录")


def test_01():
    print("---测试用例1:测试添加成员-----")


def test_02():
    print("---测试用例2:测试删除成员-----")

class TestUser:
    def setup_class(self):
        print("类级别前置")

    def teardown_class(self):
        print("类级别后置")

    def setup_method(self):
        print("方法级别前置")

    def teardown_method(self):
        print("方法级别后置")

    def test_change(self):
        print('用例3:修改成员')

test003

python 复制代码
'''
pytest提供了一个装饰器@fixture,可以设置前置后置
 1)命名更加灵活,不需要使用setup和teardown
 2)使用更加灵活,需要使用前置,添加即可,不需要使用的测试函数,也可以不添加
 3)跨文件使用,可以不通过import导包

fixture的级别:
    function:默认级别,在函数或方法的前后执行一次
    module:在模块的前后执行一次
    class:类的前后执行一次
    session:在整个项目的前后执行一次
'''
import pytest

@pytest.fixture(scope="module")
def liulanqi():
    print("打开浏览器")
    # 执行测试内容
    yield
    print("关闭浏览器")

@pytest.fixture(scope='class')
def login():
    print("登录")
    # 执行测试内容
    yield
    print("退出登录")

def test_add(login,liulanqi):
    print("测试用例:添加用户")

def test_delete(login):
    print("测试用例:删除用户")

conftest

python 复制代码
'''
conftest.py文件是python提供的文件,不能随意命名,里面全部都说fixture修饰的函数
    1)系统会默认加载执行conftest.py文件中的全部内容,需要使用时,自动加载
    2)当前目录下,其他文件使用时,可以不通过import导包
    3)一个项目下,可以有多个conftest.py文件,但是,只针对当前目录有效
'''
import pytest


@pytest.fixture(scope='class')
def login():
    print("登录")
    # 执行测试内容
    yield
    print("退出登录")

@pytest.fixture(scope="module")
def liulanqi():
    print("打开浏览器")
    # 执行测试内容
    yield
    print("关闭浏览器")

test03

python 复制代码
'''
fixture修饰的函数,可以设置返回值
return
yield
'''
import pytest


@pytest.fixture
def get_data():
    print("前置")
    return ['tom','123456',78]

@pytest.fixture
def get_data1():
    print("前置")
    return {'username':'tom',"pwd":'123456',"age":78}

@pytest.fixture
def get_data2():
    print("前置")
    yield ['tom','123456',78]
    print("后置")

def test_add(get_data):#get_data的两个作用:1)执行get_data中的内容 2)get_data本身作为一个参数变量,值为get_data函数的返回值
    print("测试用例:")
    print("测试用户名:",get_data[0])
    print("测试密码:",get_data[1])


def test_add1(get_data1):#get_data的两个作用:1)执行get_data中的内容 2)get_data本身作为一个参数变量,值为get_data函数的返回值
    print("测试用例:")
    print("测试用户名:",get_data1['username'])
    print("测试密码:",get_data1['pwd'])

def test_delete(get_data2):
    print("测试删除用户")
    print("测试用户名",get_data2[0])
    print("测试数据密码",get_data2[1])

数据驱动

python 复制代码
'''
测试数据不同,但是测试逻辑相同,使用不同的测试函数,会造成大量的代码冗余,此时可以使用数据驱动

数据驱动:
    数据驱动是将测试数据和测试逻辑分开,测试数据统一写在一个文件或数据库中
    测试逻辑写在一个测试函数中
    将测试数据文件中的每个数据,逐个驱动到测试函数中,去判断执行

测试数据一般写在csv、ini,yaml,excel,xml,properties文件中

数据驱动可以使用python的pytest,java的testng,一些测试工具postman,jmeter都支持数据驱动
'''
import pytest


@pytest.fixture(scope="function",params=[['输入正确的用户名密码,登录成功','admin','12345','登录成功'],
                                         ['输入错误的密码,登录失败','tom','12345','登录失败'],
                                         ['输入错误的用户名,登录失败','dskg','789hbkhijobojkbj','登录失败']])
def get_data(request): # request是pytest提供的,目的是通过request.param去逐个返回params列表中的单个数据
    return request.param


@pytest.fixture(scope="function",params=[{'casename':"输入正确的用户名密码,登录成功",'data':{'user':'admin',"pwd":'12345'},'expect':"登录成功"},
                                         {'casename':"输入错误的密码,登录失败",'data':{'user':'tom',"pwd":'12345'},'expect':"登录失败"},
                                         {'casename':"输入错误的用户名,登录失败",'data':{'user':'adminadklgj',"pwd":'123asr0839ru45'},'expect':"登录失败"}])
def get_data1(request): # request是pytest提供的,目的是通过request.param去逐个返回params列表中的单个数据
    return request.param

def test_login(get_data):
    print(f"测试用例:{get_data[0]}")
    print(f"测试用户名:{get_data[1]}")
    print(f"测试密码:{get_data[2]}")
    # 校验
    # assert 真实结果==get_data[3]


def test_login1(get_data1):
    print(f"测试用例:{get_data1['casename']}")
    print(f"测试用户名:{get_data1['data']['user']}")
    print(f"测试密码:{get_data1['data']['pwd']}")
    print(f"预期结果:{get_data1['expect']}")
相关推荐
MC皮蛋侠客1 小时前
uv 系列(七):CI/CD、Docker 与私有索引——生产级交付
python·ci/cd·docker·uv
邪神与厨二病1 小时前
牛客周赛 Round 153
python·算法
yaoxin5211231 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
groundhappy2 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
培之2 小时前
RTX 5090 安装 pytorch3d
人工智能·pytorch·python
Metaphor6923 小时前
使用 Python 在 PowerPoint 中创建折线图和条形图
python·信息可视化·powerpoint·图表
m沐沐4 小时前
【深度学习】卷积神经网络 数据增强、保存最优模型实现,详细解读
人工智能·python·深度学习·机器学习·cnn·数据增强
天青色等烟雨..4 小时前
全流程ArcGISPro空间分析、三维建模、可视化及Python融合应用技术
开发语言·python
极光代码工作室4 小时前
基于Spark的日志监控与分析平台
大数据·hadoop·python·spark·数据可视化