全套视频便宜甩卖,web 接口 app自动化测试,python全栈自动化测试
目标
-
加深对自动化的理解
- 功能自动化:把现在手工做的东西,用代码做出来
- 什么是自动化?建立在功能测试基础上做的
- 什么时候做自动化?功能稳定时
- 自动化可以帮我们做哪些事情?回归测试/比较稳定的功能/上线前快速检查
- 最佳实现:在excel/数据库准备好测试数据--用代码读取--直接进行测试--把结果存储到excel/数据库--并出具一份测试报告+jenkeins做一个集成平台
-
项目需求分析
可行性分析:是否可做、是否稳定、优先级
项目背景:项目内容P2P背景
-
项目模块:注册、登录、充值、提现、投资;业务逻辑:后台添加数据 加标-审核-发标
-
接口文档
- RESTful API返回结果说明:
{ "status":1,//接口执行状态,1表示成功,0表示异常 "code":10001,//业务自定义状态码,无信息否为空字符串,status=1时,code为10001,表示成功,30204表示第3个模块的第2个接口的第4个状态码,模块:用户1,标2,投资3,回款计划4,流水记录5 "data":{ //返回数据、对象、数组均可,为空统一设置为NULL,基于其他客户端(如Java-Objective-C)对空值(null、nil、Null)的处理空值不便或容易产生异常,可根据具体业务和前后端约定空数组为[],空字典为{} "msg":"成功"//该字段本次请求的业务、状态描述信息,主要用于调试、测试等,status!=1时都应该有错误信息,无信息否为空字符串 } }
- 注册接口
- 登录接口
- 充值接口
- 提现接口
-
投资、竞标接口
-
项目逻辑
-
实战目标
注册、登录、充值、提现、投资
-
普及数据分离/代码分离/文件分离的概念
- 数据分离
-
API_AUTO
项目名run.py
代码执行入口-
common
公共类,大家都可使用(也可以叫tools
工具类)-
conf
放置配置文件xx.conf -
public
放置公共代码
-
test_data
测试数据-
result
测试结果-
test_result
测试结果 -
test_report
测试报告 -
image
测试截图 -
log
日志
-
-
- 数据分离
- 课堂作业
实战遇到的问题
因为视频的实战项目是上课老师自己写的,现在已经无法访问,可以根据视频的原理直接用自己公司的项目进行实战。下面涉及代码基本基于自己公司的代码展示,适当打码。同时,我们公司python使用2.7版本,后期语法上可能有少少差异。
大家也用自己公司的产品练手吧。
步骤:
- 引入requests模块
- 发送get/post请求
- register、login、recharge接口,按单个用例请求,调通接口
- recharge接口需要cookies
注意点:
- headers、cookies是关键字,都要加s,不能随便以此命名
- 获取请求头,res.request.headers
高级用法-会话
import requests
s=requests.session() #创建一个会话
logon_res=s.get(login_url,params=login_data) #login_data必须有个key,常用是params
recharge_res=s.post(recharge_url,recharge_data) #这里就不用传cookies啦
print(recharge_res.json())
给类取别名
from API_AUTO.common.public.http_request import HttpRequest as ht
实例化遇到要写类名HttpRequest
的地方,可以用ht
代替
说明
后面开始使用自己公司的代码进行练手了,结合视频的接口自动化测试的思想。隐藏一些公司的隐私信息
登录接口:/login
body:{"user_phone": "1801923****", "device_model": "iphone7"}
user_phone 手机号
device_model 手机型号
写run.py文件
from API_AUTO.common.public.http_request import HttpRequest #引入自己封装的http请求
#登录
payload = {"user_phone": "1801923****", "device_model": "iphone7"}
res=HttpRequest().http_request("/login","post",payload)
改造在run.py
文件中
-
通过列表
[]
管理测试数据为什么测试数据用列表嵌套字典的形式?列表嵌套其他的也可以,但是比如列表嵌套列表,那访问时,就要通过索引值去访问,但是列表嵌套字典,只需要通过他的key就可以去访问
#run.py文件 #代码执行的入口: from API_AUTO.common.public.http_request import HttpRequest import json def run(test_data): for item in test_data: #测试数据用一个list[]存储,一个{}是一条用例 print ("正在测试的case是",item["title"]) res = HttpRequest().http_request(item["url"], item["method"],eval(item["payload"])) print res.json() #测试数据 test_data=[{"url":"/login","method":"post","payload": {"user_phone": "1801923****","device_model": "iphone7"},"title":"正确的登录"}, {"url":"/login","method":"post","payload": {"user_phone": "1850171****", , "device_model": "iphone7"},"title":"黑名单登录"}] #调用函数 run(test_data)
-
通过excel管理测试数据
为什么放在excel?数据更清晰,更方便管理
![image](https://upload-images.jianshu.io/upload_images/12041448-13ab26c04ac42388?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
写一个读取excel的工具类,在学习excel操作时写过,这次需要添加一个写回数据的方法
```
from openpyxl import load_workbook
'''
操作excel
'''
class DoExcel:
def get_data(self,file_name,sheet_name):
wb=load_workbook(file_name)
sheet=wb[sheet_name]
test_data=[] #每条数据要存在列表里
for i in range(2, sheet.max_row+1):
sub_data={}
sub_data["case_id"] = sheet.cell(i, 1).value
sub_data["url"]=sheet.cell(i,2).value
sub_data["method"]=sheet.cell(i,3).value
sub_data["payload"]=sheet.cell(i,4).value
sub_data["title"]=sheet.cell(i,5).value
test_data.append(sub_data)
return test_data
def write_back_data(self,file_name,sheet_name,i,value):
wb=load_workbook(file_name)
sheet=wb[sheet_name]
sheet.cell(i,6).value=value
wb.save(file_name) #保存
```
改造`run.py`
```
from API_AUTO.common.public.http_request import HttpRequest
from API_AUTO.common.public.do_excel import DoExcel
def run(test_data):
for item in test_data:
print "正在测试的case是",item["title"]
res = HttpRequest("1.6.0", "android", "785c6fee0e4488ca412a5afc9a00e9d8").http_request(item["url"], item["method"],eval(item["payload"]))
print res.json() #python2.7的print不需要括号
DoExcel().write_back_data("test_data/test_data.xlsx","Sheet1",item["case_id"]+1,str(res.json()))
test_data=DoExcel().get_data("test_data/test_data.xlsx","Sheet1")
run(test_data)
```
难点解答
1)wb.save(file_name)
2)不同模块不同的sheet比较好,写在一个sheet里也可以通过添加module字段区分不同模块
3)加一个登录接口的请求、或者反射机制
4)弱一点比较好
5)write_back_data()
pandas处理excel
参考文档:https://www.cnblogs.com/liulinghua90/p/9935642.html
安装xlrd
安装pandas
-
日常用法
import pandas df= pandas.read_excel("test_data.xlsx",sheet_name="Sheet1")#sheet_name不指定默认读第一个sheet # df dataframe print df.values #所有数据,返回是嵌套列表 # 默认去掉字段名所在行,索引值从0开始 print df.ix[0].values #读除去字段名的第1行,返回是一个列表 print df.ix[0,1] #读除去字段名的第1行的第2列 print df.ix[:].values #也是读取所有数据 print df.ix[:,["url"]].values #读取指定列url #返回字典形式 print df.ix[0,["url","method","payload","title"]].to_dict() #第1行,指定列,以字典形式返回 print df.ix[0].to_dict() #第1行,不指定列,全部列输出,以字典形式返回
-
读取测试数据
import pandas df= pandas.read_excel("test_data.xlsx",sheet_name="Sheet1") test_data=[] for i in df.index.values: row_data=df.ix[1,["url","method","payload","title"]].to_dict() test_data.append(row_data) print (test_data)
注意:pandas需要关闭excel,否则会报错找不到这个sheet_name