首页 > 其他分享 >软件测试/测试开发全日制|Pytest测试框架Fixture作用域详解

软件测试/测试开发全日制|Pytest测试框架Fixture作用域详解

时间:2024-01-15 11:33:44浏览次数:18  
标签:PASSED 作用域 py fixture pytest 测试用例 测试 test 软件测试

软件测试/测试开发全日制|Pytest测试框架Fixture作用域详解_Python

前言

Pytest的fixtrue是存在作用域的,比如作用域为函数级别,那么没执行一条用例,就会重新执行一次fixtrue,如果是类级别,那么多个类执行时会在去执行fixture。fixture的作用域有5个,分别是: function,class,module,package,session。有了这些作用域我们可以不用重复的去执行fixture,从而节省时间。下面我们通过代码示例分别对这五种作用域来实验。

function作用域

function: 默认范围,fixture在测试结束时被销毁,示例代码如下:

import pytest


@pytest.fixture(scope="function")
def login():
    print("正在登录")


class TestDemo:
    def test_demo1(self, login):
        print("测试用例1")

    def test_demo2(self, login):
        print("测试用例2")

------------
运行结果如下:
============================= test session starts =============================
collecting ... collected 2 items

test_a.py::TestDemo::test_demo1 正在登录
PASSED                                   [ 50%]测试用例1

test_a.py::TestDemo::test_demo2 正在登录
PASSED                                   [100%]测试用例2


============================== 2 passed in 0.03s ==============================

我们可以看到正在登录执行了两次,也就是说我们的函数级别的fixture在每个用例执行前都会执行内部代码。

class作用域

class: fixture在类中的最后一个测试执行结束后销毁,示例代码如下:

import pytest


@pytest.fixture(scope="class")
def login():
    print("正在登录")


class TestDemo:
    def test_demo1(self, login):
        print("测试用例1")

    def test_demo2(self, login):
        print("测试用例2")

-------------------
运行结果如下:
============================= test session starts =============================
collecting ... collected 2 items

test_a.py::TestDemo::test_demo1 正在登陆
PASSED                                   [ 50%]测试用例1

test_a.py::TestDemo::test_demo2 PASSED                                   [100%]测试用例2


============================== 2 passed in 0.03s ==============================

我们可以看到与上面的方法级别相比,类级别只执行了一次正在登录

module作用域

module: fixture在模块中的最后一个测试执行结束后销毁,示例代码如下:

import pytest


@pytest.fixture(scope="module")
def login():
    print("正在登录")


class TestDemo:
    def test_demo1(self, login):
        print("测试用例1")

    def test_demo2(self, login):
        print("测试用例2")

def test_demo3(login):
    print("测试用例3")


def test_demo4(login):
    print("测试用例4")


--------------------
============================= test session starts =============================
collecting ... collected 4 items

test_a.py::TestDemo::test_demo1 正在登录
PASSED                                   [ 25%]测试用例1

test_a.py::TestDemo::test_demo2 PASSED                                   [ 50%]测试用例2

test_a.py::test_demo3 PASSED                                             [ 75%]测试用例3

test_a.py::test_demo4 PASSED                                             [100%]测试用例4


============================== 4 passed in 0.05s ==============================

我们可以看到正在登录执行了一次,我们在这个模块中有4条用例,有类也有函数,但就只执行了一次,说明我们定义的模块作用域生效了。

package作用域

package: fixture在包中的最后一个测试执行结束后销毁,整体的目录结构如下图:

软件测试/测试开发全日制|Pytest测试框架Fixture作用域详解_作用域_02

  • 根目录:mytest
  • 二级目录: scripts
  • 三级目录:test_demo01.py
  • 三级目录: test_demo02.py
  • 二级目录: tests
  • 三级目录:test_demo01.py
  • 三级目录: test_demo02.py
  • 二级目录:conftest.py
  • 二级目录:test_demo.py

test_demo01.py内容如下:

def test_demo01(login):
    print("scripts包内的第一个测试用例")

其他的测试文件内容依次类推。

conftest.py内容如下:

import pytest

@pytest.fixture(scope="package")
# @pytest.fixture(scope="module")
def login():
    print("正在登陆")
    return "login"

执行结果如下:

======================================================================= test session starts =======================================================================
platform win32 -- Python 3.7.7, pytest-7.4.4, pluggy-1.2.0 -- C:\Users\89703\PycharmProjects\mytest\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\89703\PycharmProjects
mytest/mytest/scripts/test_demo02.py::test_demo02 scripts包内的第二个测试用例
PASSED
mytest/tests/test_demo01.py::test_demo01 tests包内的第一个测试用例
PASSED
mytest/tests/test_demo02.py::test_demo02 tests包内的第二个测试用例
PASSED

======================================================================== 5 passed in 0.04s ========================================================================

session作用域

session: fixture在整个测试周期执行结束后销毁,我们只需要修改conftest.py的内容,示例如下:

conftest.py内容:

import pytest

@pytest.fixture(scope="session")
# @pytest.fixture(scope="module")
def login():
    print("正在登陆")
    return "login"

执行结果如下:

======================================================================= test session starts =======================================================================
platform win32 -- Python 3.7.7, pytest-7.4.4, pluggy-1.2.0 -- C:\Users\89703\PycharmProjects\mytest\venv\Scripts\python.exe
cachedir: .pytest_cache
rootdir: C:\Users\89703\PycharmProjects
collected 5 items                                                                                                                                                  

mytest/test_demo.py::test_demo 正在登陆
包外的测试用例
PASSED
mytest/mytest/scripts/test_demo01.py::test_demo01 scripts包内的第一个测试用例
PASSED
mytest/mytest/scripts/test_demo02.py::test_demo02 scripts包内的第二个测试用例
PASSED
mytest/tests/test_demo01.py::test_demo01 tests包内的第一个测试用例
PASSED
mytest/tests/test_demo02.py::test_demo02 tests包内的第二个测试用例
PASSED

======================================================================== 5 passed in 0.03s ========================================================================

总结

fixtrue作用范围:

  • function: 默认范围,fixture在测试结束时被销毁
  • class: fixture在类中的最后一个测试执行结束后销毁
  • module: fixture在模块中的最后一个测试执行结束后销毁
  • package: fixture在包中的最后一个测试执行结束后销毁
  • session: fixture在整个测试周期执行结束后销毁

希望本文能够帮到大家!


标签:PASSED,作用域,py,fixture,pytest,测试用例,测试,test,软件测试
From: https://blog.51cto.com/u_15649298/9251289

相关文章

  • 软件测试/测试开发/全日制|Pytest如何使用autouse实现自动传参
    Pytestfixture之autouse使用写自动化用例会写一些前置的fixture操作,用例需要用到就直接传该函数的参数名称就行了。当用例很多的时候,每次都传这个参数,会比较麻烦。fixture里面有个参数autouse,默认是Fasle没开启的,可以设置为True开启自动使用fixture功能,这样用例就不用每次都去传参......
  • 软件测试/测试开发全日制|Pytest中yield的用法详解
    前言在之前的介绍中,我们已经介绍了fixture的简单用法,但其实fixture还提供了两种非常优雅高效的写法,来完成测试执行前的处理操作与执行后的处理操作,即使用yield或addfinalizer来实现。本文我们将介绍使用yield来实现操作。yield在fixture中的关键字yield主要有两个作用:yield代替retu......
  • web自动化测试进阶篇02 ——— BDD与TDD的研究实践
      ......
  • Flink 为什么跑官方例子得勾选 include dependencies with"Provided" provided适合在
    Flink为什么跑官方例子得勾选includedependencieswith"Provided"provided适合在编译和测试的环境,和compile类似,但是provide仅仅需要在编译和测试阶段,这是因为provide将不会被打包到lib目录下。大意就是说只要是打上了这个标签就不会被打包到jar文件,所以我们在本地进行编译和......
  • 测试工程师必知的10大测试法则
    作为开发人员,我们应该遵守这样一句话:“质量不是来自检查,而是来自生产过程的改进。”——爱德华·戴明太多的组织将任何未编码的东西视为一次性的。很明显,测试是必不可少的,但我们一次又一次地发现,团队将测试自动化和相关材料视为二等公民。测试是用户行为的文档,与产品组织产生的需求......
  • android系统的常用测试工具
    常用的Android测试工具有:1.AndroidStudio:Android开发集成环境,提供了丰富的测试工具和调试功能,包括模拟器、调试器、性能分析器等。2.Espresso:Android官方推荐的UI自动化测试框架,可以方便地编写和执行UI测试用例。3.UIAutomator:Android官方提供的UI自动化测试框架,可以用于跨应......
  • 测试工程师必知的10大测试法则
    作为开发人员,我们应该遵守这样一句话:“质量不是来自检查,而是来自生产过程的改进。”——爱德华·戴明太多的组织将任何未编码的东西视为一次性的。很明显,测试是必不可少的,但我们一次又一次地发现,团队将测试自动化和相关材料视为二等公民。测试是用户行为的文档,与产品组织产生的......
  • 1.7 - 命名空间与作用域
    1.7.1命名空间命名空间(NameSpace)是一个从名称到对象的映射。大部分命名空间由字典实现,内置命名空间由 builtins模块实现。命名空间之间是独立的,避免了命名冲突。 1.7.2命名空间的分类1)内置命名空间包含所有Python内置对象的名称,在 解释器启动时 创......
  • 第六天:shell算术、逻辑运算及测试命令
    一、算术运算  SHELL允许在某些情况下对算术表达式进行求值;  bash 只支持整数,不支持小数1、实现算术运算 2、内建的随机数生成器变量$RANDOM  取值范围:0-327673、增强型赋值:letvarOPERvalue 二、逻辑运算 与:&或:|非:!......
  • 4.【初中信息奥赛模拟测试】
    \(\Huge{打了一场模拟赛,又垫底了。qwq}\)初中信息奥赛模拟测试T1ZEW玩扫雷\(100pts\)定义\(\largeans_i{_,}{_j}\)为如果\((i,j)\)这个地块不是雷,旁边有多少个雷,枚举每一个点周围八个地块,如果是空地则不变,如果是雷就加一。时间复杂度为\(O(n*m)\)include<bits/st......