Pytest基础使用
前言:Pytest是一款成熟的Python测试框架,完全正向兼容unittest。简洁可以实现参数化,自带测试报告;第三方库注意版本兼容。
pip install pytest==6.0.1 # 安装某一版本的pytest
pip install pytest-html==3.1.1 # 安装pytest-html生成测试报告
1,Pytest用例执行规则
- 类的名字建议使用Test大头
- 用例函数的名字必须test开头,区分大小写
# 导入 pytest 测试框架
import pytest
# 定义 TestOrdering 类
class Test11(): # 测试类(测试套)不需要继承
# 定义 test_login11() 方法
def test_login11(self):
print(" 正在执行登录用例第一条 ")
# 定义 test_add() 方法
def test_login22(self):
print(" 正在执行登录用例第二条 ")
# 定义 test_del() 方法
def test_login33(self):
print(" 正在执行登录用例第三条 ")
if __name__ == '__main__':
pytest.main(['-v','-s','test11.py']) # 执行测试代码
- 整个参数是以列表的形式传入
- -v 参数显示命令执行过程, -s 参数显示打印的信息
- 如不加 -s 参数,则 print() 函数打印的信息不会显示
- ‘test11.py’ 是测试文件名字 必须写的
针对加减乘除功能测试
# 被测代码
class Count:
def __init__(self,a,b):
self.a=int(a)
self.b=int(b)
def add(self):
return self.a + self.b
def sub(self):
return self.a - self.b
def mul(self):
return self.a * self.b
def div(self):
return self.a / self.b
# 测试代码
import pytest
class TestAdd():
def test_add1(self):
assert Count(2,3).add() == 5
def test_add2(self):
assert Count(21,31).add() == 52
def test_add3(self):
assert Count(40,70).add() == 110
if __name__ == '__main__':
pytest.main(['-v','-s','jwtest.py'])
2,断言和测试固件
上面代码中使用的 assert 就是断言Pytest是使用断言来判断实际结果和预期结果是否相同;
测试断言
-
判断是否相等
assert x == y
assert x != y
-
判断是否真假
assert x 预期结果是True
assetrt not x 预期结果是False
-
判断是否包含
assert x in y
测试固件
-
类级别
setup_class() 所有测试用例执行前执行一次
teardown_class() 所有测试用例执行后执行一次
-
函数级别(每条测试用例都会执行)
setup() 用例执行前
teardown() 用例执行后
3,参数化-单个参数化
参数化概念
在接口用例中 单个参数的参数化的作用是主要读出所有的测试用例放到列表中,然后依次取出列表中的用例供函数使用,从而完成每一个用例的执行。
单个参数化语法
@pytest.mark.parametrize(argnames,argvalues)
import pytest
@pytest.mark.parametrize("username",["张三","李四","王五"])
def test_login(username):
print(f"登录用户数据为 {username}") # 引用变量username
if __name__ == '__main__':
pytest.main(['-v','-s','test12.py'])
- 函数形参username,必须和参数化写的参数名字一致
- 参数化类似个for循环,依次从参数列表中取出元素赋值个username变量
- 列表数据格式还可以是元组,字典等类型,类型相同(不同也OK,不要自添烦恼)
@pytest.mark.parametrize("case",[(2,3,5),(21,31,52),(40,70,110)])
def test_add1(self,case):
j=Count(case[0],case[1]) # 有黄色警告是正常的
assert j.add()==case[2]
@pytest.mark.parametrize("user",[{'name':'zhangsan'},{'password':123456}])
def test_register (user):
Rsgister(user['name'], user['password'])
4,参数化-多个参数化
import pytest
@pytest.mark.parametrize("username",["张三","李四","王五"])
@pytest.mark.parametrize("password",["test1234","test5678","test9876"])
def test_login(username, password):
print(f"登录用户名为 {username},密码{password}") # 引用变量username
if __name__ == '__main__':
pytest.main(['-v','-s','test14.py'])
- 多个参数化时类似多层for循环,测试用例数回以相乘的方法增加,比如上面会有 3*3=9条测试结果
5,pytest测试报告
pytest.ini报告配置文件
- 文件名称不能更改
- 路径必须放在项目工程根目录下
- 规则名称不能更改
- 唯一能变的是规则值
总结:pytest基本使用API表格
pytest对象 | 方法 |
---|---|
pytest | test开头是用例 |
assert 断言 | |
@pytest.mark,parameterize() [字符串、元组、字典] |