环境搭建
'''
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']}")