- sosotest平台介绍
- 安装部署sosotest服务
- 使用配置入门
- 后台管理部分
- 用户使用
- MOCK服务
- 关键字模式介绍
- python模式介绍
- context上下文对象
- 数据操作
- 持续集成
- 断言处理
- 常见错误原因
- Published with GitBook
自定义关键字
自定义关键字
按照自定义关键字规范,用户可以编写自定义关键字,然后用于用例中。
进入自定义关键字的菜单路径是 数据服务->KEYWORD/PYTHON模式->新增关键字
注:平台不允许用户写代码时使用import引入包,所有有import引用包的需求需要联系管理员添加。
默认引入的包
编写自定义关键字时,默认引入了如下包:
#字符串处理相关的库
import json,re,jsonpath,hashlib,ast
from urllib import parse
from functools import reduce
from bs4 import BeautifulSoup
#时间处理相关的库
import datetime,time,calendar
#数学处理
import math,cmath,decimal
#web请求相关
import requests
#异常处理
import traceback
#数据库相关
import pymysql,redis
from kafka import KafkaProducer
from kafka import KafkaConsumer
from kafka.errors import KafkaError
自定义关键字规范
编写自定义关键字,需要遵循如下规范:
@keyword()
@catch_exception
def DEMO_SELF_KEYWORD(value,context,strTobeProcessed = ""):
#你调用关键字时传入的参数列表,
#例如DEMO_SELF_KEYWORD(a,b,c),处理后的paramList就是列表['a','b','c']
paramList = getParamList(strTobeProcessed, context)
#例如DEMO_SELF_KEYWORD(p1,p2,k1 = v1,k2 = v2),处理后的paramList就是列表['p1','p2'],paramDict就是字典{'k1':'v1','k2':'v2'}
paramList,paramDict = getParamListAndKWParam(strTobeProcessed, context)
#你调用的关键字处理后的值,未分割
#例如DEMO_SELF_KEYWORD($VAR[a],b,c),假设变量a=1,处理后的strTobeProcessed就是字符串1,b,c
strTobeProcessed = core.processor.KP.KP.getProcessedValue(strTobeProcessed, context)
#你的代码在这里面写↓
#return 是你想要的返回值,必须有,按照自己的要求写返回值类型是str
return int(paramList[0])+int(paramList[1])+int(paramList[2])
说明:
1、开头必须使用装饰器@keyword @catch_exception。
2、函数定义必须符合规范。def DEMO_SELF_KEYWORD(value,context,strTobeProcessed = ""):。
3、获取参数列表方式:paramList = getParamList(strTobeProcessed, context)
4、获取参数列表的字典参数的方式:paramList,paramDict = getParamListAndKWParam(strTobeProcessed, context)
5、处理所有入参,即整个参数只有1个参数时:strTobeProcessed = core.processor.KP.KP.getProcessedValue(strTobeProcessed, context)
6、return 必须有。
7、关键字函数的参数value,context,strTobeProcessed = ""的说明:
value:无需关心,装饰器keyword会处理。 context:上下文对象,对象中会有各种属性和函数,详见context对象说明。 strTobeProcessed:要处理的子串,也就是关键字调用时的参数部分。
自定义关键字示例
登录LOGIN
假设需要实现一个HTTP接口的登录关键字,传入用户名密码,请求登录接口/user/login,然后进行登录。
调用示例:LOGIN(zhangsan,123456);
知识点:
1、生成参数列表list。
2、使用上下文的session。
3、使用上下文的datalist传递登录状态,在一个会话中实现一次登录后续免登陆操作。
@keyword()
@catch_exception
def LOGIN(value,context,strTobeProcessed = ""):
#LOGIN(username,password),执行下面语句后,paramList = ["username","password"]
paramList = getParamList(strTobeProcessed, context)
retmsg = "" # 要返回的信息
if len(paramList) != 2:
# 参数长度不符合要求,报错。
retmsg = "<ERROR: 参数错误,长度必须是2>"
context.setERROR(retmsg)
return retmsg
#参数校验通过后,给username和password赋值。
username = paramList[0]
password = paramList[1]
host = context.host
# 进行免登陆判断,当执行任务或者业务流时,可以不重复登录。
# context.context_data_list 是上下文对象中的上下文传递数据列表。可以存储过程数据。
isContinue = False # 是否继续登录,如果用户名密码主机都一致,就继续,不重新登录。
if len(context.context_data_list) == 3:
if username != context.context_data_list[0].strip() or password != context.context_data_list[1].strip() or host != context.context_data_list[1].strip():
isContinue = True
else:
isContinue = True
if isContinue:
# 如果继续,重置上下文数据列表。
context.context_data_list = []
else:
return "【已登录】用户%s-Host[%s],不再次执行登录!" % (username,host)
# 使用上下文的session进行登录操作。
context.current_session = requests.session() # 重置session,然后使用新session重新登录。
resp_obj = context.current_session.post(host+"/user/login",data="username=%s&password=%s" % (username,password))
if "success" in resp_obj.text:
# 登录成功后,添加数据到 上下文数据列表 context.context_data_list
context.context_data_list.append(username)
context.context_data_list.append(password)
context.context_data_list.append(host)
return "登录成功!"
else:
# 登录失败,重置session。
context.current_session = requests.session() # 重置session,然后使用新session重新登录。
return "登录失败!"
使用MD5生成签名 SIGN
假设后端需要使用md5对密钥和当前时间戳进行加密的数据进行验签。
调用示例:signmd5str = SIGN(secretkey,timestamp);
@keyword()
@catch_exception
def SIGN(value,context,strTobeProcessed = ""):
# 将参数处理一下,生成最终字符串
paramList = getParamList(strTobeProcessed, context)
retmsg = "" # 要返回的信息
if len(paramList) != 2:
# 参数长度不符合要求,报错。
retmsg = "<ERROR: 参数错误,长度必须是2>"
context.setERROR(retmsg)
return retmsg
#参数校验通过后,给username和password赋值。
secretKey = paramList[0]
timestamp = paramList[1]
#对key进行排序
md = hashlib.md5() # 创建md5对象
md.update(( timestamp + secretKey).encode(encoding='utf-8'))
signature=md.hexdigest()
#你的代码在这里面写↓
#return 是你想要的返回值,必须有,按照自己的要求写返回值类型是str
return signature