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

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

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

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

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

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

案例:在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()

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

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


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


一、Python编程入门到精通

二、接口自动化项目实战  

三、Web自动化项目实战


四、App自动化项目实战  

五、一线大厂简历


六、测试开发DevOps体系  

七、常用自动化测试工具

八、JMeter性能测试  

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

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

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

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一篇文章,教你彻底掌握接口测试!

Part 01、什么是接口测试 所谓接口,是指同一个系统中模块与模块间的数据传递接口、前后端交互、跨系统跨平台跨数据库的对接。而接口测试,则是通过接口的不同情况下的输入,去对比输出,看看是否满足接口规范所规定的功能、安全以及…

从零开始:构建您自己的直播带货软件开发计划

1. 确定目标和需求 在开始开发之前,您需要明确您的目标和需求。考虑以下问题: 您的直播带货软件是面向哪个市场和用户群体? 您的软件需要支持哪些主要功能,如实时视频直播、商品展示、购买支付、实时互动等? 您是否需…

批处理处理退格符,一行里输出百分比

直接上例子程序&#xff1a; echo off&setlocal enabledelayedexpansion for /l %%a in (1,1,6) do set "str!str!" rem set /p0%<nul for /L %%i in (0,1,100) do (sleep 1 >nul set /p%str%<nul&set /p%%i%%<nul ) pause>nul 输出效果如…

通过anvt X6和vue3实现图编辑

通过anvt X6 X6地址&#xff1a;https://x6.antv.antgroup.com/tutorial/about&#xff1b; 由于节点比较复杂&#xff0c;使用vue实现的节点&#xff1b; x6提供了一个独立的包 antv/x6-vue-shape 来使用 Vue 组件渲染节点。 VUE3的案例&#xff1a; <template><div…

JavaWeb 手写Tomcat底层机制

目录 一、Tomcat底层整体架构 1.简介 : 2.分析图 : 3.基于Socket开发服务端的流程 : 4.打通服务器端和客户端的数据通道 : 二、多线程模型的实现 1.思路分析 : 2.处理HTTP请求 : 3.自定义Tomcat : 三、自定义Servlet规范 1. HTTP请求和响应 : 1 CyanServletRequest …

成集云 | 畅捷通采购单同步至钉钉 | 解决方案

源系统成集云目标系统 介绍 畅捷通是一家专业的金融科技公司&#xff0c;致力于为投资者提供便捷、高效的金融服务。通过畅捷通T的交易方式&#xff0c;投资者可以更加灵活地进行买卖交易&#xff0c;并且在交易完成后即可获得结算款项&#xff0c;无需等待T1的结算周期。 钉…

Styletron: 面向组件的样式设计工具包

styletron官网&#xff1a; styletron的GitHub链接&#xff1a; styletron-react 一. 介绍 Styletron是一个通用的component-oriented&#xff08;面向组件的&#xff09;样式工具。它属于css-in-js类别。Styletron可以很好地与React配合使用&#xff0c;但也可以与其他框架或…

Python弹球小游戏

给在校的小妹妹做个游戏玩&#xff1a;. 弹珠游戏主要是靠坐标xy&#xff0c;接板长度&#xff0c;球的半径等决定&#xff1a; # -*- coding: utf-8 -*- # Author : Codeooo # Time : 2022/04/29import sys import time import random import pygame as pgprint("&q…

ML类CFAR检测器在不同环境中检测性能的分析

摘要&#xff1a;该文是楼主翻阅书籍以及一些论文总结出来的关于ML(均值)类CFAR检测器在不同环境中的性能对比&#xff0c;以及优缺点的总结&#xff0c;可以帮助大家面对不同情形如何选择CFAR问题。由于楼主见识短浅&#xff0c;文中难免出现不足之处&#xff0c;望各位指出。…

校对软件助力公安公检:提高调查报告质量

校对软件可以为公安公检机关提供有力支持&#xff0c;帮助提高调查报告的质量。以下是校对软件在这方面的助力&#xff1a; 1.拼写和语法检查&#xff1a;校对软件可以自动检查调查报告中的拼写错误和语法问题。这可以避免由于疏忽或拼写错误而导致的报告不准确或难以理解的情况…

uniapp scroll-view 隐藏滚动条

/*清除滚动条 - 适配安卓*/::-webkit-scrollbar {width: 0;height: 0;color: transparent;}/*清除滚动条 - 适配IOS*/::-webkit-scrollbar {display: none;}

对强缓存和协商缓存的理解

浏览器缓存的定义&#xff1a; 浏览器缓存是浏览器在本地磁盘对用户最近请求过的文档进行存储&#xff0c;当访问者再次访问同一页面时&#xff0c;浏览器就可以直接从本地磁盘加载文档。 浏览器缓存分为强缓存和协商缓存。 浏览器是如何使用缓存的&#xff1a; 浏览器缓存…

oracle的管道函数

Oracle管道函数(Pipelined Table Function)oracle管道函数 1、管道函数即是可以返回行集合&#xff08;可以使嵌套表nested table 或数组 varray&#xff09;的函数&#xff0c;我们可以像查询物理表一样查询它或者将其赋值给集合变量。 2、管道函数为并行执行&#xff0c;在…

传统图像算法 - 运动目标检测之KNN运动背景分割算法

以下代码用OpenCV实现了视频中背景消除和提取的建模&#xff0c;涉及到KNN&#xff08;K近邻算法&#xff09;&#xff0c;整体效果比较好&#xff0c;可以用来进行运动状态分析。 原理如下&#xff1a; 背景建模&#xff1a;在背景分割的开始阶段&#xff0c;建立背景模型。 …

【ChatGPT 指令大全】怎么使用ChatGPT来辅助学习英语

在当今全球化的社会中&#xff0c;英语已成为一门世界性的语言&#xff0c;掌握良好的英语技能对个人和职业发展至关重要。而借助人工智能的力量&#xff0c;ChatGPT为学习者提供了一个有价值的工具&#xff0c;可以在学习过程中提供即时的帮助和反馈。在本文中&#xff0c;我们…

力扣63.不同路径II(动态规划)

/*** author Limg* date 2022/08/09* 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。* 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。* 现在考虑网…

国产低功耗蓝牙HS6621CxC/6621Px系列支持Find My网络功能方案芯片

目录 什么是“Find My“&#xff1f;HS6621系列简介 什么是“Find My“&#xff1f; “Find My”是苹果公司于19年前推出的针对失物追踪&#xff0c;Find My iPhone&#xff08;查找我的iPhone&#xff09;和Find My Friends&#xff08;查找朋友&#xff09;的结合体应用。为…

oracle容灾备份怎么样Oracle容灾备份

随着科学技术的发展和业务的增长&#xff0c;数据安全问题越来越突出。为了保证数据的完整性、易用性和保密性&#xff0c;公司需要采取一系列措施来防止内容丢失的风险。  Oracle是一个关系数据库管理系统(RDBMS),OracleCorporation是由美国软件公司开发和维护的。该系统功能…

网络编程——数据包的组装和拆解

数据包的组装和拆解 一、数据包在各个层之间的传输 二、各个层的封包格式 1、链路层封包格式 -------------------------------------------------------------------------------------------------------------------------------------- | 目标MAC地址&#xff08;6字节&a…

干货分享|Elsevier投稿进度查询功能正式上线,随时获取投稿状态!

想必广大科研学者们都经历过每天登录系统查看投稿进度的煎熬过程&#xff0c;为了方便广大科研人随时获取投稿状态&#xff0c;2023年8月&#xff0c;Elsevier【微信端投稿进度查询功能】正式上线&#xff01; 无论你是通讯作者还是共同作者&#xff0c;只需一次查询&#xff…
最新文章