python接⼝⾃动化测试框架pdf_Python接⼝⾃动化测试框架Python接⼝⾃动化测试框架
在⾃动化的测试体系中,包含了UI⾃动化测试和接⼝⾃动化测试,UI⾃动化实现的前提是软件版本进⼊稳定期,UI界⾯稳定、变动少,相⽐较之下接⼝⾃动化,接⼝受外界因素的影响较少,维护成本低,能够在最短时间发现问题。
⼀、浅谈接⼝测试
1、什么是接⼝测试:
API测试⼜称为接⼝测试,主要⽤于检测外部系统与系统之间以及内部各个⼦系统之间的交互点,是对系统接⼝功能进⾏测试的⼀种⼿段,也是集成测试的⼀部分,通过直接控制被测应⽤的接⼝(API)来确定是否在功能、可靠性、性能和安全⽅⾯达到预期的软件测试活动。
2、如何测试接⼝:
检查接⼝返回的数据是否与预期结果⼀致。
检查接⼝的容错性,假如传递数据的类型错误时是否可以处理。
接⼝参数的边界值。例如,传递的参数⾜够⼤或为负数时,接⼝是否可以正常处理。
接⼝的性能,http请求接⼝⼤多与后端代码逻辑、执⾏的SQL语句性能、算法等相关。
接⼝的安全性,外部调⽤的接⼝尤为重要。
3、接⼝测试的意义、⽬的:
接⼝测试的核⼼意义、⽬的在于:以保证系统的正确和稳定为核⼼,以持续集成为⼿段,提⾼测试效率,提升⽤户体验,降低产品研发成本。
⼆、定义框架⽬录分层
接⼝⾃动化框架的没有统⼀标准,可以根据实际需要⾃定义,以满⾜功能测试⽬标要求为⽬的。⼀个基本的接⼝⾃动化测试框架需要满⾜的功能:测试⽤例管理、各种配置信息管理、数据库操作、⽇志打印、报告输出、邮件发送
"""API_Autotest/
|-- API_Case/ #测试⽤例
| | |-- PreviewRelease_01_RegisterLogin.py #预发布环境注册登录接⼝case
| | |-- PreviewRelease_02_SubmitCredit.py #预发布环境主流程接⼝case
| | |-- PreviewRelease_03_MobilePhonePWD.py #预发布环境.......接⼝case
| | |-- Test_01_RegisterLogin.py #测试环境注册登录接⼝case
| | |-- Test_02_SubmitCredit.py #测试环境主流程接⼝case
| | |-- Test_03_LoanRepayment.py #测试环境......接⼝case
| | |
|-- data/ ###配置信息
| |-- conf_dict.py #账号密码等配置信息
| |-- custom_variable.py #向接⼝请求的请求的参数变量、keys、请求头
| |-- export_url.py #接⼝url
| |-- request_dict.py #向接⼝请求的请求参数
|
|-- logic/ ###主要逻辑
| |-- export_logic.py #接⼝实现主逻辑
| |-- database.py #数据库操作类
| |-- log_print.py #⽇志打印类
| |-- public_class.py #公⽤函数类
| |-- send_email.py #发送邮件类
|
|-- log/ #⽇志
| |-- Case--201804182020_log #根据运⾏⽇期保存操作⽇志
| |-- Case--201804182022_log
|
|-- report/ #测试报告
| |-- report--201804181729.html #根据运⾏⽇期保存测试报告⽇志
| |-- report--201804181731.html
|
|-- readme.md #readme
|
|-- manage.py #接⼝case运⾏管理类"""
三、知识技能储备
萝⼘青菜各有所爱,每个⼈⼼中的接⼝⾃动化测试框架也各不相同,想实现⼀个基础功能完备的接⼝测试框架需要的Python知识如下:
1、Python基础知识
列举了⼀些需要掌握的基础知识
2、主要依赖的库
下⾯介绍的库都是数据库操作、⽇志打印、报告输出、邮件发送功能实现所依赖的库:
python基础知识测试a、数据库操作
数据库操作主要pymysql库,下⾯为代码⽰例:
importpymysqlimportdatetime,f_dict importConfDatafrom logic.log_print importLOGfrom logic.public_class importPublicclassConnectDatabase():"""连接数据库类"""
def __init__(self):
self.Log=LOG()
_conf_data("database_110", "port"),
_conf_data("database_110", "user"),
_conf_data("database_110", "password"),
_conf_data("database_110", "db"),
charset='utf8',#以字典形式展⽰所查询数据
cursorclass=pymysql.cursors.DictCursor)#保存错误⽇志的⽂件名称
self.log_name = _new_file(path=os.path.join(os.path.dirname(os.path.dirname(__file__)), "log"))def select_sql(self, **kwargs):"""根据传⼊参数执⾏数据库查询操作
:param args:
:param kwargs: database:(database_110)选择数据库、table:表名、condition:where条件
:return:"""database_name= ("database")
field_name= ("field", "*")printf在c语言
table_name= ("table")
where_condition= ("condition")if database_name == "database_110":try:
tion_110.cursor() as cursor:
sql= "SELECT %s FROM %s WHERE %s;"data=(field_name, table_name, where_condition)
result=cursor.fetchone()returnresultexceptException as e:
self.Log.log_warning("database", self.log_name, "select_error:%s" %e)def select_sql_all(self, *args, **kwargs):"""根据传⼊参数执⾏数据库查询操作
自学编程的app推荐>数据库系统概论实验心得:param args:
:param kwargs: database:(database_110)选择数据库、table:表名、condition:where条件
:return:"""database_name= ("database")
field_name= ("field", "*")
table_name= ("table")
where_condition= ("condition")if database_name == "database_110":try:
tion_110.cursor() as cursor:
sql= "SELECT %s FROM %s WHERE %s;"data=(field_name, table_name, where_condition)print((sql %data))
result=cursor.fetchall()returnresultexceptException as e:
self.Log.log_warning("database", self.log_name, "select_error:%s" %e)def update_sql(self, *args, **kwargs):"""根据传⼊参数执⾏数据库更新操作
:param args:
:param kwargs: database:(database_110)选择数据库、table:表名、set:更新的字段和值、conditio
java从入门到放弃图n:where条件
:return:"""database_name= ("database")
where_condition= ("condition")if database_name == "database_110":try:
tion_110.cursor() as cursor:
sql= "UPDATE %s SET %s WHERE %s;"data=(table_name, set_value, where_condition)#print(sql%data) ute(sql %data)
cursor.close()exceptException as e:
self.Log.log_warning("database", self.log_name, "update_error:%s" %e)
:param args:
:param kwargs: database:(database_110)选择数据库、table:表名、condition:where条件
:return:"""database_name= ("database")
table_name= ("table")
where_condition= ("condition")if database_name == "database_110":try:
tion_110.cursor() as cursor:
sql= "DELETE from %s where %s;"data=(table_name, where_condition)
self.Log.log_warning("database", self.log_name, "delete_error:%s" %e)
:param args:
:param kwargs: database:(database_110)选择数据库、sql:需要插⼊的sql语句
:return:"""database_name= ("database")
insert_sql= ("sql")if database_name == "database_110":try:
tion_110.cursor() as cursor:
self.Log.log_warning("database", self.log_name, "insert_error:%s" %e)
:param args:
:param kwargs: database:(database_110)选择数据库、function_name:函数名称,data_id:数据ID,phone:电话:return:"""database_name= ("database")
function_name= ("function_name")
product_id= ("product_id")if database_name == "database_110":try:
tion_110.cursor() as cursor:
cursor.callproc(function_name,args=(data_id,phone,product_id,))
self.Log.log_warning("database", self.log_name, "mysql_function:%s" %e)
b=ConnectDatabase()
data_id= ate_short_id()
⽰例代码--删减版
PS:pymsql库操作mysql数据库增、删、查、改、调⽤函数
b、⽇志打印
⽇志打印依赖logging库,下⾯为代码⽰例:
importloggingimportosimportsysimportdatetime
log_path= os.path.join(os.path.dirname(os.path.dirname(__file__)), "log")
sys.path.append(log_path)classLOG(object):"""⽇志打印类"""
sql server数据库管理器窗口
def __init__(self):
:return 返回logger 对象"""
#创建⼀个logger对象
logger =Logger(args[0])
logger.setLevel(logging.DEBUG)#创建⼀个向屏幕输⼊的handler对象
ch =logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)#创建⼀个像⽂件输⼊的handler对象
log_file = os.path.join(log_path, "%s--%s_log" % (args[1], w_time))
fh= logging.FileHandler(log_file, mode="a+", encoding="utf-8")
fh.setLevel(logging.DEBUG)#设置log输⼊格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter)
fh.setFormatter(formatter)#logger,添加handler对象
logger.addHandler(ch)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。