您现在的位置是:主页 > news > 网站如何做查询表单/长春网站提升排名
网站如何做查询表单/长春网站提升排名
admin2025/5/5 19:10:18【news】
简介网站如何做查询表单,长春网站提升排名,做搜索网站挣钱,深圳网站建设公司哪家可以建app原标题:Pytest测试实战之token处理(十一)HTTP是应用层的协议,同时也是无状态的协议,所以也就有了COOKIE技术的发展,关于COOKIE和SESSION以及TOKEN这些我就不详细的解释了,在我的书籍《Python自动化测试实战》里面有很详…
原标题:Pytest测试实战之token处理(十一)
HTTP是应用层的协议,同时也是无状态的协议,所以也就有了COOKIE技术的发展,关于COOKIE和SESSION以及TOKEN这些我就不详细的解释了,在我的书籍《Python自动化测试实战》里面有很详细的解释。本节继续沿着 Python测试实战(十) 的主题来看Pytest测试框架对token的处理和API的案例应用实战。在案例里面,应用了Flask-JWT,关于JWT部分改天我在博客里面详细的写下。对之前的源码增加token的验证,最新的案例代码为:
#!/usr/bin/python3
#coding:utf-8
fromflask importFlask ,make_response ,jsonify ,abort ,request
fromflask_restful importApi ,Resource
fromflask_httpauth importHTTPBasicAuth
fromflask importFlask
fromflask_jwt importJWT ,jwt_required ,current_identity
fromwerkzeug.security importsafe_str_cmp
app=Flask(__name__)
app.debug = True
app.config[ 'SECRET_KEY'] = 'super-secret'
api=Api( app=app)
auth=HTTPBasicAuth
@auth.get_password
defget_password(name):
ifname== 'admin':
return'admin'
@auth.error_handler
defauthoorized:
returnmake_response(jsonify({ 'msg': "请认证"}) ,401)
books=[
{ 'id': 1,'author': 'wuya','name': 'Python接口自动化测试实战','done': True} ,
{ 'id': 2,'author': '无涯','name': 'Selenium3自动化测试实战','done': False}
]
classUser( object):
def__init__( self,id ,username ,password):
self.id = id
self.username = username
self.password = password
def__str__( self):
return"User(id='%s')"% self.id
users = [
User( 1,'wuya','asd888') ,
User( 2,'user2','abcxyz') ,
]
username_table = {u.username: u foru inusers}
userid_table = {u.id: u foru inusers}
defauthenticate(username ,password):
user = username_table.get(username , None)
ifuser andsafe_str_cmp(user.password.encode( 'utf-8') ,password.encode( 'utf-8')):
returnuser
defidentity(payload):
user_id = payload[ 'identity']
returnuserid_table.get(user_id , None)
jwt = JWT(app ,authenticate ,identity)
classBooks(Resource):
# decorators = [auth.login_required]
decorators=[jwt_required]
defget( self):
returnjsonify({ 'status': 0,'msg': 'ok','datas':books})
defpost( self):
if notrequest.json:
returnjsonify({ 'status': 1001,'msg': '请求参数不是JSON的数据,请检查,谢谢!'})
else:
book = {
'id': books[- 1][ 'id'] + 1,
'author': request.json.get( 'author') ,
'name': request.json.get( 'name') ,
'done': True
}
books.append(book)
returnjsonify({ 'status': 1002,'msg': '添加书籍成功','datas':book} ,201)
classBook(Resource):
# decorators = [auth.login_required]
decorators = [jwt_required]
defget( self,book_id):
book = list( filter( lambdat: t[ 'id'] == book_id ,books))
iflen(book) == 0:
returnjsonify({ 'status': 1003,'msg': '很抱歉,您查询的书的信息不存在'})
else:
returnjsonify({ 'status': 0,'msg': 'ok','datas': book})
defput( self,book_id):
book = list( filter( lambdat: t[ 'id'] == book_id ,books))
iflen(book) == 0:
returnjsonify({ 'status': 1003,'msg': '很抱歉,您查询的书的信息不存在'})
elif notrequest.json:
returnjsonify({ 'status': 1001,'msg': '请求参数不是JSON的数据,请检查,谢谢!'})
elif'author'not inrequest.json:
returnjsonify({ 'status': 1004,'msg': '请求参数author不能为空'})
elif'name'not inrequest.json:
returnjsonify({ 'status': 1005,'msg': '请求参数name不能为空'})
elif'done'not inrequest.json:
returnjsonify({ 'status': 1006,'msg': '请求参数done不能为空'})
eliftype(request.json[ 'done'])!= bool:
returnjsonify({ 'status': 1007,'msg': '请求参数done为bool类型'})
else:
book[ 0][ 'author'] = request.json.get( 'author',book[ 0][ 'author'])
book[ 0][ 'name'] = request.json.get( 'name',book[ 0][ 'name'])
book[ 0][ 'done'] = request.json.get( 'done',book[ 0][ 'done'])
returnjsonify({ 'status': 1008,'msg': '更新书的信息成功','datas': book})
defdelete( self,book_id):
book = list( filter( lambdat: t[ 'id'] == book_id ,books))
iflen(book) == 0:
returnjsonify({ 'status': 1003,'msg': '很抱歉,您查询的书的信息不存在'})
else:
books.remove(book[ 0])
returnjsonify({ 'status': 1009,'msg': '删除书籍成功'})
api.add_resource(Books ,'/v1/api/books')
api.add_resource(Book ,'/v1/api/book/')
if__name__ == '__main__':
app.run( debug= True)
在上面的的案例代码中,特别是在类里面提供了JWT,这样访问每个API都需要token的校验,如果在请求头里面没有带token的校验,就会返回401的错误信息,如下图所示:
那么针对token的获取以及token在请求头中的应用,完全可以使用pytest测试框架中的conftest.py的文件里面,这样在每个请求的接口中应用它就可以了,案例代码如下:
#!/usr/bin/python3
#coding:utf-8
importrequests
importpytest
defgetToken:
dict1={ 'username': 'wuya','password': 'asd888'}
r=requests.post(
url= 'http://127.0.0.1:5000/auth',
json=dict1)
returnr.json[ 'access_token']
@pytest.fixture
defheaders:
return{ 'Authorization': 'JWT {0}'.format(getToken)}
在如上的代码中,我们获取到了token,这样在每个接口的请求中带上请求头就可以很轻松的解决了token的校验,测试代码如下:
#!/usr/bin/python3
#coding:utf-8
importpytest
importyaml
importos
importrequests
importjson
classRequest:
defrequest( self,url ,method= 'get',**kwargs):
ifmethod== 'get':
returnrequests.request( url=url ,method=method ,**kwargs)
elifmethod== 'post':
returnrequests.request( url=url ,method=method ,**kwargs)
elifmethod== 'put':
returnrequests.request( url=url ,method=method ,**kwargs)
elifmethod== 'delete':
returnrequests.request( url=url ,method=method ,**kwargs)
defget( self,url ,**kwargs):
returnself.request( url=url ,method= 'get',**kwargs)
defpost( self,url ,**kwargs):
returnself.request( url=url ,method= 'post',**kwargs)
defput( self,url ,**kwargs):
returnself.request( url=url ,method= 'put',**kwargs)
defdelete( self,url ,**kwargs):
returnself.request( url=url ,method= 'delete',**kwargs)
defreadYaml:
withopen( 'books.yaml','r') asf:
returnlist(yaml.safe_load_all(f))
@pytest.mark.parametrize( 'datas',readYaml)
deftest_books(datas ,headers):
ifdatas[ 'method']== 'get':
r=Request.get( url=datas[ 'url'] ,headers=headers)
assertdatas[ 'expect'] injson.dumps(r.json ,ensure_ascii= False)
elifdatas[ 'method']== 'post':
r=Request.post( url=datas[ 'url'] ,json=datas[ 'dict1'] ,headers=headers)
assertdatas[ 'expect'] injson.dumps(r.json ,ensure_ascii= False)
elifdatas[ 'method']== 'put':
r=Request.put( url=datas[ 'url'] ,json=datas[ 'dict1'] ,headers=headers)
assertdatas[ 'expect'] injson.dumps(r.json ,ensure_ascii= False)
elifdatas[ 'method']== 'delete':
r=Request.delete( url=datas[ 'url'] ,headers=headers)
assertdatas[ 'expect'] injson.dumps(r.json ,ensure_ascii= False)
if__name__ == '__main__':
pytest.main([ "-v","-s","test_jwt_token.py"])
在Pytets测试框架里面,conftest.py的模块是不能导入的,直接引用就可以了,测试如上的测试代码后,它的输出结果为:
虽然每次生成的token都是不一样的,但是结合conftest.py就可以很轻松的解决这个问题。
感谢您的关注和阅读,后续会继续更新Pytest测试实战案例文章。您也看 购买本人的书籍和实战视频课程。返回搜狐,查看更多
责任编辑: