节省维护成本,提高效率!接口自动化测试框架热加载技术解析

news2024/10/7 12:26:40

目录

一、简介

二、实现热加载技术的具体操作

1. 借助Java类加载器实现热加载

2. 应用热加载技术动态更新代码

三、封装热加载技术

四、总结


前言

现如今,接口自动化测试已经成为了软件开发过程中不可或缺的一部分,通过使用接口自动化框架可以在效率上和质量上都有所提高,也为后续质量保障奠定了坚实的基础。在实际开发中,我们经常会发现很多重复的操作并且不容易维护,这时候就需要一个高可用、高效率和通用性较强的接口自动化测试框架。本文就是为大家介绍如何通过研发接口自动化框架封装项目实战中的热加载技术封装,来提高效率,并降低维护成本。

一、简介

接口自动化测试框架是快速运行、管理和维护接口自动化测试用例的工具。相较于手动测试,在软件开发周期中,接口自动化测试框架可以在保证测试质量的同时节省大量的人工成本和时间成本。但是,接口自动化测试框架也有着自己的弊端,常常需要开发人员在维护和添加新用例时进行一些繁琐的操作。(例如:新建测试用例类、添加配置文件、修改代码等),这些操作大大影响了项目的效率,也让我们在维护时变得更加困难。

因此,我们在接口自动化框架封装项目实战中研究了热加载技术,通过该技术,我们可以在不运行进程的同时,动态更新原有的源程序,再重新载入所更新的代码,从而达到对接口自动化测试框架的热加载操作,提高效率和降低维护成本。接下来将分别从以下方面进行说明:

二、实现热加载技术的具体操作

1. 借助Java类加载器实现热加载

Java类加载器可以动态地扫描并添加新的类,而在新的类被添加的过程中,现有的类仍然可以保持不变。借助Java的类动态加载,我们可以对接口自动化测试框架进行编程时修改,并且不需要停止现有的进程。

具体方式如下:

public class CustomClassLoader extends ClassLoader {

    public List<File> getClassFiles() {
        List<File> fileList = new ArrayList<>();
        // 获取路径下的所有.class文件
        File file = new File("path/to/class/file/directory");
        if (file.isDirectory()) {
            File[] files = file.listFiles(new FileFilter() {
                @Override
                public boolean accept(File pathname) {
                    return pathname.getName().endsWith(".class");
                }
            });
            Collections.addAll(fileList, files);
        }
        return fileList;
    }

    // 加载类的方法
    public Class<?> getClass(String className) {
        Class<?> clazz = null;
        byte[] data = null;
        data = loadData(className);
        if (data != null) {
            clazz = defineClass(className, data, 0,
                    data.length);
        }
        return clazz;
    }

    // 读取.class文件的字节码
    private byte[] loadData(String className) {
        String path = "path/to/class/file/directory" + className + ".class";
        FileInputStream fileInputStream;
        try {
            fileInputStream = new FileInputStream(path);

            int oneByte = 0;
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            while ((oneByte = fileInputStream.read()) != -1) {
                byteArrayOutputStream.write(oneByte);
            }
            fileInputStream.close();
            return byteArrayOutputStream.toByteArray();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

2. 应用热加载技术动态更新代码

在上一步中,我们已经实现了Java类加载器,现在我们需要利用它来实现热加载,来动态更新应

用中的代码。在此之前,我们先来了解一下如何动态更新代码。

动态更新代码,其主要思路是通过编写一个监听代码变化的线程,一旦监测到代码发生了更改,就重新加载该代码并执行。具体的实现可以按如下步骤进行:

(1)在代码中定义一个定时任务线程,以便程序每隔一定时间就能检查是否有新的代码;

(2)利用Java类加载器动态加载新的类,替换已有的类;

(3)通过反射获取在新类中被修改的方法,然后调用它。

具体实现代码如下:

public class HotSwapTask implements Runnable {
    private CustomClassLoader classLoader;
    // 已经加载过的类
    private Map<String,Class<?>> loadedClasses = new HashMap<>();
    // 上次修改时间
    private Map<String,Long> lastLoadedTime = new HashMap<>();
    public HotSwapTask(CustomClassLoader classLoader){
        this.classLoader = classLoader;
    }
    @Override
    public void run() {
        for(File file:classLoader.getClassFiles()){
            String classFilePath = getClassFilePathByName(file.getName());
            long lastModifiedTime = file.lastModified();
            if(lastLoadedTime.containsKey(classFilePath)){
                // 判断修改时间是否发生变化
                if(lastModifiedTime > lastLoadedTime.get(classFilePath)){
                    // 重新根据字节码加载类
                    try {
                        Class<?> clazz = classLoader.getClass(classFilePath.replace(".class",""));
                        // 获取原来的类
                        Class<?> parentClass = loadedClasses.get(classFilePath.replace(".class",""));
                        // 如果不同,说明修改了代码,则进行热更新
                        if(clazz != null && clazz != parentClass){
                            updateClass(clazz);
                        }
                        // 更新最后修改时间
                        lastLoadedTime.put(classFilePath,lastModifiedTime);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }else{
                // 首次加载
                try {
                    Class<?> clazz = classLoader.getClass(classFilePath.replace(".class",""));
                    loadedClasses.put(classFilePath.replace(".class",""),clazz);
                    lastLoadedTime.put(classFilePath,lastModifiedTime);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private void updateClass(Class<?> newClass) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
        // 获取方法名相同的方法,进行替换调用
        for(Class<?> parentClass:loadedClasses.values()){
            for(Method method:newClass.getDeclaredMethods()){
                if(method.getName().equals(parentClass.getDeclaredMethod(method.getName()).getName())){
                    Method parentMethod = parentClass.getDeclaredMethod(method.getName());
                    parentMethod.setAccessible(true);
                    parentMethod.invoke(parentClass.newInstance());
                }
            }
        }
    }

    private String getClassFilePathByName(String className){
        return className;//TODO replace to class file path
    }
}

以上代码展示了一个简单的热加载框架,应用于接口自动化测试框架的项目中,即可实现热加载。

三、封装热加载技术

接口自动化测试框架中应用热加载技术的核心在于实现代码动态更新,将代码的更新与测试的运行解耦合,在原有的框架中加入热加载,就能够实现代码的即时更新,使框架更加通用化且更易维护。封装热加载技术也是接口自动化测试框架的重要一环,我们将热加载、测试用例管理、测试数据管理和测试报告管理封装成一个工具类,简化接口自动化测试框架的使用方式,提高效率。

具体实现代码如下:

public class ApiAutomationFramework {
    // 测试用例管理
    private TestCaseManager caseManager;
    // 测试数据源
    private DataSource dataSource;
    // 测试报告管理
    private ReportManager reportManager;

    public ApiAutomationFramework(String configPath){
        // 根据配置初始化测试用例管理、测试数据源、测试报告管理
        caseManager = new TestCaseManager(configPath);
        dataSource = new DataSource(configPath);
        reportManager = new ReportManager(configPath);
        // 将热加载线程与以上三个模块进行整合,实现接口自动化测试框架的热加载功能
    }
    
    // 运行测试用例
    public void run() {
        // 定时任务线程:检查代码变化
        HotSwapTask hotSwapTask = new HotSwapTask(new CustomClassLoader());
        Thread hotSwapThread = new Thread(hotSwapTask);
        hotSwapThread.setDaemon(true);
        hotSwapThread.start();

        // 数据源加载
        dataSource.load();

        // 获取测试用例
        List<TestCase> testCases = caseManager.getTestCases();

        for (TestCase testCase : testCases) {
            // 数据绑定
            Map<String, Object> data = dataSource.getData(testCase.getData());
            testCase.setData(data);

            // 执行测试
            TestResult result = testCase.run();

            // 更新测试报告
            reportManager.updateReport(testCase.getModule(), testCase.getName(),
                    result.getResult(), result.getMessage());
        }

        // 提交测试报告
        reportManager.submitReport();
    }
}

以上代码将热加载、测试用例管理、测试数据管理和测试报告管理整合成一个ApiAutomationFramework类,调用run()方法即可完成整个测试流程,并实现热加载功能。

四、总结

本文主要介绍了接口自动化测试框架封装项目实战中的热加载技术封装,通过Java类动态加载,实现了代码动态更新,再借助热加载线程,使代码的更新与测试用例的运行解耦合,从而达到提高效率和降低维护成本的目的。同时,我们还将热加载、测试用例管理、测试数据管理和测试报告管理封装成一个工具类,简化了接口自动化测试框架的使用方式。

在日常项目开发中,接口自动化测试框架的运用将极大地提升测试效率和测试质量,同时也为项目的质量保障奠定坚实的基础。对于接口自动化测试框架的热加载功能,将促进测试用例和业务流程的快速变化,从而大大提高了测试效率和测试覆盖率。

 作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些自动化测试前进之路的必须品,如果你用得到的话可以直接拿走,希望能对你带来帮助。(WEB自动化测试、app自动化测试、接口自动化测试、持续集成、自动化测试开发、大厂面试真题、简历模板等等),相信能使你更好的进步!

获取方式:留言【自动化测试】即可获取
【自动化测试交流】:574737577(进群备注ccc)icon-default.png?t=N4HBhttp://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=9iUWaWERff_tuvSCfW9ySVRRTSXGnIxD&authKey=R%2BGUftfEdK%2BNzoIceXf5kGkKdfDfY83a1mE%2B8azr4GYfBfh1WiKSVlU8calkgh8c&noverify=0&group_code=574737577

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/554221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cpp 类成员函数delete this 会发生什么?

如题 this 简介: 每个非静态的类成员函数默认参数都会压栈一个this&#xff0c;它指向的是调用改成员函数的对象, 也是就className的object this 被隐含声明为 className* const this&#xff1b; 1.意味着不能改变this的指向2.this是个右值,不能取地址 ,不能&this 那我…

vue实现用户动态权限登录

一、使用vueelementUI搭登录框架&#xff0c;主要就是1、2、3、4 配置&#xff1a; ①vue.config.js use strict const path require(path)function resolve(dir) {return path.join(__dirname, dir) }// All configuration item explanations can be find in https://cli.v…

想自学写个操作系统,有哪些推荐看的书籍?

前言 哈喽&#xff0c;我是子牙&#xff0c;一个很卷的硬核男人。喜欢研究底层&#xff0c;聚焦做那些大家想学没地方学的课程&#xff1a;手写操作系统、手写虚拟机、手写编程语言… 今天我们将站在一个自学者的角度来聊聊如何实现自己的操作系统。并为大家推荐几本能够帮助你…

Ubuntu20.04配置静态IP地址,开启远程连接

本文操作演示为windows系统使用虚拟机安装的ubuntu系统进行&#xff1a;操作系统为ubuntu20.04&#xff0c;VMware15.5.0 build-14665864&#xff0c;内容分为两部分&#xff0c;第一部分为配置ubuntu系统的静态ip地址&#xff0c;第二部分内容为修改配置开启远程连接功能 一、…

第16章_变量、流程控制与游标

第16章_变量、流程控制与游标 1. 变量 在MySQL数据库的存储过程和函数中&#xff0c;可以使用变量来存储查询或计算的中间结果数据&#xff0c;或者输出最终的结果数据。 在 MySQL 数据库中&#xff0c;变量分为系统变量以及用户自定义变量。 1.1 系统变量 1.1.1 系统变量分…

Ansys Lumerical | 对铁电波导调制器进行仿真应用

说明 在本例中&#xff0c;我们仿真了使用BaTiO2的铁电波导调制器&#xff0c;BaTiO2是一种折射率因外加电场而发生变化的材料。该器件的结构基于文献[1]。我们模拟并分析了给定工作频率下波导调制器的有效折射率与电压的关系。 背景 铁电波导由硅层和玻璃衬底上的BiTiO3&#…

《实战大数据》书评

前言 首先感谢 CSDN 社区图书馆 举办的“图书活动第四期”&#xff0c;让我获得了“《实战大数据——分布式大数据分析处理系统开发与应用》”这本书。收到此书之后&#xff0c;对里面的内容非常感兴趣&#xff0c;同时也充满的未知的期待。 当今时代&#xff0c;物联网、大数据…

第四章 数学知识

第四章 数学知识 初等数论二&#xff1a;https://www.acwing.com/blog/content/26394/ 质数 试除法判定质数 bool is_prime(int x) {if (x < 2) return false;for (int i 2; i < x / i; i )if (x % i 0)return false;return true; }试除法分解质因数 void divide…

第四十八天学习记录:工作相关:Qt resizeEvent 的诡异问题

今天&#xff0c;在做一个新项目时&#xff0c;发现一个诡异的问题。 在软件初次打开的时候&#xff0c;会调用一次resizeEvent(QResizeEvent *sizechangeevent)函数来对主界面控件大小以及位置进行一次调整。 但由于窗口在设计的时候用的一个大小&#xff0c;而在打开软件后…

基于全志D1-H的Tina Linux SPI主从通信验证实录

本文转载自&#xff1a;https://bbs.aw-ol.com/topic/3031 作者 whycan矿工-小叶 背景 主控: D1H板卡: 两块哪吒开发板(以下简称为主机, 从机)操作系统: Tina Linux 2.0 问题 验证D1H芯片SPI主从机通信. 硬件接线 主机SPI从机SPI19SPI1_MOSISPI1_MOSI1921SPI1_MISOSPI1_M…

Git切换用户;Git提交之后是别人的用户怎么办?

Git切换用户 前言解决方法1.删除计算机凭证2.Idea控制台切换 前言 前几天在入职之后&#xff0c;公司的电脑上仍然储存了之前用户的信息&#xff0c;比如git。 我在创建分支、提交代码的时候会遇到这样的问题&#xff1a; 登录的是我自己的账号&#xff0c;但是在git动态里缺…

借助TeeChart图表控件,创建本地静态、实时浏览器图表

Steema是全球领先的图表类控件公司&#xff0c;总部设在西班牙的巴塞罗那附近&#xff0c;Steema公司的VCL图表报表控件在全球拥有极高知名度。TeeChart可以在微软的Visual Studio、Office和.NET以及Java和PHP开发平台中使用&#xff0c;也可以作为本地Javascript-HTML5使用。 …

Python新手怎么兼职,用Python在家兼职赚钱的4个方法

随着人工智能技术的发展&#xff0c;各行各业都在发生着变化&#xff0c;每天AI&#xff08;人工智能&#xff09;新技术都在冲击着各行各业&#xff0c;比如WPS的智能设计、阿里的鲁班等等&#xff0c;总有一种干死干活不如早点掌握新技能的感觉&#xff0c;避免心中的小慌张。…

DAY 65 mysql的高可用之MHA集群

MHA概述 什么是 MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点故障的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换…

基于原子化思想的 Vue3 组件库 UnoCSS UI

UnoCSS UI 项目地址前言Monorepo 项目架构UnoCSS UI 的模块设计PNPM Monorepo 常用操作: --filter, -wMonorepo 中的依赖管理项目整体结构 基于原子化 CSS 的组件封装方式原子化 CSS 基础原子化 VS 内联样式原子化 VS class 原子化对组件封装的影响unocss-ui/components 项目结…

HashTable 在蚂蚁转化归因中的极致运用

作者&#xff1a;开七 蚂蚁集团数据技术专家 本文围绕 hash cluster 表运用及 Shuffle 过程原理进行讨论&#xff0c;欢迎各位开发者加入大数据计算 MaxCompute 社区&#xff1a;https://developer.aliyun.com/group/maxcompute 概述 蚂蚁的转化归因在初期运行两个多小时的情况…

Facebook拆分的深度思考:社交媒体真的是必需品吗?

在当今数字化时代&#xff0c;社交媒体已经成为我们日常生活中不可或缺的一部分。而Facebook作为其中的巨头之一&#xff0c;不可否认地对人们的社交行为和信息传播产生了巨大的影响。 然而&#xff0c;随着越来越多的争议和讨论浮出水面&#xff0c;我们有必要进行深入思考&a…

文档处理新探究成果——前沿技术CCIG文档图像智能分析论坛分享

目录 前言 一、文档分析与识别最新研究 二、视觉-语言预训练模型及迁移学习 三、篡改文本图像的生成与检测技术 四、智能文档处理技术在工业界的应用与挑战 总结 前言 图文智能处理前沿技术一直是我所关注的技术&#xff0c;尤其在现在集成多态大模型的基础之上&#xff0…

关于PCBA元器件布局的重要性

SMT贴片加工逐步往高密度、细间距的设计发展&#xff0c;元器件的最小间距设计&#xff0c;需考虑SMT厂家的经验和工艺完善程度。元器件最小间距的设计&#xff0c;除了保证SMT焊盘间安全距离外&#xff0c;还应考虑元器件的可维护性。 器件布局时保证安全间距 1、安全距离跟…

设计模式-简单例子理解适配器模式、装饰器模式

文章目录 一、适配器模式1. 要点2. Demo 二、装饰器模式1. 要点2. Demo 三、区别 本文参考&#xff1a; 基本原理&#xff1a;装饰器模式 | 菜鸟教程 (runoob.com) 基本原理&#xff1a;适配器模式 | 菜鸟教程 (runoob.com) 优缺点和区别&#xff0c;装饰模式&#xff1a;适配器…