首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

软件测试笔记|接口自动化测试|pytest的前后置、固件、夹具

“动动小手,点点关注呗~”

在接口自动化测试领域,pytest 是一款备受青睐的测试框架,其强大的功能和灵活性为测试工作带来了诸多便利。

其中,前后置操作、固件(Fixture,也常被称为夹具)的概念和使用方法,是 pytest 框架的重要特性,能够极大地提高测试用例的编写效率和可维护性。

本文将深入探讨 pytest 在接口自动化测试中的前后置、固件相关知识,并通过丰富的代码示例展示其使用场景。

一、pytest 中的前后置操作

在接口自动化测试中,很多时候在执行测试用例之前需要进行一些准备工作,比如初始化测试数据、建立数据库连接、创建 HTTP 会话等;在测试用例执行完毕后,可能需要进行清理工作,如删除临时数据、关闭数据库连接、关闭 HTTP 会话等。这些在测试用例执行前后执行的操作,就被称为前后置操作。

(一)函数级别的前后置

在 pytest 中,可以使用setup_function和teardown_function函数来实现函数级别的前后置操作。

每个测试函数执行前,setup_function会被调用;每个测试函数执行后,teardown_function会被调用。

import requestsdef setup_function():   print("每个测试函数执行前执行,比如创建HTTP会话")def teardown_function():   print("每个测试函数执行后执行,比如关闭HTTP会话")def test_get_user_info():   url = "http://example.com/api/user"   response = requests.get(url)   assert response.status_code == 200

(二)类级别的前后置

如果测试用例是以类的形式组织的,那么可以使用setup_class和teardown_class方法来实现类级别的前后置操作。

在类中的所有测试方法执行前,setup_class会被调用一次;在类中的所有测试方法执行完毕后,teardown_class会被调用一次。

以下是代码展示

———————————————————

import requests

class TestUser:

      def setup_class(self):

      print("类中所有测试方法执行前执行,比如创建数据库连接")

      def teardown_class(self):

      print("类中所有测试方法执行完毕后执行,比如关闭数据库连接")

      def test_get_user(self):

      url = "http://example.com/api/user"

      response = requests.get(url)

      assert response.status_code == 200

      def test_create_user(self):

      url = "http://example.com/api/user"

      data = {"name": "test"}

      response = requests.post(url, json=data)

      assert response.status_code == 201

———————————————————

二、pytest 中的固件(夹具)

固件(Fixture)是 pytest 中一个非常强大且灵活的功能,它可以用来设置测试的前置条件和后置条件,并且可以在多个测试用例之间共享。

固件本质上是一个函数,它可以返回任何需要的对象,如测试数据、数据库连接、HTTP 会话等。

(一)简单的固件示例

下面是一个简单的固件示例,它返回一个 HTTP 会话对象,供测试用例使用。

import requestsimport pytest@pytest.fixturedef api_session():   session = requests.Session()   yield session   session.close()def test_get_user_with_session(api_session):   url = "http://example.com/api/user"   response = api_session.get(url)   assert response.status_code == 200

在上述代码中,api_session是一个固件函数,它创建了一个requests.Session对象,并通过yield语句将其返回。在测试用例test_get_user_with_session中,将api_session作为参数传入,就可以使用这个共享的 HTTP 会话对象进行接口请求。当测试用例执行完毕后,yield语句之后的代码会被执行,关闭这个 HTTP 会话。

(二)固件的作用域

固件的作用域可以通过scope参数来指定,有function(默认)、class、module和session四种作用域。

function:每个测试函数都会调用一次固件。

class:每个测试类中的所有测试方法只会调用一次固件。

module:每个测试模块只会调用一次固件。

session:整个测试会话只会调用一次固件。

下面是一个作用域为module的固件示例:

import requestsimport pytest@pytest.fixture(scope='module')def module_level_session():   session = requests.Session()   yield session   session.close()def test_get_user_1(module_level_session):   url = "http://example.com/api/user/1"   response = module_level_session.get(url)   assert response.status_code == 200def test_get_user_2(module_level_session):   url = "http://example.com/api/user/2"   response = module_level_session.get(url)   assert response.status_code == 200

在这个示例中,module_level_session固件的作用域是module,这意味着在同一个测试模块中的所有测试函数都会共享这个 HTTP 会话对象,而不会为每个测试函数都创建一个新的会话。

(三)固件的依赖

固件之间可以存在依赖关系,一个固件可以依赖另一个固件。例如,我们有一个需要登录的接口,登录成功后会返回一个令牌(token),后续的接口请求需要携带这个令牌。我们可以定义两个固件,一个用于登录获取令牌,另一个用于使用这个令牌进行接口请求。在这个例子中,api_request_with_token固件依赖于login固件。login固件负责登录并获取令牌,api_request_with_token固件使用这个令牌来构造带有身份验证的 HTTP 请求。

三、总结

pytest 的前后置操作和固件(夹具)功能为接口自动化测试提供了强大的支持,使得测试用例的编写更加简洁、高效和可维护。

通过合理地使用这些功能,我们可以在不同的测试场景下,灵活地设置测试的前置条件和后置条件,实现测试数据的共享和复用,从而提高测试的质量和效率。

无论是简单的接口测试,还是复杂的多步骤接口交互测试,pytest 都能帮助我们轻松应对。

希望本文的内容能帮助你更好地理解和运用 pytest 进行接口自动化测试。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O8OdD5iu0BszBy_sT_PazLWg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券