关于pytest不再支持setup和teardown写法的讲解

关于pytest前后置关键字不再支持setup,teardown,而是变为setup_method和teardown_method的讲解

版本更迭,规则变动

在pytest早期的版本里是支持直接使用setupteardown来完成对于测试用例的前后置处理的,这是因为当时基于人们对于unittest的使用习惯,所以pytest支持了这样的写法。

但是长期维护这个写法,效率太低,所以在数次版本更新后,pytest就不再支持单纯的setupteardown的写法。

而是提供了一套更为完备的前后置关键词:

模块级别(setup_module/teardown_module)、
函数级别(setup_function/teardown_function)、
类级别(setup_class/ teardown_class)、
方法级别(setup_method/teardown_methond或者setup/teardown)

装饰器的使用

pytest除了使用setup_xxx来完成前后置操作,还可以使用装饰器fixture:@pytest.fixture(scope="class")来配置前后置动作函数,然后在测试方法中使用。

@pytest.fixture(scope="class")
def pre_do_someting():
    进行功能方法的初始化操作或创建driver实例对象
    yield driver  #关键字yield在返回变量回调用fixture装饰器的方法后,并不会结束当前装饰器,而是会在所以使用这个装饰器的方法结束后,继续往下执行
    
    print('装饰器至此,执行结束')
    driver.quit()#执行一些资源回收操作
   
#调用装饰器
def test_case(pre_do_someting):
    driver = pre_do_someting
    driver.get('xxxx')

1 个赞

请教下,能评价下这两种fixture用法的区别吗?谢谢!
1)课件里的写法


2) 上面的实现方式
- yield driver 与yield的区别?
- driver.quit() 不写会不会自动回收?
- 装饰器不是在testcase里作为入参就能被调用到了么,为什么还要在case里面去执行"driver = pre_do_something" 和 “driver.get(“xxxx”)”

首先,yield是一个类似于return的东西,只是它比较特别,返回数据后,代码还未结束,会进入等待阶段,等待所有调用这个装饰器的函数结束后,才重新激活,开始走下面的流程。即yield driver 和yield的区别是一个返回了值,一个不返回值而已

此外,装饰器返回了driver,在case里,首先你要用个变量去接收这个返回值,也就是driver。这个装饰器的层级是class,即在层级范围内共用一个装饰器结果(即装饰器只在第一次被调用时执行,生成一份结果,然后后面调用这个装饰器的函数直接获取这份原初结果)。你要明白,这个装饰器的作用主要是生成一个大家共用的driver并且返回,你case里面如果不想用变量接收这个返回值,也可以直接用pre_do_somting.get(‘’)只是不规范而已

1 个赞