相关文章

Pytest框架之fixture详解(一)

Pytest框架之fixture详解(二)

Pytest框架之fixture详解(三)

我们在编写测试用例,都会涉及到用例执行之前的环境准备工作,和用例执行之后的环境清理工作。

代码版的测试用例也不例外。在自动化测试框架当中,我们也需要编写:

用例执行之前的环境准备工作代码(前置工作代码)

用例执行之后的环境清理工作(后置工作代码)

通常,在自动化测试框架当中,都叫做fixture。

pytest作为python语言的测试框架,它的fixture有2种实现方式。

  • 一种是xunit-style,跟unittest框架的机制非常相似,即setup/teardown系列
  • 一种是它自己的fixture机制,以@pytest.fixture装饰器来申明。

pytest的fixture实现方式一:xunit-style

pytest的xunit-style有三个级别的fixture:测试模块、测试类、测试函数。

1、测试函数/方法级别:每一个测试函数都会执行的前置和后置。

测试类内部的测试方法:

  • 前置函数名称:setup_method
  • 后置函数名称:teardown_method

模块下的测试函数:

  • 前置函数名称:setup_function
  • 后置函数名称:teardown_function

2、测试类级别:一个测试类只执行一次前置和后置。

  • 前置函数名称:setup_class
  • 后置函数名称:teardown_class

注意:用@classmethod装饰

3、测试模块级别:一个测试模块只执行一次前置和后置。

  • 前置函数名称:setup_module
  • 后置函数名称:teardown_module
from selenium import webdriver
from time import sleep
from random import randint
​
​
def setup_module():
    print("====  模块级的 setup 操作  ====")
​
​
def teardown_module():
    print("====  模块级的 teardown 操作  ====")
​
​
def test_random():
    assert randint(1, 5) == 3
​
​
class TestWeb:
​
    @classmethod
    def setup_class(cls):
        print("====  测试类级的 setup 操作  ====")
​
    @classmethod
    def teardown_class(cls):
        print("====  测试类级的 teardown 操作  ====")
​
    def setup_method(self):
        print("====  测试用例级的 setup 操作  ====")
        self.driver = webdriver.Chrome()
​
    def teardown_method(self):
        print("====  测试用例级的 teardown 操作  ====")
        self.driver.quit()
​
    def test_search(self):
        self.driver.get("https://www.baidu.com/")
        self.driver.find_element_by_id("kw").send_keys("柠檬班")
        self.driver.find_element_by_id("su").click()
        sleep(1)

pytest也支持运行unittest的测试用例。支持unittest以下特性:

  • @unittest.skip
  • setUp/tearDown;
  • setUpClass/tearDownClass;
  • setUpModule/tearDownModule;

pytest的fixture实现方式二:fixture机制

通过@pytest.fixture装饰器来定义fixture。一个函数被@pytest.fixture装饰,那么这个函数就是fixture。

使用fixture时,分为二个部分:fixture定义、fixture调用。

除此之外,还有fixture的共享机制,嵌套调用机制。

1、定义fixture。

1)fixture通过函数实现。

2)使用@pytest.fixture进行装饰

import pytest
​
@pytest.fixture
def init():
    pass

3)前置准备工作代码和后置清理工作代码,都写在一个函数里面。

4)通过yeild关键字,区分前置代码和后置代码 。yeild之前的代码为前置代码,yeild之后的代码为后置代码

在实际应用场景当中,可以只有前置准备工作代码,也可以只有后置清理工作代码。

import pytest
​
​
@pytest.fixture
def init():
    print("用例执行之前,执行的代码")  # 前置代码
    yield
    print("用例执行之后,执行的代码")  # 后置代码
  
​
@pytest.fixture
def init2():
    print("用例执行之前,执行的代码")  # 只有用例执行之前的前置准备代码
     
​
@pytest.fixture
def init3():
    yield
    print("用例执行之后,执行的代码")  # 只有用例执行之后的后置清理代码

5)fixture有4个作用域:测试会话(session)、测试模块(module)、测试类(class)、测试用例(function)

测试会话:pytest执行测试用例的整个过程,称为会话。

比如pytest收集到了100条用例并执行完成,这个过程称为测试会话。

设置fixture的作用域:通过@pytest.fixture(scope=作用域)来设置。默认情况下,scope=function

import pytest
​
​
# 没有设置scope,默认为测试函数级别。即调用此fixture的测试类/模块/函数下,每个测试函数都会执行一次这个fixture
@pytest.fixture
def init():
    print("用例执行之前,执行的代码")  # 前置代码
    yield
    print("用例执行之后,执行的代码")  # 后置代码
​
​
# 设置scope为class。调用此fixture的测试类下,只执行一次这个fixture.
@pytest.fixture(scope="class")
def init2():
    print("用例执行之前,执行的代码")  # 只有用例执行之前的前置准备代码
​
​
# 设置scope为session。autouse表示自动使用。
# 那么在pytest收集用例后,开始执行用例之前会自动化执行这个fixture当中的前置代码,
# 当所有用例执行完成之后,自动化执行这个fixture的后置代码。
@pytest.fixture(scope="session",autouse=True)
def init3():
    yield
    print("用例执行之后,执行的代码")  # 只有用例执行之后的后置清理代

6)fixture的返回值设置:yeild 返回值

当测试用例当中,要使用fixture里生成的数据时,则需要fixture返回数据。

若有数据返回则:yeild 返回值

import pytest
from selenium import webdriver
from time import sleep
​
​
# 设置scope为class。调用此fixture的测试类下,只执行一次这个fixture.
@pytest.fixture(scope="class")
def init2():
    print("==== 测试类下,执行所有用例之前,执行的代码 ====")
    driver = webdriver.Chrome()
    yield driver   # 返回driver对象
    print("==== 测试类下,执行所有用例之后,执行的代码 ====")
    driver.quit()

2、调用fixture

在fixture定义好之后,可以明确:

  • 1)fixture处理了哪些前置准备工作、哪些后置清理工作
  • 2)fixture作用在哪个范围(是测试函数?还是测试类?还是测试会话?还是测试模块?)

在以上2点都定下来了之后,接下来就是,在测试用例当中,根据需要调用不同的fixture。

调用方法有2种:

  • 1、在测试用例/测试类上面加上:@pytest.mark.usefixture("fixture的函数名字")
  • 2、将fixture函数名,作为测试用例函数的参数。

第2种用法,主要是用参数来接收fixture的返回值,以便在测试用例中使用。

第一种方式案例如下:

第二种方式案例如下:

3、conftest.py共享机制

在某些大的业务场景下,很多用例当中,会使用相同的前置准备工作,和后置清理工作。

如果在每个测试模块下,都把前置准备工作,和后置清理工作写一遍,在维护上和优化上讲不够好。

pytest框架提供了一个fixture共享的机制 ,可以让不同的用例模块,使用同一个fixture。这就是conftest.py文件。

3.1 conftest.py共享实现

1)在项目根目录下,创建一个conftest.py文件。

2)文件名必须是conftest.py,大小写敏感,不可改名字。

3)conftest.py当中,可以编写多个fixture

4)在测试用例文件当中,不需要引入conftest.py文件。直接调用fixture的函数名,会自动去conftest.py当中查找的。

3.2 conftest.py层级作用域

conftest.py在项目根目录下,则项目下的所有测试用例,均可使用conftest.py中定义的fixture。即项目根目录下的conftest.py,作用域是整个项目。

那,如果,conftest.py当中的fixture,只想在某个python包内可用呢?

conftest.py实现了层级作用域。

简单来说就是:conftest.py 在哪个目录下,此目录下(包含子目录)的所有用例可使用其中的fixture。

如下图:

  • 根目录下的conftest.py里的fixture,无论项目下的哪个用例,都可以使用。
  • 子目录moduleA下的conftest.py里的fixture,只有moduleA下的用例可以使用。
  • 子目录moduleB下的conftest.py里的fixture,只有moduleB下的用例可以使用。

moduleB下的用例文件test_module_b.py中的用例,即可以使用根目录下的conftest.py中的fixuture,又可以使用自己目录下的conftest.py的fixture:

那么有个问题,如果出现了同名fixture怎么办呢?

这里涉及到了,测试用例在执行时,调用fixture的顺序。一般来讲,按就近原则调用。

测试用例文件中的fixture > 当前目录中的fixture > 上级目录中的fixture > 根目录中的fixture

4、fixture嵌套

fixture不但支持共享 ,还支持嵌套使用。

嵌套使用即:一个fixture,可以做另外一个fixture的参数。

如下图所示:名为init2的fixture,可以作为init的参数。

并且,init当中,将init2的返回值,同样返回。

当在用例当中,调用init时,init会自动去调用init2。

下图案例中,init2为class级作用域,init为function级作用域。

fixture的执行顺序如下:

  • init2的后置代码
  • init的后置代码
  • init的前置代码
  • init2的前置代码

到此这篇关于Pytest框架之fixture的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持Devmax。

Pytest框架之fixture详解(一)的更多相关文章

  1. xcode6.1 – Xcode 6.1中项目模板中缺少类前缀

    项目模板上曾经有一个类前缀字段,这有助于区分项目类和框架类.Xcode6.1项目模板中不再提供此功能.这背后的意图是什么?

  2. ios – 伞框架

    错误.应用程序,通常位于…错误仍然存在你也可以在这里添加(子)框架的路径.

  3. ios – UIView框架大小的问题

    我正在开发一个iPad项目,目前正在使用Landscape视图.我试着这样做:为什么这总是返回960?虽然在景观中,视图本身的高度尺寸应为768对吗?

  4. 安装自定义cocoa框架的最佳方法

    我有一个自定义框架,遵循Apple的框架编程指南>>中的建议.Installingyourframework我在/Library/Frameworks中安装.我通过使用以下脚本添加RunScript构建阶段来完成此操作:在我的项目中,我然后链接/Library/Frameworks/MyFramework并将其导入我的类中,如下所示:这非常有效,除了我总是在调试器控制台中看到以下消息:Loadin

  5. ios – 在设备上构建和运行时,仅将嵌入式框架与其他动态框架链接失败

    TL;博士将您的嵌入式框架与其他框架链接,并且不将其他框架与您的应用程序链接,导致Build&在设备上运行.描述:建立:我的设置非常简单(Swift2.3&XcodeXcode8.0;Build版本8S162m):>使用Carthage(0.17.2)我用xcodebuild8.0和TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3carthagebui

  6. iOS 8嵌入式框架中的头文件

    我正在尝试创建一个用于iOS8的嵌入式框架.在创建一个名为SampleKit(BTW;这里有任何约定,我应该使用前缀吗?)之后,它包含一个令我困惑的头文件:我知道FOUNDATION_EXPORT是extern或extern“C”的宏,但我不确定这两个常量.我应该在哪里为他们设定价值?解决方法项目>构建设置>版本控制>当前项目版本:

  7. 在Monotouch上模拟.NET的框架?

    有没有人使用过他们发现与Monotouch兼容的.NET模拟框架?在尝试使用之前,我很好奇与NMock,NSubstitute,Moq和其他框架的兼容性.Xamarin刚刚加强了它的单元测试支持,但没有提到模拟框架.仅供参考,我希望在VS2010上为非UI位做很多开发,并在UI进入时移动到iOS平台.谢谢您的帮助.解决方法我建议只使用手动模拟:如果我不得不猜测RhinoMocks,Moq等大量使用Reflection.Emit(你怎么能做他们能做的疯狂?),这将无法在MonoTouch上使用AOT编译器运

  8. 在ios上使用来自框架的boost :: filesysystem路径

    我一直在使用Boost作为PeteGoodliffe脚本构建的框架已有一段时间了.效果很好.最近我遇到了一个问题,可以通过将以下代码放入另一个全新的XCode项目中的视图控制器的viewDidLoad中来重现:当路径对象被销毁时会导致EXC_BAD_ACCESS.有没有其他人遇到这个问题?

  9. ios – 在约束依赖于框架的自定义视图中使用自动布局

    我正在编写一个以编程方式初始化的自定义视图.我重写updateConstraints以添加此视图所需的所有约束.:问题是self.bounds返回CGRectZero的等价物.我做了我的研究并根据这个objc.ioarticle,这是预期的,因为在调用layoutSubviews之前框架不会被设置.它也提到了Toforcethesystemtoupdatethelayoutofaviewtreei

  10. ios – “禁用模块时使用’@import’”错误 – 启用模块和链接框架= YES

    我有一个使用CocoaPods并使用’SCLAlertView-Objective-C’窗格的项目.该pod使用@importUIKit;模块样式导入.我在目标和项目设置中将“启用模块(C&Objective-C)”和“自动链接框架”设置为YES.当模块被禁用时,我仍然得到“使用’@import’错误.有没有什么可以阻止Xcode能够启用模块,如使用.pch文件,任何链接器标志,或者我没有提到的任

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部