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)
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。