pytest常用代码示例详细

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*

你可能感兴趣的:(python代码,pytest,python,开发语言)