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

简介:

接口自动化框架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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
634 11
|
12月前
|
Web App开发 人工智能 JavaScript
主流自动化测试框架的技术解析与实战指南
本内容深入解析主流测试框架Playwright、Selenium与Cypress的核心架构与适用场景,对比其在SPA测试、CI/CD、跨浏览器兼容性等方面的表现。同时探讨Playwright在AI增强测试、录制回放、企业部署等领域的实战优势,以及Selenium在老旧系统和IE兼容性中的坚守场景。结合六大典型场景,提供技术选型决策指南,并展望AI赋能下的未来测试体系。
|
10月前
|
数据采集 人工智能 自然语言处理
Playwright MCP 浏览器自动化框架全面解析
Playwright MCP是微软推出的开源项目,结合Playwright与MCP协议,让AI通过结构化数据直接操作浏览器。告别传统视觉识别,实现高效、精准的网页自动化,广泛应用于测试、爬虫、办公自动化等场景,大幅提升效率与可靠性。
|
Web App开发 开发框架 .NET
Playwright 自动化测试系列(6)| 第三阶段:测试框架集成​指南:参数化测试 + 多浏览器并行执行
Pytest 与 Playwright 集成可提升自动化测试效率,支持参数化测试、多浏览器并行执行及统一报告生成。通过数据驱动、Fixture 管理和并行优化,显著增强测试覆盖率与执行速度,适用于复杂 Web 应用测试场景。
|
数据采集 JSON 前端开发
GraphQL接口采集:自动化发现和提取隐藏数据字段
本文围绕GraphQL接口采集展开,详解如何通过`requests`+`Session`自动化提取隐藏数据字段,结合爬虫代理、Cookie与User-Agent设置实现精准抓取。内容涵盖错误示例(传统HTML解析弊端)、正确姿势(GraphQL请求构造)、原因解释(效率优势)、陷阱提示(反爬机制)及模板推荐(可复用代码)。掌握全文技巧,助你高效采集Yelp商家信息,避免常见误区,快速上手中高级爬虫开发。
346 3
GraphQL接口采集:自动化发现和提取隐藏数据字段
|
测试技术 API C++
Playwright 自动化测试系列(7)| 第三阶段:测试框架集成​​Page Object 模式
本课程详解Playwright测试框架中的Page Object模式,通过电商登录-下单实战演示PO架构设计与高级技巧,结合Pytest实现多用户测试。重点解析PO模式提升代码复用性、降低维护成本的核心价值,并提供常见问题解决方案,助力构建高可维护性的自动化测试体系。
|
Java 测试技术 API
自动化测试框架深度解析与选择指南
Apache JMeter是Apache组织基于Java开发的一款压力测试工具,旨在测试软件的性能承受能力。它支持多种协议测试及功能测试,提供灵活的断言创建能力,如同创建带断言的脚本来验证程序是否返回预期结果。
|
人工智能 运维 Prometheus
AIOpsLab:云服务自动化运维 AI,微软开源云服务 AI 框架,覆盖整个生命周期
AIOpsLab 是微软等机构推出的开源框架,支持云服务自动化运维,涵盖故障检测、根本原因分析等完整生命周期。
961 13
AIOpsLab:云服务自动化运维 AI,微软开源云服务 AI 框架,覆盖整个生命周期
|
人工智能 编解码 自然语言处理
AGUVIS:指导模型实现 GUI 自动化训练框架,结合视觉-语言模型进行训练,实现跨平台自主 GUI 交互
AGUVIS 是香港大学与 Salesforce 联合推出的纯视觉 GUI 自动化框架,能够在多种平台上实现自主 GUI 交互,结合显式规划和推理,提升复杂数字环境中的导航和交互能力。
757 8
AGUVIS:指导模型实现 GUI 自动化训练框架,结合视觉-语言模型进行训练,实现跨平台自主 GUI 交互
|
机器学习/深度学习 设计模式 测试技术
Python 高级编程与实战:构建自动化测试框架
本文深入探讨了Python中的自动化测试框架,包括unittest、pytest和nose2,并通过实战项目帮助读者掌握这些技术。文中详细介绍了各框架的基本用法和示例代码,助力开发者快速验证代码正确性,减少手动测试工作量。学习资源推荐包括Python官方文档及Real Python等网站。

热门文章

最新文章