首页 > 其他分享 >pytest学习和使用8-fixture如何实现teardown功能?(yield的使用)

pytest学习和使用8-fixture如何实现teardown功能?(yield的使用)

时间:2023-02-07 11:31:28浏览次数:39  
标签:teardown fixture yield print pytest test

(8-fixture如何实现teardown功能?(yield的使用))

1引入

  • 之前学习fixture的时候,其实这个功能就类似用例的前置,给用例执行前设置一些条件;
  • fixture也就相当于setup的功能;
  • 那有没有teardown的功能呢?
  • 有,fixture里面的teardownyield来唤醒teardown的执行。

2 yield说明

  • yield是一个关键字
  • yieldfixture中起到了唤起teardown的作用,同时也可以和return一样返回值
  • yieldreturn的区别是:return执行完成,该函数终止yield在返回结束后,后续的代码仍可执行
  • 如果yield前面的代码,即setup部分已经抛出异常了,则不会执行yield后面的teardown内容;
  • 如果测试用例抛出异常yield面的teardown内容还是会正常执行

3 yield的使用

3.1 实现teardown

# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17 
# 文件名称:test_myiled.py
# 作用:yiled实现teardown功能
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import pytest

@pytest.fixture(scope="module")
def start():
    print("打开浏览器,输入账号和密码")
    yield
    print("关闭浏览器")

def test_o(start):
    print("执行用例11111")

def test_t(start):
    print("执行用例22222")


if __name__ == '__main__':
    pytest.main(["-s", "test_myiled.py"])

test_myiled.py::test_o                     打开浏览器,输入账号和密码
PASSED                                     [ 50%]执行用例11111

test_myiled.py::test_t PASSED              [100%]执行用例22222
										   关闭浏览器


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

3.2 yield返回值

# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17 
# 文件名称:test_yield_return.py
# 作用:yield返回值
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import pytest

@pytest.fixture(scope="session")
def start():
    print("打开浏览器")
    num = "测试yield返回值"
    yield num
    print("关闭浏览器")

@pytest.fixture()
def login(start):
    print("输入网址,用户名和密码")
    name = "NoamaNelson"
    password = "123456"
    yield name, password
    print("登陆成功")

def test_case(login):
    print("开始执行用例")
    name1, password1 = login
    print(name1, password1)
    assert "NoamaNelson" in name1
    assert "123456" in password1


if __name__ == '__main__':
    pytest.main(["-s", "test_yield_return.py"])

test_yield_return.py::test_case        打开浏览器
                                	   输入网址,用户名和密码
PASSED                                 [100%]开始执行用例
                                       NoamaNelson 123456
                                       登陆成功
                                       关闭浏览器


============================== 1 passed in 0.02s ==============================

4 yield+with

# 官网例子
@pytest.fixture(scope="module")
def smtp():
    with smtplib.SMTP("smtp.gmail.com") as smtp:
        yield smtp # provide the fixture value
  • 当函数执行遇到yield的时候,函数会停止执行,并返回yield 后值。

5 addfinalizer 终结函数

  • 在pytest中想要做teardown的处理,除了使用带有yieldfixture函数,还可以直接添加终结器;
  • request.addfinalizer把函数变成终结器;
  • 如果 request.addfinalizer() 前面的代码,即setup部分已经抛出异常了,则不会执行 request.addfinalizer()teardown内容;
# -*- coding:utf-8 -*-
# 作者:NoamaNelson
# 日期:2022/11/17 
# 文件名称:test_addfinalizer.py
# 作用:request.addfinalize的使用
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelson

import pytest

@pytest.fixture(scope="module")
def test_addfinalizer(request):
    # 前置操作setup
    print("打开浏览器")
    test = "test_addfinalizer"

    def tear():
        # 后置操作teardown
        print("关闭浏览器")

    request.addfinalizer(tear)
    # 返回前置操作的变量
    return test

def test_case(test_addfinalizer):
    print("测试用例")

if __name__ == "__main__":
    pytest.main(["-s", "test_addfinalizer.py"])
test_addfinalizer.py::test_anthor      打开浏览器
PASSED                                 [100%]测试用例
                                       关闭浏览器


============================== 1 passed in 0.02s ==============================

标签:teardown,fixture,yield,print,pytest,test
From: https://blog.51cto.com/NoamaNelson/6041225

相关文章

  • pytest学习和使用6-fixture如何使用?
    (6-fixture如何使用?)1引入和setup、teardown的区别是:fixture可自定义测试用例的前置条件;setup、teardown针对整个脚本全局生效,可实现在执行用例前后加入一些操作;setup......
  • python-conftest、fixture、matefunc介绍
    pytest的规则使用"""使用pytest编写用例,必须遵守以下规则:(1)测试文件名必须以“test_”开头或者"_test"结尾(如:test_ab.py)(2)测试类命名以"Test"开头。(3......
  • 单元测试|Unittest setup前置初始化和teardown后置操作
    Unittestsetup前置初始化和teardown后置操作针对类中每个函数执行时进行前置后置的操作setUp(self):测试前的初始化操作tearDown(self):测试后的操作代码示例:importunittest......
  • yield流式处理
    yield流式处理1、每到一次return都会出来打印一次,源代码也是根据return个数分成若干状态机,适用于把大数据切割成小数据依次返回staticasyncTaskMain(string[]......
  • fixture
    fixture用途1.用例编写前的初始化设置,连接数据库等2.测试用例的前置条件可以使用fixture实现3.实现unittest不能实现的功能,注入测试用例之间的参数传递fix......
  • sleep(), wait(), join(), yield()的区别
    锁池所有需要竞争同步锁的线程都会放在锁池当中,比如某个对象的同步锁被其中一个线程得到,则其它线程需要在锁池中等待,当前面的线程释放掉同步锁后锁池中的线程去竞争同步......
  • java多线程基础小白指南--关键字识别(start,run,sleep,wait,join,yield)
    在学习java多线程基础上,会遇到几个关键字,理解并识别它们是掌握多线程的必备知识,下面,我将通过源码或者程序演示给出我对这几个关键字的理解,如果有不同意见,欢迎在评论区或者......
  • 生成器与yield
    目录生成器与yieldyield表达式应用三元表达式、列表生成式、生成器表达式三元表达式列表生成式生成器表达式生成器与yield若函数体包含yield关键字,再调用函数,并不......
  • (转载)Python中关键词yield怎么用?
    原文:https://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do译文:https://zhuanlan.zhihu.com/p/23276711?refer=passer问题描述:Python中关......
  • 5. Pytest自定义前置后置:fixture参数详解(了解)
    一、前言我们上节课讲到fixture自定义前置函数的时候,有5个非必填参数,scope,params,autouse,ids,name。一般情况下这五个参数我们在工作中都不常用,但是个别情况会用到,这节......