python考试题userid_Pytest测试实战之token处理(十一)

原标题: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测试实战案例文章。您也看 购买本人的书籍和实战视频课程。返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值