pytest
1.文件test_或_test开头
2.类Test开头
3.函数或方法test_开头
import requests
# 测试用例1:手机号码不正确
def test_register_001():
url = "http://192.168.2.36:8089/futureloan/mvc/api/member/register"
cs = {
"mobilephone": "123",
"pwd": "123456"
}
r=requests.post(url,data =cs)
assert r.json()['status'] == 0测试前置和后置: 模块级:setup_model, teardown_module
方法级:setup_function ,teardown_function 环境初始化的动作放到前置中,比如登录,准备测试数据,打开浏览器等等
环境清理的动作放到后置中,比如退出登录,关闭浏览器等
def setup_module():
print("测试前置,模块级别的,整个文件所有用例前执行一次")
def teardown_module():
print("测试后置,模块级别的,整个文件所有用例执行完执行一次")
def setup_function():
print("测试前置,函数级别的,每个用例前执行")
def teardown_function():
print("测试后置,函数级别的,每个用例后执行")
def test_001():
print("用例1")
def test_002():
print("用例2")
def test_003():
print("用例3")测试前置和后置
类别级: setup_class . teardown_class
方法级别 :setup_method. teardown_method
缺点:
1.命名必须按照规则来写
2.使用不灵活,比如类里面有3个用例,2个用例执行时需要前置和后置,
另1个执行时不需要前置和后置,这个场景无法实现class Test001: # 类名同Test开头
def setup_class(self):
print("测试前置,类级别,类里所有用例前执行一次")
def teardown_class(self):
print("测试后置,类级别,类里所有用例执行后执行一次")
def setup_method(self):
print("测试前置,方法级别,每个方法前执行")
def teardown_method(self):
print("测试后置,方法级别,每个方法后执行")
def test_001(self):
print("用例1")
def test_002(self):
print("用例2")
def test_003(self):
print("用例3")import pytest
@pytest.fixture(scope="class")
def login():
print("登录")
yield
print("退出登录")
class Test001:
def test_001(self):
print("Test001用例1")
def test_002(self,login): # 首次使用login的地方执行前置,登录
print("Test001用例2")
def test_003(self):
print("Test001用例3")
def test_004(self):
print("Test001用例4") # 类里用例执行完,执行后置,退出登录
class Test002:
def test_001(self):
print("Test002用例1")
def test_002(self):
print("Test002用例2")
def test_003(self,login): # 首次使用login的地方执行前置,登录
print("Test002用例3")
def test_004(self):
print("Test002用例4") # 类里用例执行完,执行后置,退出登录import pytest
# 登录的测试数据,多组的测试数据,执行同样的用例
# 3组测试数据,每组数据包含用户名,密码
@pytest.fixture(params=[("admin","123"),("root","pwd_123")
,("administrator","1234567890")])
def login_data(request): # 固定写法,参数名为request,是pytest中的关键字
return request.param # 固定写法,用request返回每一组数据
@pytest.fixture(params=[{"user":"admin","pwd":"123"},{"user":"root","pwd":"pwd_123"}])
def login_data2(request):
return request.param
# 登录的接口测试
# 数据驱动的测试模型
# test_login 测试步骤/测试逻辑,login_data 测试数据(从外部获取,比如 yaml,csv,xml,数据库中读取)
# 数据与测试逻辑是分离的,同一个测试逻辑可以执行多组的测试数据
def test_login(login_data):
print("登录的测试数据为:",login_data) # login_data 可以当作元组来用
print("登录的用户名为:", login_data[0])
print("登录的密码为:", login_data[1])
def test_login2(login_data2):
print("登录的测试数据为:",login_data2) # login_data2 可以当作字典来用
print("登录的用户名为:", login_data2["user"])
print("登录的密码为:", login_data2["pwd"])
'''
pytest mark 标记
1.跳过用例(有缺陷的用例跳过不执行)
2.选择部分用例执行,工程中用例规模越来越大,包含界面自动化、接口自动化、性能、冒烟测试
只想执行冒烟测试的用例,怎么办。
自定义标记,mark,后面的字符串自己定义的
自定义标记再pytest.int 中注册下。执行时,加参数:
-m="smoke" 执行smoke标记的用例
-m="func or smoke" 执行smoke标记或者带func标记的用例
-m="func and smoke" 执行smoke标记且带func标记的用例
-m="func and not smoke" 执行带func标记,但是不执行带smoke标记的用例
'''
import pytest
version = 'V1R1'
@pytest.mark.smoke # 冒烟用例
def test_001():
print("用例1")
@pytest.mark.skip("因为xxxx缺陷,该用例执行失败,待缺陷解决后再执行")
def test_002():
print("用例2")
# 前面的表达式为true时跳过,为false时不跳过
@pytest.mark.skipif(version = 'V1R2',reason="V1R2以上的版本增加的功能,V1R2尚不支持")
def test_003():
print("用例3")
@pytest.mark.func # 功能用例
def test_004():
print("用例4")
@pytest.mark.func # 给类上加标记,类中每个用例都带有这个标记
class Test001:
def test_005(self):
print("用例5")
@pytest.mark.smoke #
def test_006(self):
print("用例6")
def test_007(self):
print("用例7")
def test_008(self):
print("用例8")
|