首页 > 其他分享 >一文搞懂如何设计自动化测试框架

一文搞懂如何设计自动化测试框架

时间:2024-11-20 14:56:57浏览次数:1  
标签:一文 框架 版本号 单元测试 测试 自动化 设计 搞懂

什么是自动化项目搭建

当一个软件开发工程师接到一个新的Web项目开发的时候,往往需要完成一些准备工作,例如,选择web框架,项目的目录结构设计,数据库的连接配置,Redis/Kafka连接和配置;甚至包括一些基础功能的实现和封装,例如 MySQL库增删查改操作的封装,登录功能,以及登录token的验证。这个过程通常称为 项目初始化项目搭建

当我们的大部分项目都会用到这些基础功能,我们会将这个搭建好的项目放到一个单独的代码仓库,当需要开发新的项目时就从从这个仓库拉取代码,在这个项目代码的基础上继续开发。这项目通常被称为 种子项目模板项目

每次从模板项目拉取代码,都需要手动修改 模板项目 的名称,例如:将 template-project 改为 company-user-projectcompany-payment-project。甚至在使用 模板项目的时候,会有个性化的需求,company-user-project 需要使用MySQL数据库,company-payment-project需要使用MongoDB数据库,我们可以进一步实现脚手架工具。通过可选配置的方式生成个性化的 模板项目 ,这样的工具我们通常称为 脚手架工具

图:Spring initializr

自动化测试工程师在接到新需求时,也需要完成类似项目初始化的工作(例如选择测试框架、设计目录结构、集成测试报告,以及各种主流的测试库等)。此外,也包括实现一些基础用例或封装一些通用操作,比如系统的注册、登录用例,封装随机数的生成等等。毫无疑问,这个过程也被认为是 自动化项目搭建

当我们搭建好了自动化测试项目,同样可以将其作为 模板项目 使用。然后,基于 模板项目,我们可以更加快速的编写自动化测试用例。

为什么要介绍这个概念,是因为网上看到大量的文章将 自动化测试项目搭建 叫做 自动化测试框架开发,这显然是错误的认知,因为两者的角度和目的是不同的。

  • 自动化测试项目搭建: 服务于公司具体业务,为了更快速地编写业务的测试用例。

  • 自动化测试框架开发: 为了解决一类通用问题,开发设计的一种通用的能力,从而定义解决问题的方法和结构。

为什么设计自动化测试框架

开发框架的原因可以有多种角度,以下是比较常见的原因。

提高开发效率

现有框架可能存在以下问题:

  • 现有框架使用过程中存在过多的第三方依赖,安装和配置比较繁琐。
  • 使用复杂,测试工程师需要花费过多时间学习或适配。

通过开发更贴合需求的自动化测试框架,可以减少重复性劳动,提升开发效率。

满足特定类型需求

现有框架存在无法满足特定类型的业务的测试需求(例如,gRPC、Kafka的测试用例编写),需要在现有框架的基础上做更多的功能扩展和封装。

通过开发功能更加强大的框架,更好的解决现有业务类型的自动化测试需求。

提供更优的设计理念

提供更优的设计理念或创新技术实现。

  • 创新性设计:基于新的架构或设计模式提供更高性能、更易扩展的解决方案。
  • 领域驱动:专注于某一特定领域(如关键字驱动,数据驱动、方法链)的最佳实践。

提升团队协作

规范团队协作,提升开发体验和代码一致性。

  • 框架可以规范团队的开发方式,减少个性化差异带来的协作成本。
  • 提供标准化的工具链、模块和流程,确保团队代码质量和一致性。

自动化测试框架设计的方向

当我们决定去设计自动化测试框架,那么可以有两个方向:从零开始设计基于单元测试框架二次开发

从零开始设计

从零开始设计自动化测试框架,例如针对一款的编程语言,单元测试框架一般需要作为基础库被设计并集成到编程语言中。

标准化的测试结构

单元测试框架提供了一种统一的结构化方式,让开发者以一致的方式组织和运行测试。

  • 生命周期方法: 通常框架会定义一套标准化的生命周期钩子,用于在每个测试方法执行前后进行资源管理:setup/beforeEach: 在每个测试运行之前初始化测试环境(如创建测试数据、实例化对象)。
    teardown/afterEach: 在每个测试运行后清理资源(如关闭数据库连接、删除临时文件)。

  • 测试方法的命名: 通常有特定约定,比如以 test_ 开头(Python 的 unittest)或 @Test 注解(Java 的 JUnit)。 这种约定使得框架可以自动发现测试方法。

  • 独立性: 每个测试方法应保持独立,不依赖其他测试。测试之间的隔离有助于更快定位问题。

断言机制

断言(Assertions)是单元测试的核心,用于验证被测代码的行为是否符合预期。

断言的作用:

  1. 通过对输入和输出的验证,确保代码逻辑正确。
  2. 如果断言失败,测试会立即终止并报告错误。

测试发现

测试发现是单元测试框架的一项重要功能,能够自动找到符合规范的测试。

框架会扫描特定的模块或文件夹,找到符合命名约定的方法。例如:在 Python 中,pytest 会自动发现以 test_ 开头的方法。在 Java 的 JUnit 中,@Test 注解标识的方法会被识别为测试方法。

测试套件和测试运行器

测试套件和运行器使得开发者可以高效地组织和执行测试。

  • 测试套件(Test Suite)

测试套件是一个集合,用于将多个测试用例组合在一起运行。方便地对一组相关的测试进行分组管理。

  • 测试运行器(Test Runner)

测试运行器负责执行测试并收集测试结果。

测试报告和结果反馈

测试报告用于展示测试的执行结果,帮助开发者快速了解代码的健康状态。测试结果分类

  • 通过(Pass): 测试正常完成且所有断言成功。
  • 失败(Fail): 测试未通过,某个断言失败。
  • 错误(Error): 测试执行过程中抛出了未预期的异常。
  • 跳过(Skip/Ignore): 测试因某些条件未被执行。

扩展:xUnit 被认为是许多主流编程语言的单元测试框架的雏形和灵感来源。xUnit 是一种架构模式,最早由 Kent Beck 和 Erich Gamma 在 SUnit(Smalltalk 的单元测试框架)中提出,并成为了测试框架设计的标准。其设计思想和概念被广泛应用到其他语言中,例如 JUnit(Java)、NUnit(.NET)、pytest(Python)等。

基于单元测试框架二次开发

基于单元测试框架二次开发,在单元测试框架的基础上,更偏注重于扩展各种测试能力。

通常,单元测试框架已经提供了基础的测试能力,为了更好的支撑各种类型的测试,我们可以在此基础上进行扩展,以便于满足不同类型的需求。

基于单元测试框架二次开发的方向比较多,取决于基于框架设计的定位和目标。以下是常见的扩展功能。

数据驱动

数据驱动是自动化测试最常见的功能之一,可以有效的减少样例代码的编写,从而提高测试用例编写的效率。

  • 数据驱动装饰器

可以通过数据驱动装饰器来驱动测试测试用例(方法), 例如,Seldom框架的 @data([]) 装饰器。

  • 数据驱动文件

通过取数驱动文件读取不同类型的数据文件。例如,Seldom框架的@data_file("./data/file.json")管理测试数据。

定制化测试报告

测试报告是自动化测试框架的非常重要的功能,我们需要对报告做一些定制化开发。

  • 个性化测试样式和内容

例如显示公司logo、人员个名称和角色等。

  • 生成不同的报告类型

不同的运行模式需要不同的报告类型。例如,本地执行需要HTML格式的报告,CI/CD 或平台化执行需要XML、JSON格式的测试报告。

脚手架工具

集成脚手架工具,可以快速的生成 自动化测试项目模板

关于自动化测试项目模板,文章的开头已经介绍,这里不再阐述。

集成消息功能

每个公司都有自己的通讯工具,邮件、钉钉、企微、飞书等。 通过调用相关工具的API,实现发消息功能,可以让测试的运行结果更快的发送给相关人员。

集成各种测试库

基于框架的定位,可以集成不同类型的测试库,并对这些库进行二次开发,使框架的使用更加高效统一。

  • Web UI测试

如果是为了实现Web UI自动化测试,那么可以集成 Selenium、Playwright等测试库,并对这些库的API进行二次封装。

  • API 测试

如果是为支持接口测试,可以集成 Requests、webSocket、gRPC等测试库,并对这些库的API进行二次封装。

  • App UI测试

如果是为了实现App UI自动化测试,那么可以集成 Appium、uiautomator2 等测试库,并对这些库的API进行二次封装。

自动化测试框架设计基本准则

独立的名字和版本管理

我们应该把框架当成一个独立的项目来进行开发、维护和升级。

框架的命名

首先,应该为框架起一个独立的名字,既可以以某个动物或植物命名,比如,Python(蟒蛇)或Lettuce(生菜);也可以按照框架的本意命名,比如, Robot Framework(自动化框架)或unittest(单元测试);还可以是缩写合成词,比如,pytest = Python + Test、Appium = Application + Selenium等,关键是简单好记。

版本号管理

其次,框架应该有自己的版本号,推荐使用GNU风格的版本号命名。

格式:主版本号.子版本号[.修正版本号[.编译版本号]]

  • 主版本号:重构版本。
  • 子版本号:重大功能改进。
  • 修正版本号:小升级或者bug修复。
  • 编译版本号:一般是编译器在编译过程中自动生成的,我们只定义其格式,并不进行人为的控制。

独立的安装

最后,框架应该提供独立的安装,比如,Python使用pip命令进行安装。

对于开源的项目来说,例如,需要创建setup.py或pyproject.toml打包文件,将项目打包成.whl格式的文件,提交到pypi.org官方仓库。

具备通用性

作为一款框架,其定位和目标一定是解决一类通用问题并提供能力。

例如: 数据驱动自动化发邮件生成随机数数据缓存命令行工具 这些都与具体公司业务无关,提供的是通用的能力。

清晰的定位和目标

自动化测试框架被设计的初衷一定是为更好的了解决某一类问题。在设计之初,我们应该有一个清晰的目标和定位。

从无到有地解决一类问题

xUnit在单元测试框架领域具有开创性意义。前文有对 xUnit 进行介绍。

更加简单地解决一类问题

Flask是一个使用Python编写的轻量级Web框架,通过它,我们可以只简单地编写几行代码就搭建一个Web服务。

提供更加强大且丰富的功能

Django是一个开放源代码的由Python编写的Web框架。

Django虽然学习成本较高,但是它功能提供了 ORM(关系对象映射)、Admin管理系统、模板系统、Cache系统、表单处理、会话(session)、国际化等,这些功能几乎都是开箱即用的,可以用来实现一个较为复杂的系统。

最后,当你要设计一个自动化测试框架的时候,不妨思考一下,设计目标是什么?为了解决什么问题?是否已经有更好的开源框架可以直接使用。

相关书籍推荐

那么,是否有一本书能讲清楚 自动化测试框架设计 ?

答案是:《自动化测试框架设计》一书

本书由虫师编著,作为 SeldomQA GitHub千星开源项目的开发者,在自动化测试框架设计定制化测试报告设计设计模式,以及测试平台开发方面有着深厚技术积累和独特的设计理念。

书中浅显易懂的介绍了 SeldomQA 相关项目中的诸多设计和封装技术。并且,介绍了一个开源自动化测试框架从设计到发布的整个流程。

此外,书中还介绍了如何打通自动化框架自动化测试平台,这是一种独特的技术方案,为自动化测试平台提供了新的设计思路。

最后,结合当下热门的AI技术,作者还介绍AI在自动化领域的探索方向。

标签:一文,框架,版本号,单元测试,测试,自动化,设计,搞懂
From: https://www.cnblogs.com/fnng/p/18558327

相关文章

  • 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-5-创建首个自动化脚本(详细教程)
    1.简介前面几篇宏哥介绍了两种(java和maven)环境搭建和浏览器的启动方法,这篇文章宏哥将要介绍第一个自动化测试脚本。前边环境都搭建成功了,浏览器也驱动成功了,那么我们不着急学习其他内容,首先宏哥搭建好的环境中创建首个完整的自动化测试脚本,让小伙伴或者童鞋们提前感受感受,也是为......
  • Python 项目自动化与 CI/CD 实践:让部署和发布像开挂一样简单
    Python项目自动化与CI/CD实践:让部署和发布像开挂一样简单在软件开发的世界里,自动化和持续集成/持续部署(CI/CD)是超级英雄,它们不仅让我们的工作更加高效,还能避免那些令人头疼的手动操作。它们就像开发者的最佳伙伴,随时准备打击bug,拯救开发进度。那么,今天我们就来聊聊怎......
  • 软件测试笔记|Python自动化测试|常见的列表相关函数有哪些?
    VX公众Hao:阳哥整理软件测试笔记正文:以下是一些常见的Python列表相关函数:增删操作相关函数•list.append():在列表末尾添加一个元素。例如,my_list=[1,2];my_list.append(3),此时my_list变为[1,2,3]。•list.extend():用于将一个可迭代对象(如列表、元组等)中的元素逐个......
  • 软件测试笔记|Python自动化测试|常见的字典相关函数有哪些?
    VX公众Hao:阳哥整理软件测试笔记正文:以下是一些常见的Python字典相关函数:增删改操作相关函数•dict.update():用于将一个字典的键值对更新到另一个字典中。如果键已存在,就更新对应的值;如果键不存在,就添加新的键值对。•dict.pop():通过指定键来删除字典中的键值对,并返回被......
  • 使用Fortran实现当前验证码自动化处理
    Fortran是一种以数值计算为主的编程语言,虽然它通常用于科学计算,但我们也可以尝试用它来完成修正验证码的自动化解决方案。以下是实现过程。步骤一:准备工作使用Fortran需要安装编译器,例如gfortran。我们还需要一个额外的Fortran绑定库,用于处理HTTP请求与图像操作,例如FLIBS。步骤......
  • 一文带你从入门到精通——MySQL(一)
    目录一. MySQL基础知识1.1引言1.2数据库1.2.1数据库简介1.2.2 数据库分类1.3SQL语句1.3.1SQL通用语法1.3.2SQL数据类型1.3.3SQL字段约束1.3.3.1主键约束1.3.3.2 非空约束1.3.3.3 唯一约束1.3.3.4 默认约束1.3.3 SQL分类1.3.3.1常用DDL1.3.3.2 ......
  • 一文带你从入门到精通——MySQL(二)
    建议先阅读我的上一篇博客,掌握一定的MySQL基础知识后再阅读本文,链接如下:一文带你从入门到精通——MySQL(一)-CSDN博客、目录二、MySQL单表查询2.1基础查询2.2条件查询2.3排序查询2.4聚合查询2.5分组查询2.6分页查询2.7MySQL语句的执行顺序二、MySQL单表查询......
  • Zmap+python脚本+burp实现自动化Fuzzing测试
    声明学习视频来自B站UP主泷羽sec,如涉及侵权马上删除文章。笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。✍......
  • ETL没有自动化数据集成平台,你的BI报表只会让你错失先机
    随着现代企业的数据量和复杂性的不断增加,传统的商业智能(BI)报表系统虽然能够提供详尽的业务指标和洞察,但它们依赖于用户的主动查询和查看。这种被动式的数据分析模式存在几个显著的缺陷:滞后性:用户需要定期或不定期地查看报表,才能发现业务中的异常或问题。这意味着在问题发生到被......
  • 质量视角下的系统稳定性保障--稳定性保障常态化自动化实践
    作者:京东物流翁美婷一、前言随着系统数量增多,复杂度提高,线上应急问题时有发生;加之需投入大量人力进行服务治理和验证,为了减少日常应急问题及提前排除风险,发起对生产系统的持续综合性治理,实现常态化稳定性治理。在常态化治理过程中我们将识别问题等重复性有规律的工作实现自动化......