一篇文章带你了解自动化测试开发

news2024/9/25 17:13:24

都讲自动化测试开发,当然要把开发自动化测试框架也当做一个项目来做。这时候,就需要考虑应该选择何种类型的自动化测试框架:数据驱动、关键字驱动、还是Junit ,TestNG ? 抑或直接利用现有的开源自动化测试框架,如Robot Framework 。无法讲这几种类型的框架,孰优孰劣,关键是认清项目实际,选择最适合的。讲一些题外话,就Java学习者而言,Junit3.x的源码是再好不过的教材了,JUnit框架运用到了大量的设计模式,反射机制。

在决定了选用何种自动化框架类型后,下面你需要抉择的就是:应该选择何种编程语言呢?编程语言的选择和开发者的技术背景有很大关系,一般都会选择自己熟悉的编程语言,但这也往往是个局限。另一方面,也受到SUT的影响。一般而言,很少见有选择C,C++作为自动化框架开发语言的,虽然这两种语言的执行效率要高,但开发效率要低一些。我们项目的自动化框架是Java语言编写的,关键字也是由Java实现的。关键字的实现选择Java,是由于SUT - 即Domino服务器提供的API是有Java ,C++。所以自然选择了Java。而自动化框架开发语言的选择,其实可以有别的选择,如脚本语言Python ,Perl。脚本语言Python,或Perl,作为超高级开发语言,解释执行的特性,在开发效率上可能会高一点。

下面就是关键字实现方式的选择了。关键字就相当于手动执行测试用例当中的一个步骤,比如现在的项目,即一个关键字就是修改产品的一个配置选项,也可以是发一封带有特定附件的邮件。就我们的产品而言,Domino提供的操作数据库的方式有三种,即DIIOP、Web Services和本地调用。刚开始选择的是DIIOP,这种方式实现起来比较简单,后来发现通过这种方式实现的自动化脚本,即包含十几个关键字脚本,其执行时间大概要35s – 40s。而Web Services的执行时间就要效率就要高得多,差不多一个自动化脚本的执行时间可以缩短10s, 但其实现需要分为服务器端Web Service的发布,和客户端的调用,通过这种方式实现,测试环境的部署也要复杂些。讲这些,主要是告诉我们,一开始就需要对这些做出评估,选择合适的方案,不然中途改变,影响是很大的。

自动化框架,说白了就是流程的封装啦。那么一个自动化框架应该包括哪些流程呢?来看看下面这两幅框架图吧。

第一幅图讲解了一套自动化测试是由自动化框架,自动化脚本,关键字组成的。第二幅图描述了自动化框架的流程:根据配置挑选要执行的测试用例,解析自动化执行脚本,将自动化执行脚本送给自动化执行引擎,生成Log文件,最后生成Report。

对比Robot Framework框架,这套简单的自动化框架有哪些地方可以提高呢?第一个,基于Test Suit的setup和teardown。一个自动化脚本的组成是这样的:清理、初始化测试环境(如,建立一些测试脚本需要用到的数据库), 执行自动化脚本,生成执行结果,最后清空环境。这些步骤我们的自动化脚本中也实现的,但如果想在执行一批测试用例之前,做一些动作,执行完以后,在清空,我们用得方式就是把这些自动化脚本的名字在要执行的一批测试脚本之前,我们的脚本是按字母排序的,这样确保的。其实应该有更好的方式。第二个,自动化脚本中有关键字Fail了,是否还需要接着执行下面的关键字呢。我们框架式会继续执行,但Robot Framework做到了可配置,它是通过listern来实现的。可以好好学习下。

自动化框架、关键字的开发周期怎么安排,怎么预估effort ? 项目自动化测试框架,自动化脚本开发也分成了两Iteration。 第一个迭代期间,完成自动化框架主要流程,完成主要关键字,构建SMOKE部分的自动化脚本。第二次迭代,进一步完善自动化框架,接着添加关键字,完成Regression部分自动化脚本。刚开始,effort的估计没有把握,因为有些关键字的实现可能比较困难,这时候需要及时sync风险。第二个阶段,effort的估计就有底了。

如何协同开发?自然是加入版本控制。现在的自动化框架用的版本控制是Git,这个比较火哦!多人协同开发,提交代码,肯定会有conflict。我们的做法是这样的,除了master分支,每个人在自己本地建个开发分支,每次提交代码前,先从Git Server上checkout最新代码到master分支,然后,在本地的开发分支和master分支merge,最后commit代码。

自动化脚本如何命名?我们的自动化脚本都是从手动测试用例挑选出来的,我们希望做到自动化脚本和手动脚本之间有个关联,但同时又要做到,只要看到这个自动化脚本的Title,就能知道这个自动化脚本的大概的测试意图。我们是这样做的,ModuleName_FilterName+ID, 这个ID便是手动测试用例的Define ID。

Keyword的粒度怎么把握?关键字相当于手动执行的一个执行步骤,我们是这样做的,首先Review手动执行的测试用例,抽取出通用的步骤,实现关键字。但如果关键字的粒度做得太细,那么关键字的数量会比较庞大,但粗了的话,关键字参数的形式就会比较复杂,对于构造自动化脚本的同事来说,就需要学习。这个粒度需要把握好,同时,对于自动化关键字参数,需要有详尽注释,使用格式范例。

自动化脚本中的变量如何维护?一般会把自动化脚本中的一些跟执行环境相关的参数以变量的形式抽取出来,存放在配置文件里,这样一来,在部署自动化测试环境的时候,就只需要修改这些跟环境相关的配置文件即可以。但这个配置文件会随着自动化测试用例的增加,而变得臃肿。

自动化脚本中运行结果如何判断?自动化测试脚本,如同手动执行测试用例一般,也有预期结果,实际结果的比对,如果两则不一致,则认为这个自动化脚本Fail。刚开始我们是这样做的,将预期结果一参数的形式传给一个关键字,这个关键字在后台会比较实际结果,如果不一致fail。刚开始也觉得没问题,后来发现,因为环境因素,一些预期结果是会发生变化的,这时候,我们必须修改自动化脚本。后来的做法是这样的,先dump出一份预期结果,存放在本地,执行自动化自动化脚本的时候,再Dump出一份实际结果,然后比对这二者。这样就避免了频繁改动自动化执行脚本了。

执行结果的容错性?如何确保执行结果是可靠的,在自动化关键字的实现过程中,会加入一些容错机制。举个简单的例子,发一封带特性附件的邮件,命中了一个策略。这时候,会在log数据库中产生一条记录。在实现自动化关键字的时候,可能会遇到这样的情况,当你去检查log数据库的时候,很有可能那条log记录还没生成好,这时候如果直接判断,自然会fail。我们是怎么提高容错性的呢?很简单的方法,就是加入了一定时间的延时,比如循环检查多少次,每次delay一秒等方法,这就带来了另一问题,在执行时间会延长。

及时获取RD帮助。在实现DLP功能时,发现程序重新载入配置会比较耗时,如果自动化脚本不能重新载入完成,就发邮件的话,是无法命中你的配置策略的。这时候,需要寻求RD帮助,他们在后台提供了hidden key。当enable这个hidden key后,重新载入完成后,程序会在console上打印出提示信息,这时候,我们的自动化脚本只需要去检查这些提示信息有没有生成,就可以判断是否重载完成,再发邮件。

在自动化测试开发,维护过程中,成本最大的是什么?觉得一方面是测试数据的维护。另一方是因为产品功能方面的变动引入的自动化脚本需要修改方面的成本。

自动化测试的应用场景对于项目而言,最大的价值是什么?就我们项目而言,主要还是把手动测试用例变为自动化测试用例,也就是所谓的黑盒、功能性自动化实施。当初定位的时候,也是想做成自动化回归测试的,缩短回归测试时间,提高回归测试效率,确保代码优化、及新引进的代码不会影响旧有功能。也没指望自动化测试能发现手动测试发现不了的问题。理想的状态时这样的,自动化测试和CI系统集成,当出了一个新的build,自动化框架能够自动安装新build,执行自动化脚本,完了以后将执行结果通过邮件发布出来。

有没有方法把关键字的实现提前?而不是等到功能稳定后,再开始做自动化。看过Junit中的mock的概念,但具体怎么做,还不清楚,下阶段学习下!

现在看来,一套自动化测试的开发也涉及到:项目本身需求分析、hight-level 设计、框架开发、自动化脚本实现、各种规则制定、多方面协作等,所以需要把自动化测试开发当做项目来做哦!

 

B站2023年最详细的python自动化测试框架全栈测试开发技术入门到精通教程

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

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

相关文章

Mysql内核查询成本计算实战(一)

目录 Mysql内核查询成本计算实战(一) Optimizer Trace 什么是成本 I/O成本 CPU成本 单表查询的成本 MySQL查询成本计算实战 1.根据搜索条件,找出所有可能使用的索引 2. 计算全表扫描的代价 3. 计算使用不同索引执行查询的代价 4. 对…

CAD中怎么局部升降桥架?CAD局部升降操作技巧

在使用浩辰CAD电气软件绘制电气图纸的时候,常常会用到三维桥架中的一些功能来进行桥架的CAD设计工作,为了让大家对此有更深入的了解,接下来的CAD设计教程就和小编一起来看看正版CAD软件——浩辰CAD电气软件的三维桥架中局部升降功能的相关使用…

Magisk模块开发指南

BusyBox Magisk整合了功能完整的BusyBox二进制文件(包括对SELinux的完整支持)。执行文件位于/data/adb/magisk/busybox。Magisk的BusyBox支持运行时可切换的“ASH Standalone Shell Mode(ASH独立Shell模式)”。这种独立模式的意思是,在ashshell的中的BusyBox运行时,无论PATH…

MySQL核心参数优化文件my.ini详解

一.数据库服务器配置 CPU:48C 内存:128G DISK:3.2TSSD 二.CPU的优化 innodb_thread_concurrency32 表示SQL经过解析后,允许同时有32个线程去innodb引擎取数据,如果超过32个,则需要排队; 值太…

spring系列 SpringMVC-拦截器

拦截器(Interceptor)是在SpringMVC中动态拦截控制器方法的执行。 拦截器执行流程: 拦截器与过滤器区别 归属不同:Filter属于Servlet技术,Interceptor属于SpringMVC技术 拦截内容不同:Filter对所有访问进…

【Mysql第二期 MySQL环境搭建】

文章目录01.为什么要安装新版本?02.官网下载mysql03.安装配置初始化mysql04.查看 MySQL服务05.验证是否安装成功06.修改root密码07.如果有navicat工具可以在测试一下:01.为什么要安装新版本? mysql8.x版本和msyql5.x版本zip安装的方式大同小…

证券交易金融知识学习(1)

学习目标: 需要做一些关于投资交易软件的测试,需要了解操作背后的交易意义,需要学习一些金融基础知识。本人是金融证券交易的小白,从0开始学习。故记录一些金融知识学习的笔记,比较零散,目的是为了让自己复…

Spring-DI相关内容

Spring-DI相关内容 5,DI相关内容 前面我们已经完成了bean相关操作的讲解,接下来就进入第二个大的模块DI依赖注入,首先来介绍下Spring中有哪些注入方式? 我们先来思考 向一个类中传递数据的方式有几种? 普通方法(set方法)构造方法 依赖注…

【数据结构】8.4 选择排序

文章目录1. 简单选择排序简单选择排序算法简单排序算法分析2. 堆排序堆的定义堆的调整堆的建立堆排序算法堆排序算法分析1. 简单选择排序 基本思想 在待排序的数据中选出最大(小)的元素放在其最终的位置。 基本操作 首先通过 n - 1 次关键字比较&…

计算机SCI期刊能一稿多投吗? - 易智编译EaseEditing

首先建议不要一稿多投,投稿前要对目标期刊了解清楚,是什么方向,什么水平的。 可以看看期刊近期发表的文章,是什么方向的,这样会更精准。 一稿多投就是广撒网嘛,还不如做好功课,找到对应期刊&a…

网络知识详解之:HTTPS通信原理剖析(对称、非对称加密、数字签名、数字证书)

网络知识详解之:HTTPS通信原理剖析(对称、非对称加密、数字签名、数字证书) 计算机网络相关知识体系详解 网络知识详解之:TCP连接原理详解网络知识详解之:HTTP协议基础网络知识详解之:HTTPS通信原理剖析&…

Es6 扩展运算符... ,以及rest和arguments

扩展运算符... … 扩展运算符能将 数组 转换为逗号分隔的 参数序列 应用场景: 多个数组的合并 var arr4 [1, 2, 3];var arr5 [4, 5, 6];var arr6 [...arr4, ...arr5];//合并数组 也可以为数组的一部分arr6的值应为[1,2,3,4,5,6] 数组的克隆&#xff0…

C语言--指针与数组

目录指针运算(补)指针指针指针的关系运算(补)指针与数组数组名二级指针指针数组指针运算(补) 指针指针 上一篇博客我们介绍了指针运算中的三种常见运算:指针整数,指针关系运算&…

关于android studio安装篇

前言:本文安装环境为windows系统,调试环境AVD(电脑上运行的“虚拟手机”),安装android studio之前需安装jdk,配置好jdk的环境变量。解释:android运行调试环境有三种方式,真机、AVD&a…

基于uboot的truested安全启动模式进行TF-A源码移植

步骤 1. 对源码进行解压 tar -xvf tf-a-stm32mp-2.2.r2-r0.tar.gz2. 将补丁文件全打上 for p in ls -1 ../*.patch; do patch -p1 < $p; done3. 配置交叉编译工具链&#xff0c;在TF-A顶层目录下打开Makefile.sdk文件修改&#xff0c;搜索cross_compile&#xff0c;然后进…

5.组件钩子函数

目录 1 生命周期与钩子函数 2 创建时 3 更新时 3.1 执行顺序 3.2 触发条件 3.3 componentDidUpdate() 4 卸载时 1 生命周期与钩子函数 类组件从 被挂载到页面中运行&#xff0c;到组件不用时卸载 之间是组件的生命周期 只有类组件才有生命周期 生命周期的每个…

MATLAB算法实战应用案例精讲-【数模应用】概率生成模型(Generative Model)(补充篇)

前言 几个高频面试题目 非概率模型和概率模型的区别 非概率模型 非概率模型指的是直接学习输入空间到输出空间的映射h,学习的过程中基本不涉及概率密度的估计,概率密度的积分等操作,问题的关键在于最优化问题的求解。通常,为了学习假设 ,我们会先根据一些先验知识(pri…

道路千万条,安全第一条

我是腾讯安全的冯帆&#xff0c;主要在MMS安全服务团队负责交通行业保障工作。每年春节对交通行业来说都是一次考验&#xff0c;尤其是今年春运&#xff0c;也是三年来最具规模的一次“大考”。因此我们今年投入的人力&#xff0c;包括值守团队&#xff0c;也是这些年最多的一次…

Eclipse中的Classpath及【其与buildpath之间的关系】

Eclipse中的Classpath及【其与buildpath之间的关系】简介.classpath文件设置和查看方法通过eclipse设置通过Java代码设置通过eclipse菜单查看通过Java代码输出查看classpath及与buildpath之间的关系简介 Classpath .classpath文件 .classpath文件用于记录项目编译环境的所有…

第五届字节跳动青训营 前端进阶学习笔记(九)Node.js 与前端开发实战

文章目录前言Node.js的应用场景1.典型应用场景Node.js运行时结构特点Node.js实战1.搭建一个基本的http服务器2.返回json数据3.编写一个简单的静态服务器4.SSR5.调试6.部署总结前言 本堂课程重点内容&#xff1a; Node.js的应用场景Node.js的运行时结构Node.js实战 Node.js的应…