test_case.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@File : test_case.py
@Author : sunyajun
@Creation Time : 2023/7/31 9:41
Description : pytest常用代码示例
"""
import pytest
# @pytest.fixture()(scope="function",params=None,autouse=False, ids=None, name=None)
"""
调用时被优先执行 预处理或者重复操作scope:被标记方法的作用域
"function" (default):作用于每个测试方法,每个 test 都运行一次
"class":作用于整个类,每个 class 的所有 test 只运行一次
"module":作用于整个模块,每个 module 的所有 test 只运行一次
"session":作用于整个 session(慎用),每个 session 只运行一次
"package":主要应用于每个包下的fixture
执行顺序:session>>module>>class>>function
params:(list 类型)提供参数数据,供调用标记方法的函数使用
autouse:是否自动运行,默认为 False 不运行,设置为 True 自动运行
若不为 True 则需要调用才会优先执行。
ids表示在fixture对参数化的内容进行加上标识,比如让别人知道这个传入的参数是什么意思。用于什么样的测试用例。默认是传参数内容:
"""
# 类外部的fixture
@pytest.fixture()
def out_before():
print("out_before-前置操作")
yield
print("out_before-后置操作")
# fixture相互调用
@pytest.fixture()
def ll(out_before):
print("fixture相互调用")
# name参数可以重命名
@pytest.fixture(name="rename_l")
def l():
print("重命名")
class TestCase:
def test_01(self):
print("assert 1 为真")
assert 1
def test_02(self):
print("assert 0 为假")
assert 0
# @pytest.mark.xxx
@pytest.mark.run_these
def test_03(self):
print("带有标记的用例,标记名:run_these")
assert 1
@pytest.mark.run_these
def test_04(self):
print("带有标记的用例,标记名:run_these")
assert 0
@pytest.mark.run_other
def test_05(self):
print("带有标记的用例,标记名:run_other")
assert 1
# 直接跳过
@pytest.mark.skip()
def test_06(self):
print("跳过用例的执行")
assert 1
# 满足条件时再跳过
# condition:跳过的条件,必传参数;reason:标注原因,必传参数
@pytest.mark.skipif(condition=1, reason="skip用例跳过时备注")
def test_07(self):
print("在满足条件时跳过用例")
assert 1
# xfail(condition=None, reason=None, raises=None, run=True, strict=False)
# condition:预期失败的条件,必传参数;reason:失败的原因,必传参数
@pytest.mark.xfail(condition=1 < 2, reason="标记原因")
def test_08(self):
# condition为真时,不执行直接标记为失败;condition为假时正常执行
print("标记预期失败的用例")
assert 0
list1 = [(3, 2), (0, 3)]
# parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
# pytest.mark.parametrize(argnames,argvalues) 参数名,参数值(有几个参数值就会执行几次)
@pytest.mark.parametrize("a,b", list1)
def test_09(self, a, b):
print("参数化执行")
assert a > b
# @pytest.mark.repeat(n)执行当前用例 n 次 然后再往下执行其他用例
# repeat需要安装 pip install pytest-repeat
@pytest.mark.repeat(3)
def test_10(self):
print("重复执行当前用例")
assert 1
# @pytest.mark.last--最后一个执行
# 需要安装 pip install pytest-ordering
@pytest.mark.last
def test_12(self):
print("用例最后一个执行")
assert 1
# @pytest.mark.run(order=n)---第n个执行
@pytest.mark.run(order=3)
def test_11(self):
print("用例第3个执行")
assert 1
@pytest.mark.run(order=1)
def test_12(self):
print("用例第2个执行")
assert 1
# 自定义测试用例预置条件--pytest 精髓fixture
@pytest.fixture()
def before(self):
print("before-优先于调用的用例执行")
@pytest.fixture()
def after(self):
print("after-优先于调用的用例执行")
def test_13(self, before, after):
print("多个fixtrue调用,顺序为传入顺序")
assert 1
def test_14(self, after, before):
print("多个fixtrue调用,顺序为传入顺序")
assert 1
def test_15(self, out_before):
print("类外部的fixture")
assert 1
def test_16(self, ll):
print("fixtrue 相互调用")
def test_17(self, rename_l):
print("重命名fixtrue,继续使用以前的名字调用会报错")
if __name__ == '__main__':
"""
pytest.main(['test_suit.py::test_case_name']);#精确选择
pytest.main(['./']) #运行./目录下所有(test_*.py和*_test.py);
pytest.main(['./testOne']) #运行./testOne目录下用例;
pytest.main(['./testOne/test_one.py']) #运行指定模块;
pytest.main(['-k','order','./testOne/test_one.py::TestOne']) #匹配TestOne类中包含order的用例
"""
# 运行整个文件
# pytest.main(["test_case.py"])
# 运行某个类中某个方法:pytest路径/文件名::类名::方法名例如
# pytest.main(["test_case.py::TestCase::test_02"])
"""pytest参数
-q简化控制台的输出
-v 输出用例更加详细的执行信息,比如用例所在文件和用例名称
-k 执行用例中包含‘关键字’的用例
-s 输出用例中的调试信息,比如 print 打印信息,如果不加参数则不输出
-m 执行‘标记’的内容,执行特定的测试用例,执行有相同标记的测试用例,添加标记
-x 执行失败则停止执行,后面的用例不会被执行
--junit-xml:设置junit xml测试报告
--maxfail=n 执行失败 n 次之后停止执行,n 是执行失败的次数
--lf (last failed)重新运行上次失败的用例,若没有失败的会全部跑
--ff (failed first)重新运行所有用例,但首先运行上次失败的用例
"""
# pytest.main(["-s", "-v", "-k", "02", "test_case.py"])
# pytest.main(["-x", "test_case.py"])
# pytest.main(["-k", "0","-m","run_these", "test_case.py"])
# -m支持 and、not、or 判断
# pytest.main(["-m", "run_these and other", "test_case.py"])
# pytest.main(["--junit-xml=./junit_report.xml", "test_case.py"])
# pytest.main(["--maxfail=2", "test_case.py"])
# pytest.main(["--lf", "test_case.py"])
# pytest.main(["--ff", "test_case.py"])
# 生成报告
# pytest.main(["-s", "-v", "--html=./test.html", "test_case.py"])
# 输出覆盖率报告
# pytest.main(["-v", "--cov=./", "--cov-report=html", "test_case.py"])
pytest.main(["-s", "-v", "test_case.py"])
pass
pytest.ini
[pytest]
addopts = -s -v --html=./report/report.html
testpaths = pytesttest
python_files = test_*.py
python_classes = Test*
python_functions = test*