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

news2024/11/30 8:39:38

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

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

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

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

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

案例:在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)
    # 在短信验证码文本框输入 321234
    driver.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)
        # 在短信验证码文本框输入 321234
        driver.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)
            # 在短信验证码文本框输入 321234
            driver.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()

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

学习安排上

如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

在这里插入图片描述

视频文档获取方式:

这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片进群即可自行领取

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

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

相关文章

【车载开发系列】UDS诊断---OBD基础概述

【车载开发系列】UDS诊断—OBD基础概述 UDS诊断---OBD基础概述【车载开发系列】UDS诊断---OBD基础概述一.什么是OBD二.OBD和UDS的区别三.OBD应用功能与应用领域四.OBD的特点有哪些五.OBD的服务概述六.OBD服务中的DTC七.OBD服务中0x03和0x07的区别八.Pending DTC有什么用九.OBD的…

昇腾携手OpenMMLab,支持海量算法仓库的昇腾AI推理部署

摘要:近日,昇腾AI联合浦江实验室,正式实现OpenMMLab算法仓库在昇腾的异构计算架构CANN上的推理部署,目前相关代码已推入MMDeploy 0.10.0版本,并在GitHub正式发布。本文分享自华为云社区《昇腾携手OpenMMLab&#xff0c…

标准库 - Object

一、Object 对象&#xff0c;同时也是一个构造函数。 Object 对象提供了很多操作对象的属性和方法&#xff0c;也是对应的原型。 1.Objcet() 作为函数使用 可以把其他数据类型转为一个包装对象 <script> var a Object("a");// 传入字符串就可以包装为字符串…

面试必备:分库分表经典15连问

前言 大家好&#xff0c;我是田螺。我们去面试的时候&#xff0c;几乎都会被问到分库分表。田螺哥整理了分库分表的15道经典分库分表面试题&#xff0c;大家看完肯定会有帮助的。 公众号&#xff1a;捡田螺的小男孩github地址&#xff0c;感谢每颗star&#xff1a;github 1. 我…

Jmeter随机参数各种搭配

目录&#xff1a;导读 前言 一、两个固定值之间随机生成一个值&#xff0c;应用场景没有限制 二、接下来使用CSV文件按提前写好的值作为参数&#xff0c;执行场景需要提前根据实际情况配置好执行次数 三、在固定的多个值中&#xff0c;随机选取一个值作为参数&#xff0c;执…

Smconf(分布式配置管理框架)概述

Smconf 专注于分布式环境下的配置的统一管理。采用 JavaZookeeperMongodbSpring Boot 开发。目前只支持 Java&#xff0c;其他的使用语言需要通过调用 REST API 来实现。 每个技术人都有一个开源的梦想&#xff0c;那就是自己也能开发出一个让很多人使用的框架。其实分享使用不…

8个巧用iOS备忘录的方法,别浪费了几千块的iPhone手机

你用过ios系统的备忘录吗&#xff1f;是不是只用来记录生活的一些事项呢&#xff1f;如果是这样那就太浪费啦&#xff01;这里分享8个小技巧&#xff0c;快学一学让你的备忘录能物尽其用吧&#xff01;1.笔记-横线与网格大家是不是觉得备忘录的背景光秃秃的&#xff1f;其实是有…

antv/g6基本使用教程

安装 & 引用 在项目中引入 G6 有以下两种方式&#xff1a;npm 引入&#xff0c;CDN 引入。 1 在项目中使用 npm 包引入 Step 1: 使用命令行在项目目录下执行以下命令&#xff1a; npm install --save antv/g6 Step 2: 在需要用的 G6 的 JS 文件中导入&#xff1a; imp…

JSP ssh免疫疫苗管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 JSP ssh免疫疫苗管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S 模式开发。开发环境为TOMCAT7.0…

linux 终端分屏工具 tmux

引言&#xff1a;我们在用 MobaXterm 的时候会 经常遇到窗口不够用的时候&#xff0c;而且切换窗口也比较费时间&#xff0c;所以就需要一个工具&#xff0c;一个终端窗口可以打开多个终端。 sudo apt-get install tmuxtmux输入tmux进入。 上下分屏&#xff1a;ctrl b 再按 &…

【深度学习动手做】Dataset类,读取数据库中带标签的图片

用于将带标签的数据读取&#xff0c;比如我有一个分类“蚂蚁”和“蜜蜂”的任务&#xff0c;其工作目录下有以下&#xff1a; data文件夹、read_data.py ... 其中data文件夹下一级又分为“train”&#xff0c;"val”&#xff0c;然后按照标签分为两个文件夹“ants”&#…

[附源码]Python计算机毕业设计辅导员班级量化管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

高级前端常见手写面试题指南

Function.prototype.call 于call唯一不同的是&#xff0c;call()方法接受的是一个参数列表 Function.prototype.call function(context window, ...args) {if (typeof this ! function) {throw new TypeError(Type Error);}const fn Symbol(fn);context[fn] this;const r…

怎么注册自己的网站?

怎么注册自己的网站&#xff1f;现在很多个人用户会注册自己的网站&#xff0c;那么怎么注册自己的网站呢&#xff1f;对于懂代码的人来说就好办了&#xff0c;自己开发即可&#xff0c;若不懂代码的话又怎么开发呢&#xff1f;毕竟自学代码知识也不太实际&#xff0c;其实也是…

设计模式概述之工厂方法模式(二)

很多小伙伴&#xff0c;不知道设计模式是什么&#xff1f; 通常我们所说的设计模式是一种设计方案&#xff0c;是前人留下的经验及最佳实践。 想要学习设计模式&#xff0c;至少要把面向对象的基本结构全部了解。 设计模式&#xff0c;是建立在一定基础上的思维训练。 学习设…

volatile,wait,notify关键字

文章目录一、volatile关键字二、wait 和 notifywaitnotifynotifyAllwait 和 sleep 的区别顺序打印ABC一、volatile关键字 volatile关键字的存在是用来解决内存可见性问题的。 我在 &#xff1a;线程安全问题 这篇文章中介绍过内存可见性问题。 前面我们讨论内存可见性时说了,…

教程十 在Go中使用Energy创建跨平台GUI应用 - 事件通信(IPC) 之 Go定义事件JS调用

介绍 Energy Go和JS的事件通信, Go监听事件JS触发。 IPC事件还有其它的几种使用方式&#xff0c;在其它教程中更新 在正常前后端大多数开发场景&#xff0c;JS和Go前后端数据交互都需要Http接口方式交互。 Energy中可以不使用Http&#xff0c;使用事件通信机制&#xff08;…

使用ProGuard插件对Spring Boot程序进行代码混淆

使用ProGuard插件对Spring Boot程序进行代码混淆 介绍&#xff1a; ​ ProGuard是一个开源的Java类文件&#xff08;只能处理Java代码&#xff0c;但是对应资源文件等是不能起作用的&#xff09;的压缩器、优化器、混淆器和预校验器。其处理的过程主要分为以下几个步骤&#…

系统移植总结

1&#xff1a;什么是系统移植 1&#xff09;系统移植是给开发板搭建一个Linux操作系统 2&#xff09;从官方获取源码&#xff0c;进行配置和编译&#xff0c;生成板子需要的镜像 2&#xff1a;安装tftp服务器的作用 Tftp服务器&#xff1a;是基于UDP协议完成简单的文件传输 作…

mysql sql优化(索引优化)经验漫谈

文章目录1. 当用sql查找是否“存在”场景2. where 条件 in的限制3. updade语句要不要考虑索引的命中情况4. mysql 预编译 多线程5. 函数与索引失效的关系6. mysql隐性类型转换与索引失效的关系7. 联合索引8. 联合索引最左匹配原则9. 回表 索引覆盖 聚簇索引 非聚簇索引10. 前缀…