接口自动化框架pyface详细介绍

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

接口自动化框架pyface详细介绍
版权说明
本框架系本人结合一些实践经验和开源框架设计思想,在家基于兴趣爱好独立完成的代码开发。

源码只保存在私人电脑,办公电脑上无。github开源与公司无关,先把关系撇清,不涉及侵权。

嘘。

框架定位
首先最重要的就是学习交流,无商业用途。其次本框架有一定实用价值,可作为工作辅助工具,解决现有技术无法处理的问题。最后可以优化改造投入生产实用(若有更好的idea请务必告诉我,求知若渴)。

设计思想

技术栈
说明文字为本框架中用途。

python:脚本语言。

requests:http请求库。

allure:测试报告

numpy:数据格式兼容。

pandas:mysql返回数据处理。

PyMySQL:连接mysql。

SQLAlchemy:mysql连接引擎,支持ORM。

texttable:日志打印sql查询结果表格。

目录结构

用例组织方式
模板代码使用code_auto.py自动生成。

    self.api_dir = os.path.join(os.path.join(self.base_dir, 'api'), 'bu')  # 1
    self.case_dir = os.path.join(os.path.join(self.base_dir, 'case'), 'sprint')  # 2
    self.uri = '/api/post'  # 3
    self.description = 'Demo auto code'  # 4
    # 5
    self.body = """{}

"""
1 输入api子目录名称。接口是按业务部门来区分的,子目录名称建议按业务部门(bu==Business Unit)来设置。

2 输入测试用例子目录名称。现在流行敏捷开发,建议按迭代sprint或独立功能模块命名。

3 接口uri。需要注意的是,开头要有1个斜杠/。

4 接口描述。如名称、作用。

5 请求体。

执行后在api和case目录生成测试初始化代码。

域名、Headers/Cookie涉及到环境变量,在data/env设置。

class _GldExp:

x = 1
headers = {"Content-Type": "application/json"}
dao_x = Dao('host:port',
            'username',
            'password')

test_url = 'https://x'

class _Gld:

x = 2
headers = {"Content-Type": "application/json"}
dao_x = Dao('host:port',
            "username",
            "password")

test_url = 'https://x'

def uuid_list(n):

"""Uuid list

@param n: Number
@return: A uuid list
"""
return [str(uuid.uuid4()).replace('-', '') for i in range(n)]

Set environment name

vars_ = _GldExp
2个内部类_GldExp和_Gld,定义参数化环境变量。

在env文件中可以定义一些业务相关函数。公共函数需要放到common/func,建议不要轻易把框架无关的函数放到公共函数里面。

import env后,使用vars_引用来调用具体的环境变量,如vars_.test_url。

测试代码编写方式
api/bu目录下,每个接口==1个py文件。

class ApiPost(Api):

def __init__(self):
    super().__init__()
    self.url = vars_.test_url + "/api/post"

def load(self):
    self.body = {}

    return self

def send(self):
    self.res = self.req.post(url=self.url, headers=vars_.headers, json=self.body)
    self.set_content()
    return self.res

api继承了基类Api。根据不同环境初始化vars_.test_url,load()方法用于加载参数,send()方法用于发送请求(视不同method修改对应的请求方法&参数,如get,可以在common/request.py中找到相关定义)。

测试代码完全面向对象。

def test_default():

x = ApiPost()
x.load().send()

这样能很方便的在接口之间传递参数,以及做参数化的工作。

比如,在接口.py中,需要参数化body的name:

def load(self):
    self.body = {
        "name": self.name
    }

PyCharm会提示此属性未定义,忽略它。

在测试代码中写参数化就很简单:

x.name = 'dongfanger'
x.load().send()

JMeter参数化方式
本框架参数化借鉴了JMeter的参数化方式。也就是,在接口发请求后,对参数赋值;在接口收到相应后,提取参数。这也是测试代码要完全面向对象的原因。

面向对象能较好的组织测试代码,使代码逻辑清晰,阅读易于理解。

比如,先定义2个接口,苹果树和商店:

class AppleTree(Api):

def __init__(self):
    super().__init__()
    self.url = vars_.test_url + "/api/post/apple/tree"

def load(self):
    self.body = {}

    return self

def send(self):
    self.res = self.req.post(url=self.url, headers=vars_.headers, json=self.body)
    self.set_content()
    return self.res

class ShopSale(Api):

def __init__(self):
    super().__init__()
    self.url = vars_.test_url + "/api/post/shop/sale"

def load(self):
    self.body = {
        "apple": self.apple
    }

    return self

def send(self):
    self.res = self.req.post(url=self.url, headers=vars_.headers, json=self.body)
    self.set_content()
    return self.res

测试代码编写,苹果树先生产苹果,再运输到商店,商店卖苹果:

def test_apple_to_shop():

apple_tree = AppleTree()
apple_tree.load().send()  # 生产苹果
good_apple = apple_tree.content['good_apple']  # content在Api基类中定义
shop_sale = ShopSale()
shop_sale.apple = good_apple  # 传递参数
shop_sale.load().send()
print(shop_sale.content)

content在Api基类中定义:

def set_content(self):
    """After request, assert status and set content

    """
    status_ok(self.res)
    res_json = self.res.json()
    assert 1000 == res_json.get('status')
    try:
        self.content = res_json['content']
    except KeyError:
        logger.info(f"{'*' * 26}\n"
                    f"Response no content\n"
                    f"{'*' * 26}\n")

先断言返回状态ok,再取响应json里面key为content的value。不同公司json规范不一样,需要做调整。

批量执行用例生成测试报告
pytest_allure.py批量执行测试用例。

Input the directory to run pytest

run_dir = os.path.join(base_dir, 'case')
默认执行case目录下test_开头或结尾的文件(pytest规则)。测试方法需要以test_开头。

可以指定目录,如:

Input the directory to run pytest

run_dir = os.path.join(os.path.join(base_dir, 'case'), 'sprint0001')
本框架借助pytest_sessionfinishhook函数实现了生成测试报告并自动打开浏览器。

def pytest_sessionfinish(session):

allure_report_dir_test = session.config.getoption('allure_report_dir')
if allure_report_dir_test:
    html_dir = os.path.join(allure_report_dir_test, 'html')
    os.system(f'mkdir {html_dir}')
    os.system(f"allure generate {allure_report_dir_test} -o {html_dir}")
    os.system(f"allure open {html_dir}")

mysql支持
mysql主要用于:一提供参数化赋值;二数据库比对断言。

commons/dao.py实现了相关功能。在data/env.py中根据环境定义好连接后,通过vars_使用。

dao_x = Dao('host:port',
            'username',
            'password')
sql_result = vars_.dao_x.select('select id, name from new_table;')

dao实现采用了pandas+sqlalchemy,对返回结果取值就可以按dataframe来,如sql_result'name'。

借助texttable会打印表格日志,观察数据。

[2020-03-22 18:14:13]Running sql
select id, name from new_table;

[2020-03-22 18:14:14]Sql result:
id name

+====+======+

1 w
2 g

值得说明的是,为了数据校验方便,默认会把无小数的float转换为int,如5.0->5。

@staticmethod
def _convert(x):
    """Convert logic code

    @param x: Single cell data
    @return: Converted single cell data
    """
    # float to int
    if isinstance(x, float) and x % 1 == 0:
        return int(x)
    return x

结语
开源使我快乐。

分享才能收获更多。

我在github等你。

https://github.com/dongfanger/pyface

原文地址https://www.cnblogs.com/df888/p/12592716.html

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
敏捷开发 分布式计算 测试技术
深入理解软件测试中的自动化框架选择与优化策略
【2月更文挑战第29天】 在软件开发的生命周期中,测试环节扮演着至关重要的角色。随着敏捷开发和持续集成的普及,自动化测试成为确保软件质量和加快产品上市速度的关键手段。本文将探讨在构建自动化测试框架时面临的挑战,分析不同类型自动化框架的特点及其适用场景,并提出一系列优化策略,旨在帮助测试工程师提高测试效率,确保测试结果的准确性。
21 0
|
4天前
|
Web App开发 JavaScript 前端开发
深入理解自动化测试框架Selenium的设计与实现
【4月更文挑战第20天】 在软件测试领域,自动化测试已成为提升测试效率和确保产品质量的关键手段。Selenium作为一款广泛使用的开源自动化测试框架,其设计精巧且功能强大,为Web应用提供了一种灵活、高效的测试解决方案。本文将深入探讨Selenium的核心架构与实现细节,解析其如何通过模拟用户操作来执行测试用例,以及它如何适应不断变化的Web技术标准。通过对Selenium内部机制的剖析,旨在帮助测试工程师更好地掌握该工具,并在测试实践中发挥其最大效能。
|
6天前
|
监控 测试技术 数据安全/隐私保护
如何将代理IP集成到自动化测试框架中?
如何将代理IP集成到自动化测试框架中?
|
8天前
|
敏捷开发 监控 前端开发
深入理解自动化测试框架Selenium的架构与实践
【4月更文挑战第16天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加快迭代速度的关键手段。Selenium作为一种广泛使用的自动化测试工具,其开源、跨平台的特性使得它成为业界的首选之一。本文旨在剖析Selenium的核心架构,并结合实际案例探讨其在复杂Web应用测试中的高效实践方法。通过详细解读Selenium组件间的交互机制以及如何优化测试脚本,我们希望为读者提供深入理解Selenium并有效运用于日常测试工作的参考。
14 1
|
8天前
|
自然语言处理 测试技术 API
深入理解自动化测试框架Selenium的设计理念与实践
【4月更文挑战第15天】 在现代软件开发过程中,自动化测试已成为确保产品质量和加速迭代的关键手段。Selenium作为一种广泛使用的自动化测试框架,提供了对多种浏览器和平台的支持,极大地促进了Web应用的功能测试。本文旨在剖析Selenium的核心设计理念,探讨其在实际项目中的应用,并指出常见的误区及最佳实践,以期帮助测试工程师更高效地利用Selenium进行测试工作。
|
10天前
|
监控 测试技术 API
深入理解自动化测试框架Selenium的设计与实现
【4月更文挑战第14天】在软件开发过程中,自动化测试是确保代码质量、减少人工重复劳动的关键步骤。Selenium作为一款广泛使用的自动化测试工具,提供了对多种浏览器和操作系统的支持。本文将探讨Selenium的核心组件及其架构设计,分析其如何通过WebDriver与浏览器交互,以及它如何支持多种编程语言进行脚本编写。同时,我们还将讨论Selenium Grid的作用以及它如何实现并行测试,以缩短测试周期并提高测试效率。
175 59
|
26天前
|
敏捷开发 设计模式 监控
深入理解自动化测试框架的设计原则
在软件开发的复杂多变环境中,自动化测试已成为确保产品质量和加速市场交付的关键步骤。本文将探讨自动化测试框架的设计原则,包括模块化、可扩展性、易用性和可靠性,旨在为软件测试工程师提供构建高效、健壮且易于维护的自动化测试系统的指导。通过分析设计模式的应用,我们将了解如何减少代码冗余,提高测试覆盖率,并适应快速变化的技术要求。
|
27天前
|
前端开发 IDE JavaScript
深入理解自动化测试框架Selenium的设计与实现
本文旨在探讨开源自动化测试框架Selenium的核心设计及其实现机制。通过分析其架构、组件和工作原理,揭示Selenium如何有效地支持跨浏览器、跨平台的自动化Web测试。文中不仅介绍了Selenium的主要功能模块,还详细讨论了其面临的挑战及应对策略,为读者提供了深入了解和使用Selenium的理论基础和实践指导。
|
29天前
|
敏捷开发 测试技术 持续交付
深入探索软件测试自动化:框架与实践
在快速演进的软件行业中,测试自动化已成为确保产品质量和加快上市速度的关键因素。本文将深入分析测试自动化框架的构建要点,探讨其在实际应用中的效益,以及实施过程中可能面临的挑战。通过对比手动测试与自动化测试的优势与局限,本文旨在为读者提供一套系统化的测试自动化实践指南,以支持更高效、可靠的软件开发周期。
11 0
|
30天前
|
设计模式 敏捷开发 监控
深入理解与应用软件自动化测试框架
在快速迭代的软件开发过程中,自动化测试已成为确保产品质量和加快交付速度的关键因素。本文将详细探讨自动化测试框架的核心原理、设计模式及其在实际项目中的应用。我们将分析几种流行的自动化测试工具,如Selenium、Appium和JUnit,并讨论它们如何集成以形成强大的测试解决方案。文章还将展示通过自定义框架来满足特定测试需求的实例,以及如何通过持续集成和持续部署(CI/CD)流程优化测试实践。

热门文章

最新文章