自动化测试5年经验,分享一些心得
自动化测试介绍
自动化测试(Automated Testing),是指把以人为驱动的测试行为转化为机器执行的过程。实际上自动化测试往往通过一些测试工具或框架,编写自动化测试用例,来模拟手工测试过程。比如说,在项目迭代过程中,持续的回归测试是一项非常枯燥且重复的任务,并且测试人员在每天重复劳动的工作之下,也丝毫得不到成长。此时开展自动化测试就能够帮助测试人员从重复、枯燥的手工测试中解放出来,提高测试效率,缩短回归测试时间。一般来说,自动化测试通常都会跟持续集成系统(比如Jenkins)配合使用。
但在自动化实践过程中,往往会发现理想和现实之间的差距很大。自动化测试的劣势,主要体现在以下几方面:
- 相对手工测试,自动化测试对测试人员的要求相对较高;
- 测试用例需要根据版本迭代进行更新,有一定维护成本;
- 不能指望自动化测试去发现更多新的BUG,自动化测试能发现的缺陷远远比手工测试少;
- 自动化测试的产出价值往往在于长期的回归测试,短期内发挥的作用可能不明显;
希望借助自动化流程解决的问题
- 测试时间紧张,手工测试可能覆盖不全,容易错过某些边界情况;
- 模块间强耦合时,单纯从页面进行测试时,比较难深入的发现问题;
- 回归测试时,需要投入较大的人力/工时;
- 实现手工测试无法达成的测试任务;
- 通过编写测试用例,加深对业务/数据的认知,有助于下阶段迭代中发现隐藏的问题;
引入自动化测试的前提条件
项目周期长,需求变动不频繁
测试用例的稳定性决定了自动化测试的维护成本。如果软件需求变动过于频繁,测试人员需要根据变动的需求来更新测试用例以及相关的测试脚本,而脚本的维护本身就是一个代码开发的过程,需要修改、调试。如果所花费的成本不低于利用其节省的测试成本,那么自动化测试便是失败的。
项目中的某些模块相对稳定,而某些模块需求变动性很大。我们便可对相对稳定的模块进行自动化测试,而变动较大的仍是用手工测试。
自动化测试脚本可重复使用
如果费尽心思开发了一套近乎完美的自动化测试脚本,但是脚本的重复使用率很低,致使其间所耗费的成本大于所创造的经济价值,自动化测试便毫无意义。
测试任务手工测试难以实现
比如压力测试,大数据或者大量重复数据测试,必须有自动化工具的支持。
做自动化测试需要具备的能力
- 拥有编码能力
至少要熟悉自动化工具/框架的代码语言,最好有一定的编码能力,同时代码逻辑要清晰,否则不仅不能保证用例的逻辑性、业务性与健壮性等要素,也不能保证效率; - 熟悉被测系统;
熟悉被测系统对任何测试人员来说都是最起码的要求; - 掌握一个自动化测试框架/工具;
可以根据所掌握的代码,学习一门自动化测试的框架,如 Selenium/Appoum/Robot Framework/Nunit/TestNG等; - 不断学习,善于学习,知其然知其所以然;
“落后就要挨打。”
自动化用例一般在哪个阶段完成
一般落后于新功能的手工测试阶段,可以在手工用例执行完成或功能上线后,再去补充自动化的用例。
自动化不是跟着新需求走,而是测变化的东西对不变东西的影响,一定不要做为了自动化而自动化的工作。
分层自动化测试
在理解分层自动化之前,我们先看一下经典的测试金字塔。
-
UI层:界面自动化测试。可以看出它的价值最小,它最接近用户真实场景,也容易发现问题,但它的实现成本最高且太容易受外部依赖,容易影响脚本成功率。总体来说,适当的界面自动化测试是有必要的,但是没有必要在UI层投入太多;
-
Service层:接口自动化测试。它的价值居中,覆盖大多数主要的接口是比较合适的。这一层要求测试人员对系统的结构和系统间的调度非常清楚,同时要了解接口逻辑关系,否则接口测试代码很容易遗漏一些异常场景;
-
Unit层:单元测试。最有价值的测试,但是对测试人员要求比较高,一般由开发人员完成,否则只能采用结对编程。
通常来说,手工测试是最基本的,可以做到接近100%,而对于自动化测试来说,它更像是一件"防弹衣",用来防护身体的主要部位。有人认为自动化率提高了,就可以节省人力,这实际是非常片面的,因为提高自动化率,意味着需要投入更大的人力在维护的成本上。因为系统的需求是在不断变化的,每一个变化都会导致自动化测试用例需要更新调整。所以,自动化测试做到什么样才算好,也要结合上面的测试金字塔来分析。对于UI层面的自动化测试,保证少量必要的主流程即可,切勿在这一层面将自动化测试的"防弹衣"变成臃肿的"宇航服";Service层面的接口自动化测试,可以考虑覆盖大部分的流程;Unit层面的单测,做到100%是最好的,即使有需求变化,一般也很少影响到已有的用例。一般来说,单元测试可以发现80%的缺陷。
设计自动化用例的原则
基本原则
- 自动化测试用例的范围必须是相对核心的业务流程,即覆盖主体功能的核心测试点和重复执行率较高的模块;
- 在测试脚本和被测代码都保持不变的情况下,测试用例的结果应该是稳定的,这一点非常重要;
- 除非是必要的情况,否则任何用例都应当避免做持久化的操作,以保证环境始终是干净的;
- Once Written, Run Anytime as Desired ;
- 不是所有的手工测试用例都可以使用自动化测试来实现,自动化测试替代不了手工测试,两者的有效结合是保证项目质量的关键。
- 回归测试场景中,测试用例的选择一般以正向为主,逆向为辅;
用例设计原则
保持Case的独立性
通常来说,一个Test Suite下包含了一组相近的或者有关联的Test Cases。而每一个 Test Case 应该只测试一种场景,根据case复杂程度,不同场景同样可大可,可以是某个单元的测试,也可以是端到端的测试(E2E),当然也有特殊的写法比如工作流测试和数据驱动。
Case的独立性有哪些需要关注的点呢?
首先Test Suite内的Cases在执行时不应该相互影响,意思是说当我们有随机的跑其中某个Case或乱序的跑这些Cases时,测试的结果都应该是准确的。Suite level和Directory level同样要注意独立性的问题。系统较为庞杂时,可能会将数百上千的Cases放在一起跑,Robot本身不会规定Case执行的顺序,所以从某种程度上来说同一层级的Cases是随机执行的。很典型的情况就是,测试用例在本地调试时怎么跑怎么过,放到Server上所有Cases一起跑的时候就会Fail,还可能是偶发的,这种情况下就很可能是由于其他Case的痕迹影响到了它,查找问题的根源往往比较耗时。
保持Case的可迁移性
Case的可迁移性主要考虑三点 : Case对执行环境的依赖 ; Case对外部设备的依赖;Case对测试对象的依赖。
Case对执行环境的依赖
尽量减少对执行环境的依赖。举一个例子,你在本地PC上使用rf框架编写、调试用例后,上传到Git,然后你的领导可能会拉取你的用例在他的本地运行,随后又被部署到持续集成服务器上。所以你编写的用例时就要尽量避免使用不同平台的库或者shell命令。
再举个例子,如果你因为业务需要而修改了测试库源码的话,此时不管是组内其他人还是CI服务器,肯定都会运行失败,这种情况该怎么解决呢?这里提供两个解决方法:
- 将修改后的库做成测试库,上传到Git或者Pypi,对方可以通过pip安装更新;
- 使用robotremoteserver做一个共享库放在远程主机上,具体的不多做介绍;
Case对外部设备的依赖
有时为了业务测试需要,我们会引入一些外部设备来辅助测试,外部设备可能会持续升级或者更换,在编写用例时我们就需要考虑如何用一套Case更好的兼容这些测试设备。比如可以将外部设备的操作从测试用例中抽离出去,封装成测试库或关键字;
Case对测试对象的依赖
如果测试对象是一个软件平台,软件平台通常需要适配多种的设备,而设备的硬件配置可能是多种多样的:CPU、内存、组件的性能和数量都可能不同。对测试对象的依赖不仅要考虑在不同设备上的可执行性,重点还要考虑测试覆盖率。由于设备组件的增多你的用例可能无法覆盖到这些组件,或者捕捉不到某个性能瓶颈,这样测试结果的可靠性也大打折扣。
提升Case执行效率
不同的case执行时间相距甚远,短则数秒长则持续数天。数秒钟的简单功能测试用例和耗时数天的稳定性测试用例本身是没有什么可比性的。但是我当我们放眼某一个或者某一组case时,我们就需要重视Case的执行效率。不论是敏捷流程还是持续集成都讲究快速的反馈,开发人员能在提交代码后快速的获得测试结果反馈,测试人员能在最短的时间内执行更大范围的测试覆盖,不仅能提高团队的工作效率,也可增强团队的信心。
以使用rf为例,在编写用例时可以通过以下方面来提高用例的执行效率。
1.如果有对执行条件的检查,若检查失败,则尽快退出执行;
2.将数据准备或环境清除等工作抽取成关键字放到更高的层级中,,抽取时可能需要做一些组合, 但不允许出现重复的建删操作;
3. 用例中尽量少的出现sleep,建议用"wait until ..."来代替;
4. 可以采用并发执行用例的方法来提升效;
自动化用例编写规范
命名规范
Keyword命名
第一个单词应以小写字母作为开头,后面的单词则用大写字母开头。 如:getProjectId, connectDB
常量命名
常量的名字应该都使用大写字母,并且指出该常量完整含义。如果一个常量名称由多个单词组成,则应该用下划线来分割这些单词。 如:MAX_CHAR_LENGTH
参数命名
参数的命名规范和方法的命名规范相同,请在尽量保证参数名称为一个单词的情况下使参数的命名尽可能明确。如:${account} , ${investorName}
使用Tags
RF提供了通过在Settings中设置tags来管理用例的方法。Tag的应用非常的广泛和灵活,比如可以用来做用例筛选、版本管理、统计策略等。
怎么打tag看起来会更便捷?
- 可以在各个文件夹下打文件夹名字的tag,这样就可以根据tag单独的跑该文件夹下的用例,查看测试报告也更好看些;
- 在一些重要的用例上打上tag,可以单独跑关键用例;
- 某些用例如果不想执行,可以打上tag,设置不执行。
image
让case具有文档性
在考虑Coding Style时我们可以设置一些固定的规则,大家只要按照这个规则来做,实践几次之后Coding Style就会趋于统一. 而考虑将Case写的如同文档一般则需要更多的主观能动性。
敏捷开发(Agile Development)在国内的发展已经越完善,伴随之而来的便是敏捷测试(Agile Testing)。敏捷思想强调以人为核心,在整个开发流程中,只写有必要的文档或尽量少写文档,这也是它与传统的瀑布模型的差别。
为了不造成误解,这里有必要插入的说一下敏捷测试的几个特点:
- 敏捷测试应该是敏捷开发的一部分;
- 敏捷测试具有鲜明的敏捷开发的特征,如测试驱动开发(TDD),验收测试驱动开发(ATDD)。也就是说,单元测试是敏捷测试的基础,如果没有足够的单元测试,就无法应对将来需求的快速迭代,也无法实现快速而稳定的持续交付;
- 优秀的敏捷测试是基于自动化测试的;
- 敏捷测试无时不在,无处不在。
需求设计不断的更新,而文档往往不能被很及时的更新,那这样的话怎么才能让测试人员如何快速的掌握某个功能或者产品的需求和当前状态呢?
"Tests as Documentation."
清晰易懂的用例名
在实际的工程中,我们可能会新建一个目录来存储测试点相近的测试用例。每一个Case都对应一个测试点,而用例名则应该概括总结对应测试点的核心内容,这样当我们在浏览一组用例时,仅仅通过用例名就能大致了解里面的测试内容,也方便寻找某个Case。
清晰易懂的用例名
在实际的工程中,我们可能会新建一个目录来存储测试点相近的测试用例。每一个Case都对应一个测试点,而用例名则应该概括总结对应测试点的核心内容,这样当我们在浏览一组用例时,仅仅通过用例名就能大致了解里面的测试内容,也方便寻找某个Case。
自动化测试【Requests接口自动化测试实战】
相关文章:

自动化测试5年经验,分享一些心得
自动化测试介绍 自动化测试(Automated Testing),是指把以人为驱动的测试行为转化为机器执行的过程。实际上自动化测试往往通过一些测试工具或框架,编写自动化测试用例,来模拟手工测试过程。比如说,在项目迭代过程中,持…...

independentsoft.de/MSG .NET Framework Crack
MSG .NET 是用于 .NET Framework / .NET Core 的 Microsoft Outlook .msg 文件 API。API 允许您轻松创建/读取/解析/转换 .msg 文件等。API 不需要在机器上安装 Microsoft Outlook 或任何其他第三方应用程序或库即可工作。 以下示例向您展示了如何打开现有文件并显示消息的某些…...

基于Transformer的NLP处理管线
HuggingFace transformers 是一个整合了跨语言、视觉、音频和多模式模态与最先进的预训练模型并且提供用户友好的 API 的AI开发库。 它由 170 多个预训练模型组成,支持 PyTorch、TensorFlow 和 JAX 等框架,能够在代码之间进行互操作。 这个库还易于部署&…...

二叉树OJ(一)二叉树的最大深度 二叉搜索树与双向链表 对称的二叉树
二叉树的最大深度 二叉树中和为某一值的路径(一) 二叉搜索树与双向链表 对称的二叉树 二叉树的最大深度 描述 求给定二叉树的最大深度, 深度是指树的根节点到任一叶子节点路径上节点的数量。 最大深度是所有叶子节点的深度的最大值。 (注:…...

使用Fairseq进行Bart预训练
文章目录前言环境流程介绍数据部分分词部分预处理部分训练部分遇到的问题问题1可能遇到的问题问题1问题2前言 本文是使用 fairseq 做 Bart 预训练任务的踩坑记录huggingface没有提供 Bart 预训练的代码 facebookresearch/fairseq: Facebook AI Research Sequence-to-Sequence…...

n阶数字回转方阵 ← 模拟法
【问题描述】 请编程输出如下数字回旋方阵。 【算法代码】 #include <bits/stdc.h> using namespace std;const int maxn100; int z[maxn][maxn];void matrix(int n) {int num2;z[0][0]1;int i0,j1;while(i<n && j<n) {while(i<j) z[i][j]num;while(j&…...
【人工智能AI】二、NoSQL 基础知识《NoSQL 企业级基础入门与进阶实战》
写一篇介绍 NoSQL 基础知识的技术文章,分5个章节,每个章节细分到3级目录,重点介绍一下NoSQL 数据模型,NoSQL 数据库架构,NoSQL 数据库特性等,不少于2000字。 NoSQL 基础知识 NoSQL(Not Only SQ…...
Camera Rolling Shutter和Global Shutter的区别
卷帘快门(Rolling Shutter)与全局快门(Global Shutter)的区别 什么是快门 快门是照相机用来控制感光片有效曝光时间的机构。 快门是照相机的一个重要组成部分,它的结构、形式及功能是衡量照相机档次的一个重要因素。 …...
模版之AnyType
title: 模版之AnyType date: 2023-02-19 21:49:53 permalink: /pages/54a0bf/ categories: 通用领域编程语言C tags:C元编程 author: name: zhengzhibing link: https://azmddy.top/pages/54a0bf/ 模版之AnyType 在研究C的编译期反射时,发现了AnyType很有意思。 首…...

【汇编】一、环境搭建(一只 Assember 的成长史)
嗨~你好呀! 我是一名初二学生,热爱计算机,码龄两年。最近开始学习汇编,希望通过 Blog 的形式记录下自己的学习过程,也和更多人分享。 这篇文章主要讲述汇编环境的搭建过程。 话不多说~我们开始吧! 系统环…...
【博客628】k8s pod访问集群外域名原理以及主机开启了systemd-resolved的不同情况
k8s pod访问集群外域名原理以及使用了systemd-resolved的不同情况 1、不同情况下的linux主机访问外部域名原理 没有使用systemd-resolved的linux主机上访问外部域名一般是按照以下步骤来的: 从dns缓存里查找域名与ip的映射关系 从/etc/hosts里查找域名与ip的映射…...

测试3.测试方法的分类
3.测试分类 系统测试包括回归测试和冒烟测试 回归测试:修改了旧的代码后,重新测试功能是否正确,有没有引入新的错误或导致其它代码产生错误 冒烟测试:目的是确认软件基本功能正常,可以进行后续的正式测试工作 按是否…...

Android 基础知识4-2.9 FrameLayout(帧布局)详解
一、FrameLayout(帧布局)概述 FrameLayout又称作帧布局,它相比于LinearLayout和RelativeLayout要简单很多,因为它的应用场景也少了很多。这种布局没有方便的定位方式,所有的控件都会默认摆放在布局的左上角。 示例1代…...
Go语言xorm框架
xorm xorm是一个简单而强大的Go语言ORM库通过它可以使数据库操作非常简便。 官网: https://xorm.io/ 中文文档: https://gitea.com/xorm/xorm/src/branch/master/README_CN.md 特性 支持 Struct 和数据库表之间的灵活映射,并支持自动同步事务支持同时支持原始SQL…...

19_微信小程序之优雅实现侧滑菜单
19_微信小程序之优雅实现侧滑菜单一.先上效果图 要实现这样一个效果,布局其实很简单,整体布局是一个横向滚动的scroll-view,难点在于怎么控制侧滑菜单的回弹,以及寻找回弹的边界条件? 此篇文章主要是基于uni-app来实现的…...
JSP中JDBC与javaBean学习笔记
本博文源于博主偷偷复习期末的java web,博文主要讲述JDBC API与JavaBean,涉及driver,driver Manager\connection、statement接口、PreparedStatement接口、ResultSet接口,JavaBean包含一些标记介绍。 1.JDBC API JDBC由一组接口和类组成&am…...
编译Android系统源码推荐的电脑配置
工欲善其事,必先利其器。 看到很多客户,搞Android产品开发,用的电脑配置是惨不忍睹。 这些老板脑子有坑吗... ------------ 编译Android9推荐电脑配置: 处理器:酷睿i7 5代系列 8线程以上 内存: 8GB以上…...

加油站会员管理小程序实战开发教程10
上一篇我们介绍了计算距离及到店导航的功能,本篇我们介绍一下今日油价的功能。 如果要按日显示最新的数据,那么我们首先需要有数据源来存放每日的油价数据。这里涉及数据源的时候要考虑你的数据是只录入一条,还是每日录入一条。 录入一条呢,比较简单,但有个问题是如果我…...
shell编程之条件判断和流程控制
typora-copy-images-to: pictures typora-root-url: …\pictures 文章目录typora-copy-images-to: pictures typora-root-url: ..\..\pictures本节课程目标一、条件判断语法结构2. 条件判断相关参数㈠ 判断文件类型㈡ 判断文件权限㈢ 判断文件新旧㈣ 判断整数㈤ 判断字符串㈥ 多…...
第一次接触jquery
文章目录一.关于jqurey二.什么是jqurey三.上课实例1.表格 2.鼠标移动效果 3隐藏和显示效果代码如下注意一.关于jqurey 简而言之:jQuery 是一个 JavaScript 库。 jQuery 极大地简化了 JavaScript 编程。 二.什么是jqurey jQuery 是一个 JavaScript 函数库。 jQu…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...

通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...