1.添加断言
import pytest
def add(a, b):
return a + b
def test_dengyu():
assert 3 == add(1, 2)
def test_budengyu():
assert 5 != add(1,3) # 错误就显示失败
def test_dayu():
assert 5 > add(1,3)
def test_dayudengyu():
assert 5 >= add(1,3)
def test_xiao():
assert 1 < add(1,2)
def test_xiaoyudengyu():
assert 1 <= add(1,3)
def test_baohan():
assert 1 in [1,2,3]
def test_bubaohan():
assert 1 not in [1,2,3]
def test_ifture():
assert 1 is True # 需要手动转换数据类型
# assert bool(1) is True
def test_iffalse():
assert 0 is False
if __name__ == "__main__":
pytest.main(['test_pytest2.py'])
2.pytest参数化
import pytest
# 参数化
def add(a, b):
return a + b
# 第一种实现参数化的写法
@pytest.mark.parametrize(['x','y'],[(1,2),(0,3)])
def test_add1(x,y):
assert 3 == add(x, y)
# 第二种实现参数化的写法
xy = [(-1,3),(-1,4), (1,-4)]
@pytest.mark.parametrize(['x','y'],xy)
def test_add2(x,y):
assert 3 == add(x, y)
if __name__ == "__main__":
pytest.main(['test_pytest3'])
3.外部mysql
import pytest
# 参数化
def add(a, b):
return a + b
# 第一种实现参数化的写法
@pytest.mark.parametrize(['x','y'],[(1,2),(0,3)])
def test_add1(x,y):
assert 3 == add(x, y)
# 第二种实现参数化的写法
xy = [(-1,3),(-1,4), (1,-4)]
@pytest.mark.parametrize(['x','y'],xy)
def test_add2(x,y):
assert 3 == add(x, y)
# 把存储在mysql当中的测试用例参数化出来
import pymysql
db_info={
"host":"192.168.0.108",
"user":"root",
"password":"123",
"database":"mydb2",
"charset":"itf8"
}
conn = pymysql.connect(**db_info)
cursor = conn.cursor()
sql = "select * from mumu"
cursor.execute(sql)
result = cursor.fetchall()
@pytest.mark.parametrize(['id',
'case_id',
'title',
'interface_type',
'uri',
'method',
'if_login',
'input_data',
'data_type',
'expect'],result)
def test_mysql_param(id,case_id,title,interface_type,uri,
method,if_login,input_data,data_type,expect):
print(title)
if __name__ == "__main__":
pytest.main(['test_pytest3'])
4.pytest测试用例组织管理
1.在PyTest当中,测试方法执行的顺序,默认是从上到下
2.我们使用pytest.mark.run进行测试函数执行顺序的标记时
需要先安装pip install pytest_ordering
3.在优先级方面(正数) pytest.mark.first是最高优先级
(倒数)pytest.mark.last优先级要低于order=-1
4.如果我们在进行标记顺序时,假设我们采用了数字形式,那么就都用数字形式(first和 order=1 不同时用)
5.鼠标在空白处右击执行,在类中右击只执行类中的
# 测试用例的组织管理
import pytest
def test_01():
print(1)
def test_02():
print(2)
@pytest.mark.first # 永远优先执行
def test_03():
print(3)
@pytest.mark.run(order=1) # 先运行
def test_04():
print(4)
class TestLogin():
def test_05(self): #在类里面叫方法,有个默认参数self
print(5)
@pytest.mark.run(order=2)
def test_06(self):
print(6)
@pytest.mark.run(order=-1) # 最后执行
def test_07(self):
print(7)
@pytest.mark.last # 永远最后执行
def test_08(self):
print(8)
if __name__ == "__main__":
pytest.main(['test_pytest4.py'])
5.pytest的前置和后置操作
在Python 3.6的版本中下边的两个前置和后置函数setup和teardown是可以运行的,但是优先级没有setup_function和teardown_function的优先级高
# pytest的前置和后置操作
import pytest
def setup_module(): # 前置模块范围的会触发一次
print("这是前置的模块级别的函数")
def teardown_module():
print("这是后置的模块级别的函数")
def setup_function(): # 函数级别的将会在运行每一个测试函数的前面和后面都会运行
print("这是前置的函数级别运行的函数")
def teardown_function():
print("这是后置的函数级别运行的函数")
# def setup():
# print("前置函数级别的111111")
# 这个两个级别没有带function的级别高,老的python版本写法
# def teardown():
# print("后置函数级别的22222")
def test_01():
print("测试1运行了")
assert 1==1
def test_02():
print("测试2运行了")
assert 1==1
# 先执行模块,再执行类中的方法
class TestMyClass():
def setup_class(self):
print("这是前置的class级别的方法")
def teardown_class(self):
print("这是后置的class级别的方法")
# 类中的前置和后置方法必须要写method
# 不能写function
def setup_method(self, method):
print("我是前置的类中的方法级别的")
print(method)
def teardown_method(self):
print("我是前置的类中的方法级别的")
def test_of_method1(self):
print("<<<我是类中的测试方法11111>>>")
def test_of_method2(self):
print("<<<我是类中的测试方法22222>>>")
if __name__ == "__main__":
pytest.main(['test_pytest5.py'])
6.fixture
import pytest
@pytest.fixture()
def first_fixture():
print("这是我人生中第一个fixture")
return 1
@pytest.fixture()
def second_fixture(first_fixture):
print("这是我人生中的第二个fixture")
return first_fixture + 2
def test_case1(first_fixture):
print("这是我的第一个测试用例")
r = first_fixture
print(r)
def test_case2(second_fixture):
print("这是我的第二个测试用例")
print(second_fixture)