一、自动化分类
(1)接口自动化
python/java+requests+unittest框架来实现 python/java+RF(RobotFramework)框架来实现——对于编程要求不高
(2)Web UI功能自动化
python/java+selenium+unittest+ddt+PO框架来实现 python/java+RFS(RobotFrameWork+Selenium)框架来实现——对于编程要求不高
(3)App自动化
python/java+appnium+unittes框架来实现 python/java+RF(RobotFramework)框架来实现——对于编程要求不高
同时,我也准备了一份软件测试视频教程(含接口、自动化、性能等),需要的可以直接在下方观看,或者直接关注VX公众号:互联网杂货铺,免费领取
软件测试视频教程观看处:
字节大佬教你逼自己如何在15天内掌握自动化测试(接口自动化/APP自动化/Web自动化/性能测试),内含项目实战
二、接口自动化与Web自动化的区别
(1)接口自动化是没有界面的,不需要对界面元素定位操作,不需要考虑界面延迟的问题,执行效率更高
(2)接口自动化用的是requests测试库,Web自动化用的selenium测试库
(3)接口自动化的覆盖率可以达到100%(绝大部分的接口都可以实现自动化) Web自动化的覆盖率能达到80-90%算OK(可能会有某些功能是没办法实现自动化的)
三、怎么做接口自动化
3.1、流程
A. 确定业务范围,哪些业务功能的接口可以做自动化——接口自动化的覆盖率可以达到 100%
B. 时间进度安排,人员分配
C. 确定自动化测试框架
D. 准备数据——准备接口用例数据
E. 编写接口自动化脚本
3.2、搭建接口自动化测试环境
1、安装python3.x——配置python的环境变量
2、安装PyCharm——python开发工具
3、安装测试库:
Requests库—— 提供了丰富的用来发请求,对请求进行处理的API函数
xlrd,xlwt库—— 提供了对Excel文件进行操作的API函数
Pymysql库—— 提供了对Mysql数据库进行操作的API函数
paramsunittest库—— 实现参数化的库
Json库—— 提供了对Json格式的数据进行操作的API函数
(python自带的基础库) Re库—— 可以使用这个库中的API函数对HMTL数据进行操作
3.3、准备数据
准备接口用例数据 我们把接口用例数据放入在Excel表格中,因为每一个接口都包含:请求地址,请求方式,请求参数,以及响应数据;所以在Excel表格中按照以下方式来组织我们的接口用例数据,包含以下几个内容: 用例名称,请求地址,请求方式,请求头,请求参数,预期结果(断言) 然后我们会封装一个函数去读取Excel数据,以参数的形式传递到脚本中,具体操作步骤如下:
3.4、编写自动化测试脚本
1、步骤:
A、导包
import requests
B、组织请求参数
url = ‘http://localhost/fw/index.php?ctl=user&act=dologin&fhash=hbUjHVrQIgHkwdMdNGnPrSiIkVBeWcrOvJpmsXgyNuMewKfKGy’
par = {
‘email’: ‘Jason’,
‘user_pwd’: ‘TWlKaGRrRFJrQXJZZlFXYkh5WlNQZ2tpZkFZQlVlUUhyRE5SdndSUGdKanFDTG1LYUYlMjV1NjVCOSUyNXU3RUY0emdwMTIzNDU2JTI1dThGNkYlMjV1NEVGNg==‘,
‘auto_login’: 0,
‘ajax’: 1
}
C、发送请求
res = requests.post(url, data=par)
res = requests.get(url,params=par)
D、提取响应对象中的数据,并做断言
1、提取响应*body*内容**
res.text —— 如果返回的是html格式的数据,使用res.text提取`
res.json() —— 如果后台返回的是json格式的数据,则使用这个API函数来提取`
2、提取响应头***
res.headers
3、提取状态码,响应信息
res.status_code
res.reason
4、提取cookie值
res.cookies()
2、传递请求头
header = {
‘User-Agent’: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0’,
‘Accept’: ‘application/xml’,
}
res = requests.post(url,data=par,headers=header)
3、传递cookie,token值
通过请求头来传递 —— 直接从浏览器上查看cookie值,并传递到后台。
header = {
‘Cookie’: ‘PHPSESSID=3724b412550a557825da5528dd6198c6’
}
res = requests.post(url,data=par,***headers=heade***r,allow_redirects=False)
发请求的时候通过cookies这个参数来传递
import requests
#1. 登录,获取cookie值
def getCookie():
url = ‘http://localhost/fw/index.php?ctl=user&act=dologin&fhash=hbUjHVrQIgHkwdMdNGnPrSiIkVBeWcrOvJpmsXgyNuMewKfKGy’
par = {
‘email’: ‘Jason’,
‘user_pwd’: ‘TWlKaGRrRFJrQXJZZlFXYkh5WlNQZ2tpZkFZQlVlUUhyRE5SdndSUGdKanFDTG1LYUYlMjV1NjVCOSUyNXU3RUY0emdwMTIzNDU2JTI1dThGNkYlMjV1NEVGNg==‘,
‘auto_login’: 0,
‘ajax’: 1
}
res = requests.post(url, data=par)
return res.cookies
#2. 调用充值接口
#2.1 获取cookie值
cookie = getCookie()
#2.2 发充值请求
url = ‘http://localhost/fw/member.php?ctl=uc_money&act=incharge_done’
par = {
‘check_ol_bl_pay’:’on’,
‘money’:1000,
‘bank_id’:0,
‘memo’:234567890,
‘payment’:5,
}
#发充值请求
res1 = requests.post(url,data=par,cookies=cookie,allow_redirects=False) # 自动重定向的,可以取消自动重定向
print(res1.status_code)
print(res1.reason)
print(res1.headers)
先创建一个session对象,所有请求都使用这个session对象来发送
import requests
#1. 发登录请求
url = ‘http://localhost/fw/index.php?ctl=user&act=dologin&fhash=hbUjHVrQIgHkwdMdNGnPrSiIkVBeWcrOvJpmsXgyNuMewKfKGy’
par = {
‘email’: ‘Jason’,
‘user_pwd’: ‘TWlKaGRrRFJrQXJZZlFXYkh5WlNQZ2tpZkFZQlVlUUhyRE5SdndSUGdKanFDTG1LYUYlMjV1NjVCOSUyNXU3RUY0emdwMTIzNDU2JTI1dThGNkYlMjV1NEVGNg==‘,
‘auto_login’: 0,
‘ajax’: 1
}
#创建一个seesion对象,后期使用这个session对象来发请求
ses = requests.session()
#发登录请求,返回的cookie值会自动化保存到session对象中
response1 = ses.post(url,data=par)
#2. 发充值请求
url = ‘http://localhost/fw/member.php?ctl=uc_money&act=incharge_done’
par = {
‘check_ol_bl_pay’:’on’,
‘money’:1000,
‘bank_id’:0,
‘memo’:234567890,
‘payment’:5,
}
response2 = ses.post(url,data=par,allow_redirects=False)
print(response2.headers)
3.5、工程管理维护与优化
1、数据驱动——实现接口用例数据与脚本的分离 我们把接口用例数据放入在Excel表格中,因为每一个接口都包含:请求地址,请求方式,请求参数,以及响应数据;所以在Excel表格中按照以下方式来组织我们的接口用例数据,包含以下几个内容: 用例名称,请求地址,请求方式,请求头,请求参数,预期结果(断言) 然后我们会封装一个函数去读取Excel数据,以参数的形式传递到脚本中,具体操作步骤如下:
安装xlrd库
pip install xlrd
调用xlrd库中的API函数来实现对Excel表格数据的读取
#封装一个读取Excel表格数据的函数
#对Excel表格数据的读取需要用到一个库——xlrd库
import xlrd
def get_data(filename,sheetname):
#1. 打开Excel文件
workbook = xlrd.open_workbook(filename)
#2. 打开Excel文件中的某张表
sheet = workbook.sheet_by_name(sheetname)
#3. 读取表中的内容
list = []
for I in range(1,sheet.nrows):
data = sheet.row_values(i)
list.append(data)
return list
if __name__==‘__main__’:
result = get_data(‘D:\\JMeter\\1947_Project\\cxy-project02\\data\\接口用例数据.xls’,’登录’)
print(result)
问题解决1
工程问题:
1、没有安装xlrd
2、没有把xlrd导入工程
2、unittest框架
作用:用来管理用例,加载用例,执行用例
原理:有几个核心组件
1、测试固件 setUp() 每条用例执行之前,首先会执行这个setUp()方法,在setUp()方法中完成准备初始化工作 比如:连接数据库,后期在将Web UI功能自动化的时候,可以在这里去打开浏览器,配置 tearDown() 每条用例执行完成之后,回收一些资源,比如:关闭数据库,关闭浏览器
2、测试用例 每一条用例需要实现一个用例方法,每个用例方法都必须要以test开头
3、测试套件 执行用例的时候,需要创建测试套件,把用例加入测试套件。
4、加载器 用来加载用例的,把测试用例加入测试套件中
5、执行器 用来执行测试套件中的用例的 如何使用unittest框架来编写用例
#1. 导包
import time
import unittest
import requests
from common.excelUtils import get_data
import paramunittest
#读取excel表格中的数据
list = get_data(‘D:\\JMeter\\1947_Project\\cxy-project02\\data\\接口用例数据.xls’,’登录’)
#2. 定义一个类,去继承unittest.TestCase
@paramunittest.parametrized(*list) # 引用list中的所有数据
class FwLogin(unittest.TestCase):
def setParameters(self,case_name,url,method,headers,params,assert_info):
‘’’
有多少条用例,这个函数就会执行多少次,每执行一条用例之前先会执行这个函数,把数据提取出来。
:param case_name:
:param url:
:param method:
:param headers:
:param params:
:param assert_info:
:return:
‘’’
self.case_name = str(case_name)
self.url = str(url)
self.method = str(method)
self.headers = str(headers)
self.params = str(params)
self.assert_info = str(assert_info)
#1. 实现一个用例方法
def test_login_case(self):
time.sleep(5)
#1. 组织参数
self.headers= eval(self.headers) # 将字符串转化为字典
self.params = eval(self.params)
#2. 发请求
if self.method == ‘POST’:
response = requests.post(self.url,data=self.params,headers=self.headers)
else:
response = requests.get(self.url,params=self.params,headers=self.headers)
#3. 检查,断言
self.check_result(response)
def check_result(self,response):
‘’’
断言 检查结果的
:param response:
:return:
‘’’
self.assert_info = eval(self.assert_info) #预期结果
try:
self.assertEqual(response.status_code,200,’响应状态码错误’)
self.assertEqual(response.reason,’OK’,’响应的响应码错误’)
self.assertDictEqual(response.json(),self.assert_info,’响应的正文内容不一致!’)
print(‘%s测试用例通过!’ %self.case_name)
except AssertionError as e:
print(‘%s测试用例不通过!%s’ %(self.case_name,e))
if __name__ == ‘__main__’:
unittest.main()
小小心意
PS:这里分享一套软件测试的自学教程合集。对于在测试行业发展的小伙伴们来说应该会很有帮助。除了基础入门的资源,博主也收集不少进阶自动化的资源,从理论到实战,知行合一才能真正的掌握。全套内容已经打包到网盘,内容总量接近500个G。如需要软件测试学习资料,关注公众号(互联网杂货铺),后台回复1,整理不易,给个关注点个赞吧,谢谢各位大佬!
☑ 240集-零基础到精通全套视频课程
☑ [课件+源码]-完整配套的教程
☑ 18套-测试实战项目源码
☑ 37套-测试工具软件包
☑ 268道-真实面试题
☑ 200个模板-面试简历模板、测试方案模板、软件测试报告模板、测试分析模版、测试计划模板、性能测试报告、性能测试报告、性能测试脚本用例模板(信息完整)
这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。