自动化测试经常遇到数据驱动测试,例如读取2000个账号和密码,进行自动化登录获取token。
***********************************************************************************************
第1步:学习Python读取Excel文件
'''
Created on 2018年7月13日
@author: Yvon_₯㎕ζ๓
'''
import xlrd
excel = xlrd.open_workbook(u'测试账号.xlsx')
# 通过索引顺序获取
table = excel.sheets()[0]
print(table)
print(type(table))
# 获取行数
nrows = table.nrows
print('总行数:',nrows)
print ("该文档有%i行" %nrows)
# 获取列数
ncols = table.ncols
print('该文档有%i列'%ncols)
#获取整行或整列的值
'''row_values = table.row_values(i) , col_values = table.col_values(j) , 其中i为行号, j为列号# 行号、列号索引从0开始'''
row_values = table.row_values(5)
col_values = table.col_values(1)
#获取指定单元格数据
'''value = table.cell(i, j).value , i-行号, j-列号'''
# 例如获取第2行、第1列的数据
value = table.cell(1, 0).value
print(value)
# 遍历打印所有行数据
for i in range(1, nrows):
#每一行数据
print (table.row_values(i))
# print (table.row_values(i)[0])
***********************************************************************************************
第2步:学习Python登录接口
'''
Created on 2018年7月13日
@author: Yvon_₯㎕ζ๓
'''
import requests
header = {
"User-Agent": "Android Device","App-Version": "1.2.3","App-Channel": "200001001",
"Connection": "keep-alive","Content-Type":"application/json",
"Content-Length": "46","Host":"XXX.com"}
params = {"password":"aaaaaa","username":"15610000101"}
login_url = 'https://XXXXXXXXXXXX'
login_ret = requests.post(url=login_url, headers = header, json = params,verify=False)
# login_ret = requests.post(url, data, json)
print(login_ret)
# 这里token在返回的json里,可以直接提取
result = login_ret.json()
# token = login_ret.json()["token"]
print(result)
***********************************************************************************************
第3步: 封装Excel读取
'''
Created on 2018年7月13日
@author: Yvon_₯㎕ζ๓
'''
import xlrd
class Du_Excel:
def __init__(self,excel_path):
self.data = xlrd.open_workbook(excel_path)
self.table = self.data.sheets()[0]
# 获取行数
self.nrows = self.table.nrows
def login_data(self):
# 从第二行开始遍历数据,存入一个list中
test_data = []
for i in range(1, self.nrows):
test_data.append(self.table.row_values(i))
return test_data
if __name__ == "__main__":
excel_path = u'微竞猜测试账号.xlsx'
data = Du_Excel(excel_path)
print (data.login_data())
***********************************************************************************************
最后: 调用封装的Exce,参数化登录接口
'''
Created on 2018年7月13日
@author: Yvon_₯㎕ζ๓
'''
import requests,unittest
from fz_Excel import Du_Excel
class Login_Get_Token(unittest.TestCase):
def setUp(self):
self.header = {'Content-Type':'application/json;charset=UTF-8',
"App-Channel": "200001001",
"App-Version": "1.2.3","Host":"XXX.com" }
self.url = 'https://XXXXXXXXXXX'
def get_Token(self):
excel_path = u'测试账号.xlsx'
data = Du_Excel(excel_path)
r = data.login_data()
with open('token.txt','a+') as f:
f.seek(0)
f.truncate()
for d in r:#遍历上面步骤得到的用户名和密码的列表
# print(d)
self.params ={'password':d[1],'username':d[0]}
self.r=requests.post(url=self.url,json = self.params,headers = self.header,verify=False)
result = self.r.json()
print(result)
self.assertEqual(result['code'],200)
result_token = self.r.json()["data"]
with open('token.txt','a+') as f1:
f1.write(result_token +'\n')
def tearDown(self):
pass
if __name__=='__main__':
testunit = unittest.TestSuite()
testunit.addTest(Login_Get_Token('get_Token'))
runner=unittest.TextTestRunner()
runner.run(testunit)
备注:涉及的知识点说明如下
1、接口requests.post时,如果报port=443,加上verify=False
2、每次生成的token更新覆盖旧的token文件,需要先清空token文件内容,再循环把获取的token文件写入保存。
3、如果Excel读取超过3500行,建议分两个“Sheet”,通过excel.sheets()[0]方式获取,0默认是第一个。