1.1.登录用户参数化
在测试过程中,经常会涉及到需要用不同的用户登录操作,可以采用队列的方式,对登录的用户进行参数化。如果数据要保证不重复,则取完不再放回;如可以重复,则取出后再返回队列。
def login(self):
try:
user = self.user.userqueue.get_nowait() # 取不到数据时直接崩溃,走异常处理流程
except queue.Empty:
print("没有数据了")
exit(0)
url = '*****'
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
body = {
'username': user['username'],
'password': '******'
}
with self.client.post(url, data=body, headers=headers, name='登录', catch_response=True,) as response:
self.user.userqueue.put_nowait(user) #数据放回队列
try:
res = json.loads(response.text)
if response.status_code == 200 and str(res) == user['userid']:
response.success()
return user['userid']
else:
response.failure("登录失败")
except Exception as e:
response.failure(e)
class WebUser(HttpUser):
tasks = [MyTask]
wait_time = between(0.1, 0.3)
host = 'http://*******'
userdata = xlrd.open_workbook(r'F:\pycharmproject\locusttest\i8.xls')
table = userdata.sheet_by_name('Sheet2') # 表格中不同table页的名称
# 获取表格总行数
nrows = table.nrows
# 实例化队列,依次从表格中按行取出数据,放进队列
userqueue = queue.Queue()
for n in range(1, nrows):
row_data = table.row_values(n)
data = {
'username': '%s' % row_data[0],
'userid': '%s' % row_data[1]
}
userqueue.put_nowait(data)
1.2.使用登录后返回的数据最为后续task的参数
由于on_start 只执行一次,不会去执行函数里面的返回;因此将登录定义为一个函数,再通过on_start调用,保证只执行一次,同时能够获取到登录后返回的数据。
def on_start(self):
self.userid = self.login()
def login(self):
"""
登录接口
:return: 登录成功后返回userid,用于其他任务的参数
"""
try:
user = self.user.userqueue.get_nowait() # 取不到数据时直接崩溃,走异常处理流程
except queue.Empty:
print("没有数据了")
exit(0)
url = '******'
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
body = {
'username': user['username'],
'password': '*****'
}
with self.client.post(url, data=body, headers=headers, name='登录', catch_response=True,) as response:
self.user.userqueue.put_nowait(user)
try:
res = json.loads(response.text)
if response.status_code == 200 and str(res) == user['userid']:
response.success()
return user['userid']
else:
response.failure("登录失败")
except Exception as e:
response.failure(e)
@task(3)
def addbyi8(self):
url = '*********'
body = {
'userid': self.userid
}
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
with self.client.post(url, data=body, headers=headers, catch_response=True,) as res:
try:
resjson = json.loads(res.text)
if res.status_code == 200 and resjson == 1:
res.success()
else:
res.failure('添加接口出错%s' % resjson)
except Exception as e:
res.failure(e)
1.3.Post参数的value含有json和随机数
采用random生成随机数,拼接到参数value中;json可以先定义json,然后再转换为字符串的形式,传入post参数。
task(1)
def changeallbyi8(self):
random_number = random.randint(1, 1000)
url = '********'
contents = {
"******": "locust发送的" + str(random_number),
"******": "locust图纸的分析" + str(random_number)
}
body = {
'contents': json.dumps(contents)
}
with self.client.post(url, data=body, catch_response=True) as res:
try:
resjson = json.loads(res.text)
if res.status_code == 200 and resjson == 1:
res.success()
else:
res.failure('保存接口出错')
except Exception as e:
res.failure(e)
1.4.Post参数中含有键值对随机取值配对
Typedict字典中创建预设的键值对,使用random.choice从字典的键列表中随机选择一个键,然后使用这个键从字典中取得对应的值,并将其作为请求参数发送。
@task(3)
def addbyi8(self):
typedict = {
'key1': 'value1',
'key2': 'value2'
}
type = random.choice(list(typedict.keys()))
url = '****'
body = {
'type': type,
'operate': typedict[type]
}
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
with self.client.post(url, data=body, headers=headers, catch_response=True,) as res:
try:
resjson = json.loads(res.text)
if res.status_code == 200 and resjson == 1:
res.success()
else:
res.failure('添加接口出错')
except Exception as e:
res.failure(e)
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。