一、pytest执行方式:
1. pytest的main函数执行
pytest.main(["-s","-v",...])
2. 命令行直接执行
pytest -s -v
二、pytest的常用命令行参数
-s :执行时显示用例中print打印结果
-v :更详细的显示用例执行情况
-x :出现失败的用例后就停止运行;配合-maxfail=5 参数可以配置失败5次才停止
-m:只运行mark标记的用例(标记方法为@pytest.mark.xxx)
-q :简化输出,正与-v参数相反
pytest.ini常用配置(注:执行命令时pytest.ini必须在目录的根目录下才会识别)
[pytest]
addopts = -vs --alluredir ./py_report
testpaths = ./case
python_files = *case*.py
python_classes = Test*
python_functions = test_*
addopts:命令执行默认追加的参数
testpaths:指定从哪个路径下扫描case
python_files:指定扫描的py文件格式
python_classes:指定扫描的class的名称
python_functions:指定扫描方法(用例)的名称
三、编写测试用例实用方法
1. 基本用法
class StreamCase:
def setup_class(self):
print("类前置:setup_class")
def teardown_class(self):
print("类后置:teardown_class")
def setup(self):
print("方法前置:setup_method")
def teardown(self):
print("方法后置:teardown_method")
def test_01(self):
print("test01测试用例执行~")
def test_02(self):
print("test02测试用例执行~")
由执行结果可以看出执行顺序是:setup_class > setup > 用例方法 > teardown > teardown_class
2. 高阶用法
1)pytest之fixture
@pytest.fixture(scope="function", params=None, autouse=False, ids=None, name=None)
以上为默认的参数,常用的参数如下:
scope参数:
scope="function":作用于每个测试方法,每个test都运行一次
scope="class":作用于整个类,每个class的所有test只运行一次
scope="module":作用于整个模块,每个module的所有test只运行一次
scope="session":作用于整个session(慎用),每个session只运行一次
params参数:为以后的方法提供参数
autouse参数(一般与scope搭配使用):是否自动运行,默认为False不运行,设置为True自动运行
应用:给调用它的方法提供数据
import pytest
@pytest.fixture(params=[1,2,3])
def get_param(request): # 传入参数request 系统封装参数 必须用request
return request.param # 取列表中单个值,默认的取值方式
def test_f(get_param):
print("test_f运行")
assert get_param == 2
结果是test_f方法获取到了params中的每个值并进行断言
1)pytest之参数化:
@parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
以上为默认的参数,常用的参数是前两个:
argnames:参数名
argvalues:参数对应值,类型必须为list
@pytest.mark.parametrize("参数1,参数2",[(值11,值12),(值21,值22)])
应用:参数化常用到
import pytest
@pytest.mark.parametrize("p1,p2", [(1, 9), (2, 8), (3, 7)])
def test_param(p1, p2):
print("p1=", p1, ",p2=", p2, "和=", p1 + p2)
assert p1 + p2 == 10
结果是test_param方法获取到p1、p2,值对应list中的元组的每个值
实用技巧,argvalues是list格式,也可以用方法返回一个list然后调用这个方法获取list,做关联的时候可能会用到
import pytest
def get_param():
return [(1, 9), (2, 8), (3, 7)]
@pytest.mark.parametrize("p1,p2", get_param())
def test_param1(p1, p2):
print("p1=", p1, ",p2=", p2, "和=", p1 + p2)
assert p1 + p2 == 10
效果和上面是一样的。
3)pytest之conftest.py
pytest有一个自动识别机制不需要导包就可以使用写在conftest.py文件下面的方法
前提条件:
1. conftest.py与运行的用例要在同一个pakage下,并且有__init__.py文件
2. conftest.py配置脚本名称是固定的,不能改名称
3. conftest.py文件不能被其他文件导入
4. 所有同目录测试文件运行前都会执行conftest.py文件
利用这个机制可以将上面说的fixture写到conftest.py文件中,还可以将返回参数list的方法写到conftest.py文件中,在用例想用的时候可以直接调用,无需导包。
因为allure支持pytset,之后使用过程中往往会结合allure生成测试报告,后续需要学习allure中的一些常用技巧也会做成笔记,相互学习!