python unittest实现api自动化测试
项目测试对于一个项目的重要性,大家应该都知道吧,写python的朋友,应该都写过自动化测试脚本。
最近正好负责公司项目中的api测试,下面写了一个简单的例子,对API测试进行梳理。
首先,编写restfulapi接口文件testpost.py,包含了get,post,put方法
#!/usr/bin/envpython
#-*-coding:utf-8-*-
fromflaskimportrequest
fromflask_restfulimportResource
fromflask_restfulimportreqparse
test_praser=reqparse.RequestParser()
test_praser.add_argument('ddos')
classTestPost(Resource):
defpost(self,PostData):
data=request.get_json()
user=User('wangjing')
ifdata['ddos']:
return{'hello':'uese',"PostData":PostData,'ddos':'data[\'ddos\']'}
return{'hello':'uese',"PostData":PostData}
defget(self,PostData):
data=request.args
ifdataanddata['ddos']:
return"hello"+PostData+data['ddos'],200
return{'hello':'uese',"PostData":PostData}
defput(self,PostData):
data=test_praser.parse_args()
ifdataanddata['ddos']:
return"hello"+PostData+data['ddos'],200
return{'hello':'uese',"PostData":PostData}
ps:对于request的取值,我这里定义了常用的三种方法:
post方法:request.get_json(),在调用API时,传值是json方式
get和put方法:request.args或者reqparse.RequestParser(),调用API时,传的是字符串
其次,定义Blueprint(蓝图)文件init.py
#!/usr/bin/envpython
#-*-coding:utf-8-*-
fromflaskimportBlueprint
fromflask_restfulimportApi
fromtestpostimportTestPost
testPostb=Blueprint('testPostb',__name__)
api=Api(testPostb)
api.add_resource(TestPost,'//postMeth')
然后,编写测试脚本testPostM.py
#!/usr/bin/envpython
#-*-coding:utf-8-*-
importunittest
importjson
fromsecautoApp.api.testPostMethimportapi
fromflaskimporturl_for
fromrunimportapp
fromsecautoApp.api.testPostMethimportTestPost
headers={'Accept':'application/json',
'Content-Type':'application/json'
}
classAPITestCase(unittest.TestCase):
defsetUp(self):
#self.app=create_app(os.getenv("SECAUTOCFG")or'default')
self.app=app
#self.app_context=self.app.app_context()
#self.app_context.push()
self.client=self.app.test_client()
#
#deftearDown(self):
#self.app_context.pop()
deftest_post(self):
#withapp.test_request_context():
response=self.client.get(api.url_for(TestPost,PostData='adb',ddos='123'))
self.assertTrue(response.status_code==200)
response=self.client.get(url_for('testPostb.testpost',PostData='adb',ddos='123'))
self.assertTrue(response.status_code==200)
self.assertTrue(json.loads(response.data)['PostData']=='adb')
response=self.client.post(url_for('testPostb.testpost',PostData='adb'),headers=headers,
data=json.dumps({"ddos":'123'}))
printjson.loads(response.data)
self.assertTrue(response.status_code==200)
response=self.client.put(url_for('testPostb.testpost',PostData='adb',ddos='123'))
self.assertTrue(json.loads(response.data)=='helloadb123')
response=self.client.put(url_for('testPostb.testpost',PostData='adb'))
printjson.loads(response.data)['PostData']
self.assertTrue(response.status_code==200)
ps:调用的apiurl主要用的是flask_restful的api.url_for,或者是flask的url_for,下面我来说下这2种方法的具体使用
flask_restful的api.url_for说明
api.url_for(TestPost,PostData='adb'),这里的TestPost指的是restfulapi接口文件中定义的class,因为我们在api蓝图中,已经通过api.add_resource(TestPost,‘//postMeth')添加类的方式定义过
flask的url_for的使用说明
url_for(‘testPostb.testpost',PostData='adb',ddos='123'),'testPostb.testpost'这个字符串中
testPostb指的是蓝图的名称,也就是testPostb=Blueprint(‘testPostb',name)中Blueprint(‘testPostb',name)中的testPostb。
testpost指的是蓝图下endpoit的端点名称,flask_restful中,指的是api.add_resource(TestPost,‘//postMeth')中类名TestPost的小写
启动测试脚本:
C:\secauto3>pythonrun.pytest test_post(testPostM.APITestCase)...ok ---------------------------------------------------------------------- Ran1testin0.056s OK
小总结:url_for的传值和request中的取值是有对应关系的,最后就是flask_restful中端点的方式,一定要是api.add_resource中类名的小写。
领取干货:零基础入门学习python视频教程
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。