如何搭建接口自动化框架(四)-fixture

2022-10-21978

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

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

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

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

一种是xunit-style,跟unittest框架的机制非常相似,即setup/teardown系列

一种是它自己的fixture机制,以@pytest.fixture装饰器来申明。

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

测试函数/方法级别:每一个测试函数都会执行的前置和后置。 测试类内部的测试方法: 前置函数名称:setup_method 后置函数名称:teardown_method 模块下的测试函数: 前置函数名称:setup_function 后置函数名称:teardown_function 测试类级别:一个测试类只执行一次前置和后置。 前置函数名称:setup_class 后置函数名称:teardown_class 注意:用@classmethod装饰 测试模块级别:一个测试模块只执行一次前置和后置。 前置函数名称: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定义好之后,可以明确:

fixture处理了哪些前置准备工作、哪些后置清理工作 fixture作用在哪个范围(是测试函数?还是测试类?还是测试会话?还是测试模块?) 在以上2点都定下来了之后,接下来就是,在测试用例当中,根据需要调用不同的fixture。我们在下一篇文章继续讲fixture的调用以及其他玩法。

分享
点赞0
打赏
上一篇:Docker常用命令笔记(一)
下一篇:NOTE|解决 docker 容器内配置错误导致容器启动失败