Pytest基本框架&用法
"""文件名要以test_开头或_test结尾,也就是test_*.py或*_test.py"""
class Test_测试: # 类的Test的t要大写,函数test小写
def test_C01(self):
print("\n用例1")
assert 1 == 1
def test_C02(self):
print("\n用例2")
assert 2 == 2
def test_C03(self):
print("\n用例3")
assert 3 == 2
执行测试,建议用系统终端(我这里是windows),一定要在测试文件所在的目录下执行,如果有多个文件分不清,可以指定具体目录
可以显示代码中print的内容,在命令行后加上-s即可,-v是展示更详细的信息
产生测试报告
这里用的是pytest-html,在命令行后加上:--html=文件名.html --self-contained-html
pytest (目录) --html=文件名.html --self-contained-html
初始化清除
模块module初始化/清除:在每个用例开始前初始化,结束后清除,只会执行一次
def setup_module():
print("\n----初始化模块----")
def teardown_module():
print("\n----清除模块----")
class Test_测试:
def test_C01(self):
print("\n用例1")
assert 1 == 1
def test_C02(self):
print("\n用例2")
assert 2 == 2
def test_C03(self):
print("\n用例3")
assert 3 == 2
class Test_测试2:
def test_C11(self):
print("\n用例b1")
assert 1 == 1
def test_C12(self):
print("\n用例b2")
assert 2 == 2
类class初始化/清除,在指定的类开始前初始化,结束或清除
def setup_module():
print("\n----初始化模块----")
def teardown_module():
print("\n----清除模块----")
class Test_测试:
@classmethod
def setup_class(cls):
print("\n----初始化类----")
@classmethod
def teardown_class(cls):
print("\n----清除类----")
def test_C01(self):
print("\n用例1")
assert 1 == 1
def test_C02(self):
print("\n用例2")
assert 2 == 2
def test_C03(self):
print("\n用例3")
assert 3 == 2
class Test_测试2:
def test_C11(self):
print("\n用例b1")
assert 1 == 1
def test_C12(self):
print("\n用例b2")
assert 2 == 2
方法method初始化/清除,每个方法执行前初始化,结束后清除
def setup_module():
print("\n----初始化模块----")
def teardown_module():
print("\n----清除模块----")
class Test_测试:
@classmethod
def setup_class(cls):
print("\n----初始化类----")
@classmethod
def teardown_class(cls):
print("\n----清除类----")
def setup_method(self):
print("\n----初始化方法----")
def teardown_method(self):
print("\n----清除方法----")
def test_C01(self):
print("\n用例1")
assert 1 == 1
def test_C02(self):
print("\n用例2")
assert 2 == 2
def test_C03(self):
print("\n用例3")
assert 3 == 2
class Test_测试2:
def test_C11(self):
print("\n用例b1")
assert 1 == 1
def test_C12(self):
print("\n用例b2")
assert 2 == 2
目录初始化/清除,在需要初始化的目录下创建conftest.py,里面内容为:
在文件1结束后先清除文件1的模块,再开始文件2
指定用例执行
指定一个模块
pytest 目录\子目录\...\文件名.py
指定目录/多个目录
pytest 目录1 目录2\文件名
指定类
pytest 目录\子目录\...\文件名.py::类名
指定名字
可以是函数名/类名/模块名/目录名,名字可以不完整,区分大小写
根据标签
可以同时添加多个标签,也可以给整个类添加标签
parametrize参数化
单参数
import pytest
@pytest.mark.parametrize('name', ['a'])
def test_para01(name):
print("这是"+name)
assert name == 'a'
# 一个参数多个值,有几个值就执行几次,每次把对应的值赋值给参数
@pytest.mark.parametrize('name', ['a', 'b', 'c'])
def test_para02(name):
assert name == 'b'
多参数
import pytest
@pytest.mark.parametrize('name,skill', [('路飞','橡胶'), ('黑胡子','暗暗')])
def test_para01(name, skill):
print("\n用例1")
print('\n'+f'{name}的技能是{skill}')
# 两个参数单个值
@pytest.mark.parametrize('name,skill', [['路飞','橡胶']])
def test_para02(name, skill):
print("\n用例2")
print('\n'+f'{name}的技能是{skill}')
数据驱动
测试用例中有相同的测试步骤,只是测试数据的参数不同,可以把测试数据从用例代码中分离出来
import pytest
class test_功能:
@pytest.mark.parametriz('username, password, expected', [
(None, '123123', '期望结果xxx'), # 对应几条测试用例,有几条就执行几条
('xxx', None, '期望结果xxx'),
('xxx', 'xxx', '期望结果xxx'),
('xxx', 'xxx', '期望结果xxx'),
])
def test(self, username, password, expected):
result = Check(username, password)
assert result == expected