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

软件测试工程师面试如何描述自动化测试是怎么实现的?

软件测试工程师面试的时候,但凡简历中有透露一点点自己会自动化测试的技能点的描述,都会被面试官问,那你结合你的测试项目说说自动化测试是怎么实现的?一到这里,很多网友,包括我的学生,也都一脸懵逼的样子。

有心放弃吧,但是看着那么高的薪资,还是很眼热的!但是说吧,可感觉自己说的是不是太简单了,能成么?其实,大家远远不需要这么担心,因为自动化测试没有大家想的那么神秘,那么可怕,说出了本质,那就是都一样的!

自动化测试的本质:是把以人为驱动的测试行为转化为机器执行的一种过程。一般,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。自动化测试的目的是,为了节省人力、时间或硬件资源,提高测试效率。——这是百度百科中的介绍。

从上面一段文字描述中,我们能够知道自动化测试跟手工测试有着密切的关系,并且是先有手工测试,设计测试用例,再将测试过程转换为脚本语言,让计算机运行的过程。

所以,大家在在进行自动化测试的过程实现的时候,一定要根据手工测试中使用的测试用例进行设计脚本,因为自动化测试要模拟人的实际操作。下面我们以实际案例说一下自动化测试的实现过程和手工测试的关系。

案例:在QQ注册页面,对QQ的注册进行功能测试。

页面地址:https://ssl.zc.qq.com/v3/index-chs.html

确认页面中各个表单元素的需求:

1、昵称:必填;不能超过24个字母或12个汉字
2、密码:必填;8-16个字符;必须包含字母、数字、符号中至少2种
3、国家地区编码:默认+ 86
4、手机号:格式必须正确;用来接收验证码
5、验证码:输入收到的验证码
6、手机号符合要求,可以点击【发送短信验证码】;否则不可点击;
7、用户协议复选框默认处于勾选状态。

在这里插入图片描述

接下来我们设计一条测试用例:

【用例标题】各项信息填写正确,注册QQ

【测试步骤】

1)打开Firefox浏览器

2)在浏览器地址栏输入页面地址:https://ssl.zc.qq.com/v3/index-chs.html

3)在昵称文本框输入:测试小梧

4)密码框输入:TestKai2020

5)手机号码输入:13366244232(未注册过)

6)点击【发送短信验证码】按钮

7)输入收到的短信验证码:321564

8)点击【立即注册】按钮

【预期结果】

页面跳转到:注册成功页面。

(假如页面地址为:https://ssl.zc.qq.com/v3/success.html)

如果大家觉得上面没问题,能看懂,那说明我的测试用例写的还行哦!

但是这是刚刚开始,测试用例的设计就是这个样子,大家都看得懂的测试用例才是好的用例。执行就不说了,因为接下来我们要说的是如何利用自动化进行实现。

自动化测试有三点核心内容:脚本语言,对象识别,自动执行和结果判断。这不是什么名人名言,是凯哥自己说的。

首先,选脚本语言。我们就选择比较流行的Python。简单、好用、时髦。选择Python3.7版本,不高也不低,正好。

其次,做Web系统的自动化测试,我们选择对象识别机制的时候就选择Selenium(有同学可能说QTP/UFT也行,但是我想说这个Selenium不花钱)。Selenium就不介绍了。安装好Python后,直接使用pip install selenium就能装上。

最后,自动执行我们要用外部参数文件,脚本写好了,使用参数化多跑几次,总不能换一个数据(手工测试要用到等价类、边界值或者其他很多正常数据),就改一次代码吧?还有,结果得计算机通过脚本自动的判断,如果没有,那还叫什么自动化?

当我们确定好了这几个内容之后,就可以开始写代码了。(确保Python、Selenium都安装成功)。

# 导入Selenium包和time包
from selenium import webdriver
from time import sleep# 定义函数
def test_qq_reg():# 定义浏览器驱动driver = webdriver.Firefox()# 打开页面driver.get("https://ssl.zc.qq.com/v3/index-chs.html")# 休眠2秒钟sleep(2)# 在昵称文本框输入 “测试凯哥”driver.find_element_by_id("nickname").send_keys("测试凯哥")sleep(2)# 在密码文本框 输入“TestKai2020”driver.find_element_by_id("password").send_keys("TestKai2020")sleep(2)# 在手机号文本框输入  “13366244232”driver.find_element_by_id("phone").send_keys("13366244232")sleep(2)# 点击 发送短信验证码 按钮driver.find_element_by_id("send-sms").click()sleep(2)# 在短信验证码文本框输入 321234driver.find_element_by_id("code").send_keys("321234")sleep(2)# 点击 立即注册 按钮driver.find_element_by_id("get_acc").click()sleep(2)# 判断注册后页面是否跳转到 成功页(预期结果)exp_url = "https://ssl.zc.qq.com/v3/success.html"sleep(2)# 浏览器获取页面url地址real_url = driver.current_url# 判断实际结果和预期结果是否相同  相同就输出  success# 如果不同就截图保存if exp_url == real_url:print("success")else:driver.get_screenshot_as_file("./test_qq.png")# 调用函数,运行脚本
test_qq_reg()

以上内容就是把我们手工测试用例中的内容完全使用自动化脚本去实现,不要崇拜我哦!只要好好学了,都能学会!
在这里插入图片描述

但这还只是开始,刚才我们就说了,如果要改变测试数据,难道要我去改代码么?那还不如手工测试呢!接下来,我们就看看如何实现自动化脚本迭代运行。

我们使用CSV表格进行测试数据的构建和保存。
在这里插入图片描述
然后,在脚本中导入数据。下面直接看代码:

# 导入Selenium包和time包
from selenium import webdriver
from time import sleep
# 导入csv包
import csv# 定义函数
def test_qq_reg():# 读取csv中的数据(默认会以列表嵌套的形式保存数据到脚本的变量中)data = csv.reader(open('reg_qq.csv','r'))    # 定义浏览器驱动driver = webdriver.Firefox()# 使用循环获取data中的列表数据for info in data :# 定义昵称变量,获取列表中的用户名name = info[0]# 定义密码变量,获取列表中的密码passwd = info[1]# 定义手机号变量,获取列表中的手机号phone = info[2]# 定义验证码变量,获取列表中的验证码code = info[3]'''将代码中输入数据的地方都用上面的变量代替'''# 打开页面driver.get("https://ssl.zc.qq.com/v3/index-chs.html")# 休眠2秒钟sleep(2)# 在昵称文本框输入 “测试凯哥”driver.find_element_by_id("nickname").send_keys(name)sleep(2)# 在密码文本框 输入“TestKai2020”driver.find_element_by_id("password").send_keys(passwd)sleep(2)# 在手机号文本框输入  “13366244232”driver.find_element_by_id("phone").send_keys(phone)sleep(2)# 点击 发送短信验证码 按钮driver.find_element_by_id("send-sms").click()sleep(2)# 在短信验证码文本框输入 321234driver.find_element_by_id("code").send_keys(code)sleep(2)# 点击 立即注册 按钮driver.find_element_by_id("get_acc").click()sleep(2)# 判断注册后页面是否跳转到 成功页(预期结果)exp_url = "https://ssl.zc.qq.com/v3/success.html"sleep(2)# 浏览器获取页面url地址real_url = driver.current_url# 判断实际结果和预期结果是否相同  相同就输出  success# 如果不同就截图保存if exp_url == real_url:print("success")else:driver.get_screenshot_as_file("./test_qq.png")sleep(2)# 调用函数,运行脚本
test_qq_reg()

然后可能还有网友说,那用到了框架怎么办呢?我们上面的代码,没有使用任何框架,可以理解为就是个人行为,但是企业里面的代码是要统一管理的,各自写各自的,没有统一标准那怎么行啊?于是就有了unittest这样的框架,进行代码编写和组合的规范化,还有了像HTMLTestRunner这样能够生成网页版测试报告的外部库和包(也称为框架)。所以我们的代码又可以强化了:

# 导入Selenium包和time包
from selenium import webdriver
from time import sleep
# 导入csv包
import csv
# 导入unittest包
import unittest
#导入生成HTML测试报告的包
from HTMLTestRunner import HTMLTestRunner# 定义测试类,继承unittest
class QQ(unittest.TestCase):# 定义函数def test_qq_reg(self):# 读取csv中的数据(默认会以列表嵌套的形式保存数据到脚本的变量中)data = csv.reader(open('reg_qq.csv','r'))    # 定义浏览器驱动driver = webdriver.Firefox()# 使用循环获取data中的列表数据for info in data :# 定义昵称变量,获取列表中的用户名name = info[0]# 定义密码变量,获取列表中的密码passwd = info[1]# 定义手机号变量,获取列表中的手机号phone = info[2]# 定义验证码变量,获取列表中的验证码code = info[3]'''将代码中输入数据的地方都用上面的变量代替'''# 打开页面driver.get("https://ssl.zc.qq.com/v3/index-chs.html")# 休眠2秒钟sleep(2)# 在昵称文本框输入 “测试凯哥”driver.find_element_by_id("nickname").send_keys(name)sleep(2)# 在密码文本框 输入“TestKai2020”driver.find_element_by_id("password").send_keys(passwd)sleep(2)# 在手机号文本框输入  “13366244232”driver.find_element_by_id("phone").send_keys(phone)sleep(2)# 点击 发送短信验证码 按钮driver.find_element_by_id("send-sms").click()sleep(2)# 在短信验证码文本框输入 321234driver.find_element_by_id("code").send_keys(code)sleep(2)# 点击 立即注册 按钮driver.find_element_by_id("get_acc").click()sleep(2)# 判断注册后页面是否跳转到 成功页(预期结果)exp_url = "https://ssl.zc.qq.com/v3/success.html"sleep(2)# 浏览器获取页面url地址real_url = driver.current_url# 判断实际结果和预期结果是否相同  相同就输出  success# 如果不同就截图保存if exp_url == real_url:print("success")else:driver.get_screenshot_as_file("./test_qq.png")sleep(2)#生成单元测试流程
testunit = unittest.TestSuite()
#加载测试用例,可以把多人的测试用例导入进来,放在一起:
testunit.addTest(QQ("test_qq_reg"))
#创建测试报告
fp=open('./result.html','wb')
runner = HTMLTestRunner(stream=fp,title="QQ注册测试",description="用例执行情况:")
runner.run(testunit)
fp.close()

好看到这里,希望能够消除大家对自动化测试实现过程的恐惧,真的没有那么多难点!如果大家还有什么疑惑,可以找我深入沟通和交流哦!

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:【文末领取】


              【下面是我整理的2023年最全的软件测试工程师学习知识架构体系图】


一、Python编程入门到精通

二、接口自动化项目实战  

三、Web自动化项目实战


四、App自动化项目实战  

五、一线大厂简历


六、测试开发DevOps体系  

七、常用自动化测试工具

八、JMeter性能测试  

九、总结(文末尾部小惊喜)

生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!

生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!

只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!

 

相关文章:

软件测试工程师面试如何描述自动化测试是怎么实现的?

软件测试工程师面试的时候,但凡简历中有透露一点点自己会自动化测试的技能点的描述,都会被面试官问,那你结合你的测试项目说说自动化测试是怎么实现的?一到这里,很多网友,包括我的学生,也都一脸…...

Qt5兼容使用之前Qt4接口 intersect接口

1. 问题 项目卡中遇到编译报错, 错误 C2039 “intersect”: 不是“QRect”的成员 。 2. 排查过程 排查到依赖的第三方代码,使用 intersect 接口, 跟踪排查到头文件中使用了***#if QT_DEPRECATED_SINCE(5, 0)*** #if QT_DEPRECATED_SINCE…...

【云原生】Kubernetes节点亲和性分配 Pod

目录 1 给节点添加标签 2 根据选择节点标签指派 pod 到指定节点[nodeSelector] 3 根据节点名称指派 pod 到指定节点[nodeName] 4 根据 亲和性和反亲和性 指派 pod 到指定节点 5 节点亲和性权重 6 pod 间亲和性和反亲和性及权重 7 污点和容忍度 8 Pod 拓扑分布约束 官方…...

【Essential C++课后练习】纯代码(更新中)

文章目录 第一章 C编程基础1.41.51.61.71.8 第二章 面向过程的编程风格2.12.22.32.42.52.6 第一章 C编程基础 1.4 /*********************************************************************说明:试着扩充这个程序的内容:(1)要求用户同时输…...

C#仿热血江湖GClass

目录 1 C#仿热血江湖GClass 1.1 GClass32 1.2 method_4 1.3 smethod_0 C#仿热血江湖GClass public class GClass32 { private byte[] byte_0;...

[SQL智慧航行者] - 用户购买商品推荐

话不多说, 先看数据表信息. 数据表信息: employee 表, 包含所有员工信息, 每个员工有其对应的 id, salary 和 departmentid. --------------------------------- | id | name | salary | departmentid | --------------------------------- | 1 | Joe | 70000 | 1 …...

Idea配置Scala开发环境

1.首先安装scala插件: File--->Setting---->plugins,在输入框中输入scala,然后点击“Install”即可安装scala,需要稍微等待几分钟。 2 创建项目: File ---->new---->project-----Maven--->Next----输入名称(test…...

LT8711UXD 是一款高性能双通道 Type-C/DP1.4 至 HDMI2.0 转换器

LT8711UXD 1.描述 LT8711UXD是一款高性能的双车道TypeC/DP1.4到HDMI2.0转换器,设计用于将USB Type-C源或DP1.4源连接到HDMI2.0接收器。LT8711UXD集成了一个DP1.4兼容的接收机,和一个HDMI2.0兼容的发射机。此外,还包括两个CC控制器&#xff0…...

Android APK体积优化(瘦身)

1、基础知识: 1.1 apk结构 lib :存放so文件,对应不同的cpu架构 res :资源文件,layout、drawable等,经过aapt编译 assets :资源文件,不经过aapt编译 classes.dex :dx编译…...

python技术栈 之 单元测试中mock的使用

一、什么是mock? mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。 二、mock的作用 特别是开发过程中上下游未完成的工序导致当前无法测试,需要虚拟某些特定对象…...

python 提取冒号和逗号内的字符串

如果你想要从字符串中提取冒号和逗号之间的内容,你可以使用正则表达式来完成。以下是使用 Python 的re模块进行提取的示例: import retext 这是一个包含:冒号,逗号:的字符串# 使用正则表达式匹配冒号和逗号之间的内容 pattern r[:](.*?)[,] matches …...

CentOS安装Postgresql

PG基本安装步骤 安装postgresql: sudo yum install postgresql-server初始化数据库:安装完毕后,需要初始化数据库并创建初始用户: sudo postgresql-setup initdb启动和停止服务: sudo systemctl start postgresql sudo…...

云原生可观测框架 OpenTelemetry 基础知识(架构/分布式追踪/指标/日志/采样/收集器)...

什么是 OpenTelemetry? OpenTelemetry 是一个开源的可观测性框架,由云原生基金会(CNCF)托管。它是 OpenCensus 和 OpenTracing 项目的合并。旨在为所有类型的可观测信号(如跟踪、指标和日志)提供单一标准。 https://opentelemetry.iohttps://www.cncf.io…...

多用户跨境电商商品库系统快速搭建(全开源)

搭建一个多用户跨境电商商品库系统需要以下步骤: 1. 确定系统需求:首先,需要明确系统的功能需求,包括商品管理、订单管理、用户管理、支付管理等。根据具体需求确定系统的功能和界面设计。 2. 确定技术栈:选择合适的…...

DataGrip 配置 HiveServer2 远程连接访问

文章目录 集群配置 HiveServer2 服务DataGrip 配置 HiveServer2 访问 Hive 集群配置 HiveServer2 服务 1.在 Hive 的配置文件 hive-site.xml 中添加如下参数&#xff1a; <!-- 指定 HiveServer2 运行端口&#xff0c;默认为&#xff1a;10000 --><property><na…...

异常的使用

第一章 异常 1、异常概念 异常&#xff0c;就是不正常的意思。在生活中&#xff1a;医生说&#xff0c;你的身体某个部位有异常&#xff0c;该部位和正常相比有点不同&#xff0c;该部位的功能将受影响&#xff0c;在程序中的意思就是&#xff1a; 异常&#xff1a;指的是程序…...

软件安全测试包含哪些内容和方法?安全测试报告的必要性

软件安全测试是一种通过模拟真实攻击的方式&#xff0c;对软件系统进行全面的安全性评估和测试&#xff0c;以发现潜在的安全漏洞和弱点&#xff0c;是确保软件系统安全性的重要措施。在进行软件安全测试时&#xff0c;我们需要了解测试的内容和方法&#xff0c;以及为什么进行…...

【代码随想录-leetcode第四题 20.有效的括号】

题目描述 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’&#xff0c;‘}’&#xff0c;‘[’&#xff0c;‘]’ 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a;左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右…...

造个轮子-任务调度执行小框架-IOC容器实现

文章目录 前言使用场景特性项目结构初始化执行流程可替换核心组件容器创建扫描目标包容器实例BeanDefinitionMap 创建过滤并初始化创建对象依赖注入完整代码前言 忙里偷闲,今天终于是把概率论这块骨头干下来了。所以的话,留了点时间,把整个项目的结构和基本的功能给实现以下…...

npm发包中一些操作备忘

1、npm发布相关命令 发布 npm publish 发布beta版 npm publish --tag beta 取消发布 npm unpublish --force 2、lerna发布相关命令 发布 lerna publish 其他的的官方文档里面比较全 lerna中文文档...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…...