测试--接口自动化测试

张开发
2026/4/9 23:55:20 15 分钟阅读
测试--接口自动化测试
测试这里测试的是博客系统日志封装这里我们用得到的接口是一个博客网站importloggingimporttimeimportosclassinfoFileter(logging.Filter):deffilter(self,record):returnrecord.levelnologging.INFOclasserrorFileter(logging.Filter):deffilter(selfself,record):returnrecord.levelnologging.ERRORclasslogger():classmethoddefgetLog(cls):#创建日志对象cls.loggerlogging.getLogger(__name__)cls.logger.setLevel(logging.DEBUG)# 确保文件创建好LOG_PATH./logs/ifnotos.path.exists(LOG_PATH):os.mkdir(LOG_PATH)#将日志输出到文件中 mylog.txt 2025-12-12.log 2025-12-13-info.log nowtime.strftime(%Y-%m-%d)log_nameLOG_PATHnow.loginfo_log_nameLOG_PATHnow-info.logerror_log_nameLOG_PATHnow-error.log# 创建文件处理器all_handlerlogging.FileHandler(log_name,encodingutf-8)info_handlerlogging.FileHandler(info_log_name,encodingutf-8)error_handlerlogging.FileHandler(error_log_name,encodingutf-8)#设置日志格式formatterlogging.Formatter(%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s: %(lineno)d] - %(message)s)all_handler.setFormatter(formatter)info_handler.setFormatter(formatter)error_handler.setFormatter(formatter)# 添加过滤器info_handler.addFilter(infoFileter())error_handler.addFilter(errorFileter())cls.logger.addHandler(all_handler)cls.logger.addHandler(info_handler)cls.logger.addHandler(error_handler)returncls.loggerRequest类封装一个request类 里面包含get post函数 函数里可以打印日志显示信息hosthttp://192.168.229.130:9090classRequest:loglogger.getLog()defget(self,url,**kwargs):self.log.info(准备发起get请求,url:url)self.log.info(接口信息:{}.format(kwargs))rrequests.get(urlurl,**kwargs)self.log.info(接口状态响应码:{}.format(r.status_code))self.log.info(接口响应内容:{}.format(r.text))returnrdefpost(self,url,**kwargs):self.log.info(准备发起post请求url:url)self.log.info(接口信息:{}.format(kwargs))rrequests.post(url,**kwargs)self.log.info(接口响应状态码:{}.format(r.status_code))self.log.info(接口信息:{}.format(r.text))returnr登录页面编写这里包括异常登录页面和正常登陆页面。登陆失败测试之前需要参数化 里面包含三组错误数据自动跑三次用例发送post请求到登录接口.urlhttp://192.168.229.130:9090/user/loginfrom utils.yaml_utilimportwrite_yaml from utils.request_utilimporthost,Requestimportjsonschemaimportpytest from jsonschema.validatorsimportvalidateimportre# data {username:zhangsan,password:123456,code:SUCCESS}}class TestLogin:urlhost/user/loginschema{type:object,required:[code,errMsg,data],properties:{code:{type:string},errMsg:{type:string},data:{type:[string,null]}}}#异常登录pytest.mark.parametrize(login,[{username:lisi,password:1234,code:FAIL,expect_errmsg:密码错误},{username:mmmmmmm,password:123456,code:FAIL,expect_errmsg:用户不存在},{username:zhangsan,password:1234,code:FAIL,expect_errmsg:密码错误}])def test_login_fail(self,login):# 执行请求data{username:login[username],password:login[password]}rRequest().post(urlself.url,datadata)# 检验是否有效validate(instancer.json(),schemaself.schema)assert r.json()[code]FAILassert r.json()[errMsg]login[expect_errmsg]# 正常登录pytest.mark.parametrize(login,[{username:zhangsan,password:123456,code:SUCCESS},{username:lisi,password:123456,code:SUCCESS}])def test_login_success(self,login):data{username:login[username],password:login[password]}rRequest().post(urlself.url,datadata)# 检验是否有效validate(instancer.json(),schemaself.schema)assert login[code]SUCCESSassert re.match(r\S{100},r.json()[data])# 接口返回的data就是用户登陆的凭证token{user_token_header:r.json()[data]}write_yaml(data.yml,token)列表页用例编写博客列表页测试用例编写。对未登录状态下和登录状态下分别进行测试class Test:urlhost/blog/getListschema{type:object,required:[code,errMsg,data],additionalProperties:False,properties:{code:{type:string},errMsg:{type:string},data:{type:array,#要求返回的博客数据最少要有一个minItems:1,items:{type:object,required:[id,title,content,userId,deleteFlag,createTime,updateTime,loginUser],additionalProperties:False,properties:{id:{type:number},title:{type:string},content:{type:string},userId:{type:number},deleteFlag:{type:number},createTime:{type:string},updateTime:{type:string},loginUser:{type:boolean}}}}}}# 请求列表页 博客页列表编写def test_list_nologin(self):rRequest().get(urlself.url)assertr.status_code401def test_list_login(self):tokenread_yaml(data.yml,user_token_header)header{user_token_header:token}rRequest().get(urlself.url,headersheader)validate(instancer.json(),schemaself.schema)# 将blogid保存到yml文件中blogId{blogId:r.json()[data][0][id]}write_yaml(data.yml, blogId)详情页用例编写博客详情页用例编写.这里需要获取博客详情页的id生成放在yml文件中每次用到进行读取文件获取class TestDetail:urlhost/blog/getBlogDetailschema{type:object,required:[code,errMsg,data],additionalProperties:False,properties:{code:{type:string},errMsg:{type:string},data:{type:object,additionalProperties:False,required:[id,title,content,userId,deleteFlag,createTime,updateTime,loginUser],properties:{id:{type:number},title:{type:string},content:{type:string},userId:{type:number},deleteFlag:{type:number},createTime:{type:string},updateTime:{type:string},loginUser:{type:boolean}}}}}# 未登录状态下 --401def test_list_nologin(self):urlself.url?blogId32213rRequest().get(urlself.url)assertr.status_code401def test_list_login(self):urlself.url?blogIdstr(read_yaml(data.yml,blogId))tokenread_yaml(data.yml,user_token_header)header{user_token_header:token}#这里url self.url情况不一样 测试结果也不一样rRequest().get(url,headersheader)validate(instancer.json(),schemaself.schema)assert r.json()[code]SUCCESS#博客详情页 错误的pytest.mark.parametrize(blogId,[,1234,bite,-100,99999999])def test_list_Fail(self,blogId):urlself.urlparams{blogId:blogId}tokenread_yaml(data.yml,user_token_header)header{user_token_header:token}rRequest().get(self.url,headersheader)expect_json{code:FAIL,errMsg:内部错误, 请联系管理员,data:None}assert r.json()expect_json

更多文章