接口自动化框架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
相关文章
|
2月前
|
测试技术
接口自动化不是救命稻草
接口自动化不是救命稻草
14 1
|
1月前
|
Java 测试技术 持续交付
深入理解软件测试中的自动化框架选择
【2月更文挑战第14天】在软件测试领域,自动化测试已成为提升效率、确保质量的关键手段。选择合适的自动化测试框架对实现高效稳定的测试至关重要。本文将探讨自动化框架选择的关键因素,包括项目需求、团队技能、维护成本以及集成能力,并分析当前流行的几种自动化框架的优缺点,以指导读者根据不同的测试场景作出明智的选择。
19 0
|
30天前
|
敏捷开发 分布式计算 测试技术
深入理解软件测试中的自动化框架选择与优化策略
【2月更文挑战第29天】 在软件开发的生命周期中,测试环节扮演着至关重要的角色。随着敏捷开发和持续集成的普及,自动化测试成为确保软件质量和加快产品上市速度的关键手段。本文将探讨在构建自动化测试框架时面临的挑战,分析不同类型自动化框架的特点及其适用场景,并提出一系列优化策略,旨在帮助测试工程师提高测试效率,确保测试结果的准确性。
16 0
|
5天前
|
监控 测试技术 API
深入理解自动化测试框架Selenium的设计与实现
【4月更文挑战第14天】在软件开发过程中,自动化测试是确保代码质量、减少人工重复劳动的关键步骤。Selenium作为一款广泛使用的自动化测试工具,提供了对多种浏览器和操作系统的支持。本文将探讨Selenium的核心组件及其架构设计,分析其如何通过WebDriver与浏览器交互,以及它如何支持多种编程语言进行脚本编写。同时,我们还将讨论Selenium Grid的作用以及它如何实现并行测试,以缩短测试周期并提高测试效率。
168 58
|
20天前
|
敏捷开发 设计模式 监控
深入理解自动化测试框架的设计原则
在软件开发的复杂多变环境中,自动化测试已成为确保产品质量和加速市场交付的关键步骤。本文将探讨自动化测试框架的设计原则,包括模块化、可扩展性、易用性和可靠性,旨在为软件测试工程师提供构建高效、健壮且易于维护的自动化测试系统的指导。通过分析设计模式的应用,我们将了解如何减少代码冗余,提高测试覆盖率,并适应快速变化的技术要求。
|
22天前
|
前端开发 IDE JavaScript
深入理解自动化测试框架Selenium的设计与实现
本文旨在探讨开源自动化测试框架Selenium的核心设计及其实现机制。通过分析其架构、组件和工作原理,揭示Selenium如何有效地支持跨浏览器、跨平台的自动化Web测试。文中不仅介绍了Selenium的主要功能模块,还详细讨论了其面临的挑战及应对策略,为读者提供了深入了解和使用Selenium的理论基础和实践指导。
|
25天前
|
设计模式 敏捷开发 监控
深入理解与应用软件自动化测试框架
在快速迭代的软件开发过程中,自动化测试已成为确保产品质量和加快交付速度的关键因素。本文将详细探讨自动化测试框架的核心原理、设计模式及其在实际项目中的应用。我们将分析几种流行的自动化测试工具,如Selenium、Appium和JUnit,并讨论它们如何集成以形成强大的测试解决方案。文章还将展示通过自定义框架来满足特定测试需求的实例,以及如何通过持续集成和持续部署(CI/CD)流程优化测试实践。
|
26天前
|
敏捷开发 IDE 测试技术
深入理解自动化测试框架Selenium的设计理念与实践
随着敏捷开发和持续集成的理念深入人心,自动化测试在软件开发周期中扮演着越来越重要的角色。Selenium作为一个广泛使用的自动化测试工具,其设计理念和实践对于提高测试效率和质量具有指导意义。本文将深入探讨Selenium的核心设计原则、架构以及最佳实践,旨在帮助读者构建更稳定、高效的自动化测试系统。
|
26天前
|
jenkins 测试技术 持续交付
深入理解自动化测试框架设计原则与实践
本文旨在探讨自动化测试框架的设计原则及其在实际项目中的应用。通过对自动化测试框架的系统剖析,我们揭示了有效构建和维持测试框架的核心要素,并提供了一套实用的指导方案来帮助读者实现高效、可靠的自动化测试流程。文章不仅聚焦于框架的技术细节,也强调了灵活性、可维护性和可扩展性在设计时的重要性,同时结合实际案例分析,展示了如何在不同测试环境中定制化和优化测试框架。
|
29天前
|
机器学习/深度学习 敏捷开发 人工智能
深入探索软件自动化测试:框架与实践
【2月更文挑战第30天】 在快速迭代的软件开发周期中,自动化测试已成为确保产品质量和加快交付速度的关键因素。本文将深入探讨自动化测试的核心概念、常用框架以及在实际项目中的应用实践。我们将分析自动化测试的优势,并讨论其在不同开发阶段的作用,同时提出构建高效自动化测试流程的策略。通过实际案例分析,本文旨在为读者提供一套系统的自动化测试解决方案,以应对日益复杂的软件测试挑战。

热门文章

最新文章