基于关键字驱动设计实现接口自动化测试框架!

引言

在当今软件开发过程中,接口自动化测试已成为保障软件质量的关键环节。关键字驱动设计提供了一种高效、灵活的解决方案,通过定义和封装关键字,可以实现对复杂接口的高效测试。本文将介绍如何基于关键字驱动设计和实现接口的自动化测试框架,涵盖多环境切换、多协议支持、请求方法封装、断言封装、性能优化与扩展以及日志记录与分析等方面。

关键字驱动设计

关键字驱动设计是一种测试自动化的方法,它通过定义和使用关键字来描述测试用例,使得测试用例更加简洁、易读和易维护。以下是一个简单的关键字驱动设计示例,展示了如何定义和使用关键字来实现接口自动化测试。

示例代码

首先,定义一些基本的关键字:

# keywords.py
import requests
from hamcrest import assert_that, equal_to

BASE_URL = "https://dev.example.com/api"

def send_get_request(endpoint, params=None):
    url = f"{BASE_URL}/{endpoint}"
    response = requests.get(url, params=params)
    return response

def send_post_request(endpoint, data=None):
    url = f"{BASE_URL}/{endpoint}"
    response = requests.post(url, json=data)
    return response

def assert_status_code(response, expected_status_code):
    assert_that(response.status_code, equal_to(expected_status_code))

def assert_response_contains(response, key, expected_value):
    assert_that(response.json().get(key), equal_to(expected_value))

然后,在测试用例中使用这些关键字:

# test_cases.py
import pytest
from keywords import send_get_request, assert_status_code, assert_response_contains

def test_get_user_info():
    response = send_get_request("user/1")
    assert_status_code(response, 200)
    assert_response_contains(response, "name", "John Doe")
多环境切换

在实际测试过程中,我们通常需要在多个环境中执行测试。通过使用配置文件,可以方便地实现多环境切换。以下示例展示了如何通过配置文件实现多环境切换:

配置文件(config.yaml)
environments:
  dev:
    base_url: "https://dev.example.com/api"
  staging:
    base_url: "https://staging.example.com/api"
  prod:
    base_url: "https://prod.example.com/api"
示例代码

在关键字中读取配置文件中的环境配置:

# config.py
import yaml

def load_config(env):
    with open("config.yaml", "r") as file:
        config = yaml.safe_load(file)
    return config["environments"][env]

# keywords.py
import requests
from config import load_config
from hamcrest import assert_that, equal_to

ENV = "dev"
CONFIG = load_config(ENV)
BASE_URL = CONFIG["base_url"]

def send_get_request(endpoint, params=None):
    url = f"{BASE_URL}/{endpoint}"
    response = requests.get(url, params=params)
    return response

def send_post_request(endpoint, data=None):
    url = f"{BASE_URL}/{endpoint}"
    response = requests.post(url, json=data)
    return response

def assert_status_code(response, expected_status_code):
    assert_that(response.status_code, equal_to(expected_status_code))

def assert_response_contains(response, key, expected_value):
    assert_that(response.json().get(key), equal_to(expected_value))
多协议支持

为了支持多种协议的接口测试,我们可以在关键字中封装不同协议的请求方法。以下示例展示了如何支持 HTTP 和 WebSocket 协议的接口测试:

示例代码

封装不同协议的请求方法:

# keywords.py
import requests
import websocket
from config import load_config
from hamcrest import assert_that, equal_to

ENV = "dev"
CONFIG = load_config(ENV)
BASE_URL = CONFIG["base_url"]

def send_get_request(endpoint, params=None):
    url = f"{BASE_URL}/{endpoint}"
    response = requests.get(url, params=params)
    return response

def send_post_request(endpoint, data=None):
    url = f"{BASE_URL}/{endpoint}"
    response = requests.post(url, json=data)
    return response

def send_ws_message(endpoint, message):
    url = f"ws://{BASE_URL}/{endpoint}"
    ws = websocket.create_connection(url)
    ws.send(message)
    response = ws.recv()
    ws.close()
    return response

def assert_status_code(response, expected_status_code):
    assert_that(response.status_code, equal_to(expected_status_code))

def assert_response_contains(response, key, expected_value):
    assert_that(response.json().get(key), equal_to(expected_value))
请求方法封装

为了提高测试用例的可读性和可维护性,我们可以将常用的请求方法进行封装。以下示例展示了如何封装 GET 和 POST 请求方法:

示例代码

封装 GET 和 POST 请求方法:

# keywords.py
import requests
from config import load_config
from hamcrest import assert_that, equal_to

ENV = "dev"
CONFIG = load_config(ENV)
BASE_URL = CONFIG["base_url"]

def send_get_request(endpoint, params=None):
    url = f"{BASE_URL}/{endpoint}"
    response = requests.get(url, params=params)
    return response

def send_post_request(endpoint, data=None):
    url = f"{BASE_URL}/{endpoint}"
    response = requests.post(url, json=data)
    return response

def assert_status_code(response, expected_status_code):
    assert_that(response.status_code, equal_to(expected_status_code))

def assert_response_contains(response, key, expected_value):
    assert_that(response.json().get(key), equal_to(expected_value))

在测试用例中调用封装的请求方法:

# test_cases.py
import pytest
from keywords import send_get_request, assert_status_code, assert_response_contains

def test_get_user_info():
    response = send_get_request("user/1")
    assert_status_code(response, 200)
    assert_response_contains(response, "name", "John Doe")
断言封装

为了提高断言的可读性和可维护性,我们可以将常用的断言方法进行封装。以下示例展示了如何封装状态码断言和响应内容断言:

示例代码

封装状态码断言和响应内容断言:

# keywords.py
import requests
from config import load_config
from hamcrest import assert_that, equal_to

ENV = "dev"
CONFIG = load_config(ENV)
BASE_URL = CONFIG["base_url"]

def send_get_request(endpoint, params=None):
    url = f"{BASE_URL}/{endpoint}"
    response = requests.get(url, params=params)
    return response

def send_post_request(endpoint, data=None):
    url = f"{BASE_URL}/{endpoint}"
    response = requests.post(url, json=data)
    return response

def assert_status_code(response, expected_status_code):
    assert_that(response.status_code, equal_to(expected_status_code))

def assert_response_contains(response, key, expected_value):
    assert_that(response.json().get(key), equal_to(expected_value))

在测试用例中调用封装的断言方法:

# test_cases.py
import pytest
from keywords import send_get_request, assert_status_code, assert_response_contains

def test_get_user_info():
    response = send_get_request("user/1")
    assert_status_code(response, 200)
    assert_response_contains(response, "name", "John Doe")
性能优化与扩展

为了提升测试框架的性能和扩展性,我们可以对代码进行优化和扩展。以下示例展示了如何进行性能优化和扩展:

示例代码

对请求方法进行优化:

# optimized_keywords.py
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
from config import load_config
from hamcrest import assert_that, equal_to

ENV = "dev"
CONFIG = load_config(ENV)
BASE_URL = CONFIG["base_url"]

session = requests.Session()
retry = Retry(total=3, backoff_factor=0.1)
adapter = HTTPAdapter(max_retries=retry)
session.mount("http://", adapter)
session.mount("https://", adapter)

def send_get_request(endpoint, params=None):
    url = f"{BASE_URL}/{endpoint}"
    response = session.get(url, params=params)
    return response

def send_post_request(endpoint, data=None):
    url = f"{BASE_URL}/{endpoint}"
    response = session.post(url, json=data)
    return response

def assert_status_code(response, expected_status_code):
    assert_that(response.status_code, equal_to(expected_status_code))

def assert_response_contains(response, key, expected_value):
    assert_that(response.json().get(key), equal_to(expected_value))

在测试用例中调用优化后的请求方法:

# test_cases.py
import pytest
from optimized_keywords import send_get_request, assert_status_code, assert_response_contains

def test_get_user_info():
    response = send_get_request("user/1")
    assert_status_code(response, 200)
    assert_response_contains(response, "name", "John Doe")
日志记录与分析(使用 Loguru 模块)

Loguru 是一个功能强大的日志记录库,它提供了简单易用的 API 和丰富的功能,使得日志记录变得

更加方便和高效。以下示例展示了如何使用 Loguru 记录和分析日志:

示例代码

配置 Loguru 并记录日志:

# log_config.py
from loguru import logger

logger.add("file_{time}.log", rotation="500 MB")

def log_request(request):
    logger.info(f"Request: {request.method} {request.url}")
    logger.info(f"Headers: {request.headers}")
    logger.info(f"Body: {request.body}")

def log_response(response):
    logger.info(f"Response: {response.status_code}")
    logger.info(f"Headers: {response.headers}")
    logger.info(f"Body: {response.text}")

在关键字中调用日志记录方法:

# keywords.py
import requests
from loguru import logger
from log_config import log_request, log_response
from config import load_config
from hamcrest import assert_that, equal_to

ENV = "dev"
CONFIG = load_config(ENV)
BASE_URL = CONFIG["base_url"]

session = requests.Session()

def send_get_request(endpoint, params=None):
    url = f"{BASE_URL}/{endpoint}"
    response = session.get(url, params=params)
    log_request(response.request)
    log_response(response)
    return response

def send_post_request(endpoint, data=None):
    url = f"{BASE_URL}/{endpoint}"
    response = session.post(url, json=data)
    log_request(response.request)
    log_response(response)
    return response

def assert_status_code(response, expected_status_code):
    assert_that(response.status_code, equal_to(expected_status_code))

def assert_response_contains(response, key, expected_value):
    assert_that(response.json().get(key), equal_to(expected_value))

在测试用例中调用包含日志记录的关键字:

# test_cases.py
import pytest
from keywords import send_get_request, assert_status_code, assert_response_contains

def test_get_user_info():
    response = send_get_request("user/1")
    assert_status_code(response, 200)
    assert_response_contains(response, "name", "John Doe")
结果报告模块优化(使用 Allure 报告框架)

Allure 是一个灵活的轻量级多语言测试报告工具,它不仅可以生成详细的测试报告,还可以集成多种测试框架。以下示例展示了如何使用 Allure 报告框架生成测试报告:

示例代码

安装 Allure 和 pytest-allure-adaptor 插件:

pip install allure-pytest

在测试用例中使用 Allure 标记:

# test_cases.py
import pytest
import allure
from keywords import send_get_request, assert_status_code, assert_response_contains

@allure.feature("User Info")
@allure.story("Get User Info")
@allure.severity(allure.severity_level.CRITICAL)
def test_get_user_info():
    response = send_get_request("user/1")
    with allure.step("Verify status code"):
        assert_status_code(response, 200)
    with allure.step("Verify response contains name"):
        assert_response_contains(response, "name", "John Doe")

生成 Allure 报告:

pytest --alluredir=allure-results
allure serve allure-results

结尾

本文详细介绍了基于关键字驱动设计和实现接口的自动化测试框架的方法,涵盖多环境切换、多协议支持、请求方法封装、断言封装、性能优化与扩展以及日志记录与分析等方面。通过这些技术和方法,可以有效提升接口自动化测试的效率和质量,为软件开发过程中的质量保障提供坚实的基础。希望本文能为读者在实际工作中提供有价值的参考和帮助。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

第三代通信技术(3G)的应用已在全球范围内逐步展开,各大设备供应商正积极研发能提供更高性能的新一代网管系统来满足市场需求。网管系统是一个庞大复杂的通信管理系统,由于客户的功能需求以及网管系统自身技术的更新等原因使网管系统的版本不断更新,网管系统最终系统测试的工作量会很大。因此需要引入自动化测试来提高测试效率保证测试质量。 本文首先分析了当前网管系统测试现状以及对自动化测试的需求。在这样的前提条件下,论文采用了关键字驱动脚本技术,同时吸取了当前流行的自动化测试框架中一些先进的思想,提出了一个适合网管系统测试的自动化测试框架。然后论文对该框架的测试流程进行详细的描述,在此框架的基础上进行系统的总体设计,并完成系统主要模块的设计实现。本文最终实现了一个基于关键字驱动自动化测试平台APK(Automated test Platform based on Keywords)。 在APK的实现过程中采用基于C/S的网络框架,该网络框架可以实现多用户定制测试任务并完成分布式自动化测试。在APK系统框架中对关键字进行了重新的定义,关键字不再是目前流行的框架中所定义的原子动作,而是一个用于实现一项测试规程的原子动作序列,同时该框架将结果验证环节放到关键字内部去实现。接口设计方面APK提供了一个外部接口用来整合网管系统中现有的业务测试工具,同时为了满足日后功能扩展的需要APK还预留了一个扩展接口。 APK可以应用于Java应用程序的GUI(Graphical User Interface)自动化测试,同时结合外部接口调用外部工具还可以完成较复杂的业务自动化测试。目前APK已经应用于网管系统的回归测试、边界值测试和大话务量环境数据的配置中,并已经取得了显著的效果,达到了预期的目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值