当前位置: 首页 > news >正文

自动化测试中的SOLID原则

自动化测试在软件质量保障手段中愈显重要 。但是随着自动化测试代码的规模和复杂性不断扩大,它也很容易出现测试代码重复、紧耦合等问题。而SOLID原则可以解决这一问题,作为自动化用例开发的指导原则。

探索SOLID原则

SOLID原则是一组指导软件开发人员设计高质量软件的设计原则。这些原则分别是单一职责原则(Single Responsibility Principle, SRP)、开闭原则(Open-Close Principle, OCP)、里式替换原则(Liskov Substitution Principle, LSP)、接口隔离原则(Interface Segregation Principle, ISP)和依赖反转原则(Dependency Inversion Principle, DIP)。这些原则共同帮助开发人员创建易于维护和可扩展的软件系统,提高软件的可维护性、可扩展性、可重用性和可测试性。

  1. 单一职责原则(SRP):一个类或方法应该只有一个职责。这意味着一个类不应该承担过多的职责,以避免紧密的职责耦合,从而使得类的修改和维护变得困难。
  2. 开闭原则(OCP):软件实体(如模块、类)应对扩展开放,对修改关闭。这意味着软件应该在不影响现有功能的情况下进行扩展,以适应新的需求或变化。
  3. 里式替换原则(LSP):子类应该能够替换其父类,而不会影响程序的正确性。这要求继承关系中的子类保持与父类一致的接口和行为。
  4. 接口隔离原则(ISP):客户端应该依赖于它需要的具体接口,而不是依赖于一个庞大的接口。这有助于减少类之间的耦合度,提高系统的可维护性和可重用性。
  5. 依赖反转原则(DIP):高层模块不应该依赖于低层模块,它们都应该依赖于抽象。这有助于减少代码之间的耦合度,使得代码更加灵活和可维护。

通过遵循这些原则,开发人员可以设计出更加灵活、易于理解和修改的代码,从而提高软件的质量和可靠性。

1. 单一责任原则(SRP)

下面是一些如何应用它的例子:

PageObject模型:

  • 为每个页面创建一个不同的类,例如 HomePage, LoginPage, OrdersPage 等,而不是将所有的页面定位器合并到一个单一的 “PageObject” 类中,而是将它们分布到负责各自页面的单个类中。
  • 对于较大的页面,可以考虑将它们分解成较小的 PageFragments,例如页眉、表格、页脚等。

聊聊UI自动化的PageObject设计模式

每个功能都应该有一个单独的测试类:

  • 这确保每个测试类都专门用于测试特定的功能。
  • 例如,登录测试类应该只专注于测试登录功能,而不应该测试不相关功能(如用户注册)。
// Single Responsibility Principle (SRP)
// Example: Creating separate test classes for each feature or user story
public class LoginTest
{[Test]public void UserCanLoginSuccessfully(){// Test logic for login functionality}
}public class ShoppingCartTest
{[Test]public void UserCanAddItemToCart(){// Test logic for adding items to the shopping cart}
}public class CheckoutTest
{[Test]public void UserCanCheckoutSuccessfully(){// Test logic for checkout functionality}
}

自定义 WebdriverFactory 类:我们可以自定义每个 WebDriver 实现,并为特定的 WebDriver 添加扩展。

public class WebDriverFactory{private IWebDriver Driver;public IWebDriver InitDriver(AppiumLocalService appiumLocalService, EnvironmentConfig environmentConfig){switch (platformName){case PlatformName.Web:switch (browserName){case BrowserName.FireFox://Add Firefox browser Optionsbreak;case BrowserName.Chrome://Add Chrome browser Optionsbreak;}break;}return Driver;}  }

Helper 类:

  • 你应该避免创建一个包含所有当前方法的helper类,而是考虑将这些类逻辑地分开。
  • 例如,为 FileHelpers、DatabaseHelpers、CsvHelpers、JsonHelpers 等提供不同的帮助器类。

一个方法应该只负责一个动作:

  • 当方法计算一个值时,它应该只专注于执行计算,而不从文件、数据库或其他外部源读取该值。任何额外的操作都应该在单独的类或方法中处理。在创建类或方法时,请记住考虑实例的真正目的,并避免用不相关的逻辑重载它。

2. 开闭原则(OCP)

下面是如何应用开闭原则的例子:

API Data Objects:

  • 假如今天我们已经实现了RegisterApiV1的版本1 (v1) ,即创建了一个注册表数据对象类。
  • 六个月后,RegisterApiV1引入了新版本,增加了额外的逻辑,并向 Register 特性添加了新的字段。
  • 与其更新现有的类,不如基于当前的类创建一个子类,这种方法使我们能够利用现有的类字段/属性,并在新类中合并新的属性。
public class RegisterApiV1{public string FirstName { get; set; }public string LastName { get; set; }public string Email { get; set; }public string Photo { get; set; }public string UId { get; set; }}public class RegisterApiV2 : RegisterApiV1{public DateTime DateOfBirth { get; set; }}

BaseTest类实现:

  • 我们设计一个大多数测试类都继承的基类。在未来,假如你想要添加只与特定测试类相关的特定逻辑。例如,创建一个基于用户类型从Json文件中检索用户数据的帐户功能的基类.
//UIBaseTest
public class UIBaseTest{[AssemblyInitialize]public static void Init(TestContext testContext){//Assembly Initialization code}[TestInitialize]public void Setup(){//SetUp code}[TestCleanup]public void TearDown(){//TearDown code}}// Account BaseTest
public class AccountBaseTest : UIBaseTest{protected static Login GetUserData(string userType){//Method to get userdata from json}}

3. 里式替换原则(LSP)

超类的对象应该可以被其子类的对象替换,而不会影响程序的正确性。在测试自动化中,该原则强调编写独立于被测系统实现细节的测试的重要性。该原则可以确保我们的测试保持健壮,不受底层代码库变更的影响。

例如:使用高级抽象(例如接口或抽象类)而不是具体实现来编写测试。

// Liskov Substitution Principle (LSP)
// Example: Writing tests using high-level abstractions
public interface ILoginPage
{void EnterCredentials(string username, string password);void ClickLoginButton();
}public class LoginPage : ILoginPage
{public void EnterCredentials(string username, string password){// Implementation for entering credentials}public void ClickLoginButton(){// Implementation for clicking login button}
}public class LoginTest
{[Test]public void UserCanLoginSuccessfully(){ILoginPage loginPage = new LoginPage();loginPage.EnterCredentials("username", "password");loginPage.ClickLoginButton();// Test assertion...}
}

在我们的测试自动化解决方案中应用Liskov替换原则有助于确保我们的测试是可维护的、可扩展的和可重用的。这是通过使用多态性来创建适应性和通用的测试来实现的,使它们适合我们应用程序中的变更。

4. 接口隔离原则(ISP)

客户端应该依赖于它需要的具体接口,而不是依赖于一个庞大的接口。在测试自动化的上下文中,该原则促使我们为测试组件设计清晰简洁的接口,有助于创建模块化和可维护的测试模块,其中每个测试只依赖于它需要的接口,而不是与整个系统紧密耦合。

例如:定义接口(例如,ILoginPage,IShoppingCartPage),以确保测试只依赖于它们需要的方法。

// Interface Segregation Principle (ISP)
// Example: Defining small, focused interfaces for test actions
public interface IShoppingCartPage
{void AddItemToCart(string item);void RemoveItemFromCart(string item);
}public class ShoppingCartPage : IShoppingCartPage
{public void AddItemToCart(string item){// Implementation for adding item to cart}public void RemoveItemFromCart(string item){// Implementation for removing item from cart}
}public class ShoppingCartTest
{[Test]public void UserCanAddItemToCart(){IShoppingCartPage shoppingCartPage = new ShoppingCartPage();shoppingCartPage.AddItemToCart("Product A");// Test assertion...}
}

通过在我们的测试自动化中应用接口隔离原则,我们可以使代码更具可扩展性、模块化和可维护性。这种方法允许我们创建适合各种Web元素类型的接口,避免与某些Web元素无关的方法的不必要依赖。

5. 依赖反转原则(DIP)

高层模块不应该依赖于低层模块,它们都应该依赖于抽象。这有助于减少代码之间的耦合度,使得代码更加灵活和可维护。

例如:创建模拟对象,以将测试与外部依赖(如数据库或API)隔离开来。

// Dependency Inversion Principle (DIP)
// Example: Using dependency injection frameworks or creating mock objects
public interface IDatabase
{void SaveData(string data);
}public class Database : IDatabase
{public void SaveData(string data){// Implementation for saving data to the database}
}public class MockDatabase : IDatabase
{public void SaveData(string data){// Mock implementation for testing}
}public class DataProcessor
{private readonly IDatabase _database;public DataProcessor(IDatabase database){_database = database;}public void ProcessData(string data){// Process data..._database.SaveData(data);}
}public class DataProcessorTest
{[Test]public void DataIsSavedToDatabase(){IDatabase mockDatabase = new MockDatabase();DataProcessor dataProcessor = new DataProcessor(mockDatabase);dataProcessor.ProcessData("Test data");// Test assertion...}
}

在测试自动化中采用 SOLID 原则的优点

采用 SOLID 原则可以帮助软件开发人员避免常见的设计问题,并创建敏捷产品。它增强了代码的可读性、可维护性和可测试性。在测试自动化中实现这些原则:

  • 减少依赖性,增强模块化、可测试性和可维护性。
  • 增强代码理解、扩展和可伸缩性,以快速适应业务需求。
  • 改进设计和代码质量,防止单个更改破坏整个应用程序。
  • 提高测试覆盖率并简化调试过程。
  • 减少维护工作量,使代码重构变得快速而轻松。


 

相关文章:

自动化测试中的SOLID原则

自动化测试在软件质量保障手段中愈显重要 。但是随着自动化测试代码的规模和复杂性不断扩大,它也很容易出现测试代码重复、紧耦合等问题。而SOLID原则可以解决这一问题,作为自动化用例开发的指导原则。 探索SOLID原则 SOLID原则是一组指导软件开发人员…...

tencentcloud-sdk-python-iotexplorer和tencent-iot-device有什么区别

1. tencent-iot-device tencent-iot-device 是腾讯云提供的物联网设备 SDK,用于在物联网场景中开发和连接设备。这个 SDK 提供了丰富的功能和接口,可以帮助开发者快速构建稳定、高效的物联网应用。 主要功能和特点: 设备连接管理&#xff1…...

Spring day1

day01_eesy_01jdbc pom.xml<packaging>jar</packaging> <dependencies><!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --><!--依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-…...

设计模式: 行为型之中介者模式(18)

中介者模式概述 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为设计模式&#xff0c;它用于减少对象之间的直接交互&#xff0c;从而使其可以松散耦合中介者模式通过引入一个中介者对象来协调多个对象之间的交互&#xff0c;使得这些对象不需要知道彼此的具体…...

计算机网络的起源与发展历程

文章目录 前言时代背景ARPANET 的诞生TCP/IP 协议簇与 Internet 的诞生HTTP 协议与 Web 世界结语 前言 在当今数字化时代&#xff0c;计算机网络已经成为我们生活中不可或缺的一部分。无论是在家庭、学校、还是工作场所&#xff0c;我们都能感受到网络的巨大影响。随着互联网的…...

2024-4-12-实战:商城首页(下)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业小结 作业 .bg-backward {width: 60px; height: 60px;background: url(..…...

一、flask入门和视图

run启动参数 模板渲染 后端给前端页面传参 前端页面设置css from flask import Flask, render_template,jsonify# 创建flask对象 app Flask(__name__)# 视图函数 路由route app.route("/") def hello_world():# 响应&#xff0c;返回给前端的数据return "h…...

Selenium+Chrome Driver 爬取搜狐页面信息

进行selenium包和chromedriver驱动的安装 安装selenium包 在命令行或者anaconda prompt 中输入 pip install Selenium 安装 chromedriver 先查看chrome浏览器的版本 这里是 123.0.6312.106 版 然后在http://npm.taobao.org/mirrors/chromedriver/或者https://googlechrom…...

SpringBoot:一个注解就能帮你下载任意对象

介绍 下载功能应该是比较常见的功能了&#xff0c;虽然一个项目里面可能出现的不多&#xff0c;但是基本上每个项目都会有&#xff0c;而且有些下载功能其实还是比较繁杂的&#xff0c;倒不是难&#xff0c;而是麻烦。 所以结合之前的下载需求&#xff0c;我写了一个库来简化…...

oracle全量、增量备份

采用0221222增量备份策略,7天一个轮回 也就是周日0级备份&#xff0c;周1 2 4 5 6 采用2级增量备份&#xff0c;周3采用1级增量备份 打开控制文件自动备份 CONFIGURE CONTROLFILE AUTOBACKUP ON; 配置控制文件备份路径 CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVI…...

React Router 5 vs 6:使用上的主要差异与升级指南

React Router 5 的一些API 在 React Router 6 上有时可能找不到&#xff0c;可能会看到如下画面&#xff1a;export ‘useHistory’ was not found in ‘react-router-dom’ … React Router目前有两个大的版本&#xff0c;即React Router 5、6。React Router 6 在设计上更加简…...

基于LNMP部署wordpress

目录 一.环境准备 二.配置源并安装 三.配置Nginx 四.配置数据库 五.上传源码并替换 六.打开浏览器&#xff0c;输入虚拟机ip访问安装部署 七.扩展增加主题 一.环境准备 centos7虚拟机 关闭防火墙和seliunx stop firewalld #关闭防火墙 setenforce 0 …...

openGauss_5.1.0 企业版快速安装及数据库连接:单节点容器化安装

目录 &#x1f4da;第一章 官网信息&#x1f4da;第二章 安装&#x1f4d7;下载源码&#x1f4d7;下载安装包&#x1f4d7;修改版本&#x1f4d7;解压安装包&#x1f4d7;运行buildDockerImage.sh脚本&#x1f4d7;docker操作&#x1f4d5;查看docker镜像&#x1f4d5;启动dock…...

微信小程序 uniapp+vue城市公交线路查询系统dtjl3

小程序Android端运行软件 微信开发者工具/hbuiderx uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 前端&#xff1a;HTML5,CSS3 VUE 后端&#xff1a;java(springbootssm)/python(flaskdja…...

2024年MathorCup数模竞赛B题问题一二三+部分代码分享

inputFolderPath E:\oracle\images\; outputFolderPath E:\oracle\process\; % 获取文件夹中所有图片的文件列表 imageFiles dir(fullfile(inputFolderPath, *.jpg)); % 设置colorbar范围阈值 threshold 120; % 遍历每个图片文件 for i 1:length(imageFiles) % 读…...

Ubuntu日常配置

目录 修改网络配置 xshell连不上怎么办 解析域名失败 永久修改DNS方法 临时修改DNS方法 修改网络配置 1、先ifconfig确认本机IP地址&#xff08;刚装的机子没有ifconfig&#xff0c;先apt install net-tools&#xff09; 2、22.04版本的ubuntu网络配置在netplan目录下&…...

GMSSL-通信

死磕GMSSL通信-C/C++系列(一) 最近再做国密通信的项目开发,以为国密也就简单的集成一个库就可以完事了,没想到能有这么多坑。遂写下文章,避免重复踩坑。以下国密通信的坑有以下场景 1、使用GMSSL guanzhi/GmSSL进行通信 2、使用加密套件SM2-WITH-SMS4-SM3 使用心得 ​…...

linux 磁盘分区Inode使用率达到100%,导致网站无法创建文件报错 failed:No space leftondevice(

linux 磁盘分区Inode使用率达到100%&#xff0c;导致网站无法创建文件报错 failed:No space left on device 由于这问题直接导致了&#xff0c;网站无法正常运行&#xff01; 提交工单求助阿里后&#xff0c;得到了答案&#xff01; 工程师先让我执行 df -h 和 df -i 通过分析…...

探索Python库的奇妙世界

探索Python库的奇妙世界 Python作为一种流行的编程语言&#xff0c;因其简洁的语法、强大的库支持和广泛的应用场景而备受开发者青睐。在这篇文章中&#xff0c;我们将深入探讨Python库的世界&#xff0c;了解它们如何帮助我们更高效地编写代码&#xff0c;并展示一些最有用的…...

SQL Server 存储函数(funGetId):唯一ID

系统测试时批量生成模拟数据&#xff0c;通过存储函数生成唯一ID。 根据当前时间生成唯一ID&#xff08;17位&#xff09; --自定义函数&#xff1a;根据当前时间组合成一个唯一ID字符串:yearmonthdayhourminutesecondmillisecond drop function funGetId;go--自定义函数&…...

当你的项目体积比较大?你如何做性能优化

在前端开发中&#xff0c;项目体积优化是一个重要的环节&#xff0c;它直接影响到网页的加载速度和用户体验。随着前端项目越来越复杂&#xff0c;引入的依赖也越来越多&#xff0c;如何有效地减少最终打包文件的大小&#xff0c;成为了前端工程师需要面对的挑战。以下是一些常…...

第6章:6.3.2 一张表总结正则表达式的语法 (MATLAB入门课程)

讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 本节我们用一张表来回顾和总结MATLAB正则表达式的基本语法。这个…...

VBA 实现outlook 当邮件设置category: red 即触发自动创建jira issue

1. 打开: Outlook VBA&#xff08;Visual Basic for Applications&#xff09; 方法一: 在邮件直接搜索:Visual Basic editor 方法二: File -> Options -> Customize Ribbon-> 打钩 如下图: 2.设置运行VBA 脚本: File -> Options -> Trust center -> Trus…...

办公软件巨头CCED、WPS迎来新挑战,新款办公软件已形成普及之势

办公软件巨头CCED、WPS的成长经历 CCED与WPS&#xff0c;这两者均是中国办公软件行业的佼佼者&#xff0c;为人们所熟知。 然而&#xff0c;它们的成功并非一蹴而就&#xff0c;而是经过了长时间的积累与沉淀。 CCED&#xff0c;这款中国大陆早期的文本编辑器&#xff0c;在上…...

架构设计-订单系统之订单系统的架构进化

1、单数据库架构 产品初期&#xff0c;技术团队的核心目标是&#xff1a;“快速实现产品需求&#xff0c;尽早对外提供服务”。 彼时的专车服务都连同一个 SQLServer 数据库&#xff0c;服务层已经按照业务领域做了一定程度的拆分。 这种架构非常简单&#xff0c;团队可以分开…...

性能升级,INDEMIND机器人AI Kit助力产业再蜕变

随着机器人进入到越来越多的生产生活场景中&#xff0c;作业任务和环境变得更加复杂&#xff0c;机器人需要更精准、更稳定、更智能、更灵敏的自主导航能力。 自主导航技术作为机器人技术的核心&#xff0c;虽然经过了多年发展&#xff0c;取得了长足进步&#xff0c;但在实践…...

2024年妈妈杯数学建模C题思路分析-物流网络分拣中心货量预测及人员排班

# 1 赛题 C 题 物流网络分拣中心货量预测及人员排班 电商物流网络在订单履约中由多个环节组成&#xff0c;图 ’ 是一个简化的物流 网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包裹按照不同 流向进行分拣并发往下一个场地&#xff0c;最终使包裹…...

prometheus\skywalking\splunk功能的区别

Prometheus、SkyWalking和Splunk这三个工具在功能上各有特色&#xff0c;以下是它们各自的主要功能特点&#xff1a; Prometheus是一个开源的系统监控和警报工具。它的主要功能包括&#xff1a; 实时监控与警报&#xff1a;Prometheus可以实时监控各种指标&#xff0c;并根据…...

Harmony鸿蒙南向驱动开发-SPI接口使用

功能简介 SPI指串行外设接口&#xff08;Serial Peripheral Interface&#xff09;&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。SPI是由Motorola公司开发&#xff0c;用于在主设备和从设备之间进行通信。 SPI接口定义了操作SPI设备的通用方法集合…...

芒果YOLOv7改进96:检测头篇DynamicHead动态检测头:即插即用|DynamicHead检测头,尺度感知、空间感知、任务感知

该专栏完整目录链接: 芒果YOLOv7深度改进教程 该创新点:在原始的Dynamic Head的基础上,对核心部位进行了二次的改进,在 原论文 《尺度感知、空间感知、任务感知》 的基础上,在 通道感知 的层级上进行了增强,关注每个像素点的比重。 在自己的数据集上改进,有效涨点就可以…...

武汉平价网站建设/网络seo是什么工作

链接&#xff1a;https://ac.nowcoder.com/acm/contest/5646/J来源&#xff1a;牛客网题目描述对输入的字符串进行排序后输出输入描述:多个测试用例&#xff0c;每个测试用例一行。每行通过,隔开&#xff0c;有n个字符&#xff0c;n&#xff1c;100输出描述:对于每组用例输出一…...

英国政府网站建设特点/3分钟搞定网站seo优化外链建设

单例模式 保证一个类只有一个实例&#xff0c;并且提供一个访问他的全局访问点 --《设计模式&#xff1a;可复用面向对象软件的基础》84页3.5节 在某些情况下我们需要一个类在任何情况下 只需要同一个实例并且提供一个访问该实例的方法 单例模式又分懒汉和饿汉模式 懒汉模式&a…...

政府单位网站建设方案/关键词搜索广告

java8的stream流学习(2) ***前言*** 之前也写过两三篇关于Stream相关的帖子,当然了,也是参考的.我感觉java8的新特性还是要深刻掌握的,因为这几个新特性的确能帮助我们让代码变得健壮,不说了,直接写案例,撸代码 参考网址: https://mp.weixin.qq.com/s/IHkpqdRLeEPAgdPbOnxsKw …...

出名的wordpress模板/教你如何快速建站

compile 编译 / 测试 / 运行都会引入该 jar, 是 scope 的默认值 provided 编译 / 测试会引入该 jar, 运行时, 认为环境会自带这个 jarruntime 只在运行时, 引入该 jartest 在执行测试类时, 引入该 jarsystem 不去本地仓库搜索该 jar, 一般会搭配 systemPath 引用本地绝对路径上…...

wordpress首页文章两列/梅花seo 快速排名软件

FreeRTOS 事件组(Event Groups) 在本实例中,我们将学习使用事件组。 事件组也是 FreeRTOS 提供的一项重要功能。 首先,我们将看到一个介绍事件组的介绍,其中显示了如何以及在何处使用它。 之后,我们将看到一个 Arduino 的演示示例。 1、事件组介绍 在前面的教程中,我…...

wordpress邮件订阅功能/seo必备工具

部署Docker 运行以下命令&#xff0c;安装Docker存储驱动的依赖包。 dnf install -y device-mapper-persistent-data lvm2 运行以下命令&#xff0c;添加稳定的Docker软件源。 dnf config-manager --add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo…...