软件测试工程师面试的时候,但凡简历中有透露一点点自己会自动化测试的技能点的描述,都会被面试官问,那你结合你的测试项目说说自动化测试是怎么实现的?一到这里,很多网友,包括我的学生,也都一脸懵逼的样子。
有心放弃吧,但是看着那么高的薪资,还是很眼热的!但是说吧,可感觉自己说的是不是太简单了,能成么?其实,大家远远不需要这么担心,因为自动化测试没有大家想的那么神秘,那么可怕,说出了本质,那就是都一样的!
自动化测试的本质:是把以人为驱动的测试行为转化为机器执行的一种过程。一般,在设计了测试用例并通过评审之后,由测试人员根据测试用例中描述的规程一步步执行测试,得到实际结果与期望结果的比较。自动化测试的目的是,为了节省人力、时间或硬件资源,提高测试效率。——这是百度百科中的介绍。
从上面一段文字描述中,我们能够知道自动化测试跟手工测试有着密切的关系,并且是先有手工测试,设计测试用例,再将测试过程转换为脚本语言,让计算机运行的过程。
所以,大家在在进行自动化测试的过程实现的时候,一定要根据手工测试中使用的测试用例进行设计脚本,因为自动化测试要模拟人的实际操作。下面我们以实际案例说一下自动化测试的实现过程和手工测试的关系。
案例:在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()
好看到这里,希望能够消除大家对自动化测试实现过程的恐惧,真的没有那么多难点!如果大家还有什么疑惑,可以找我深入沟通和交流哦!
学习安排上
如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片进群即可自行领取。