对于接口类函数,即被GET、POST调用的函数
?
二、步骤请提前安装requests模块
pip install requests
?
?
?
三、规则?
?
?
?
?
四、举例比如
def admin_booking_history(request):
return render(request, ‘./adminWeb/booking_history.html‘)
只需判断请求状态是否为200即可判断成功
import requests
import unittest
"""被测代码的一个python文件对应一个unittest测试文件,当前测试adminWeb里views.py"""
"""一个接口一个类,当前测试admin_booking_history接口"""
class admin_booking_history(unittest.TestCase):
def setUp(self):
self.url = "http://127.0.0.1:8000/adminweb/bookinghistory"
self.headers = {‘Content-Type‘: ‘application/x-www-form-urlencoded‘}
"""测试用例1:测试是否能够正常访问页面"""
def test_get(self):
res = requests.get(self.url)
# 请求成功
self.assertEqual(res.status_code,200)
if __name__ == ‘__main__‘:
unittest.main()
?
比如下面的函数读取了context渲染到html页面上
# 设置展示信息页面
def admin_setting_display_info(request):
system_configurations = SystemConfiguration.objects.filter(Q(configuration_name=‘days_showed_at_most_one_time‘))
context = {}
for system_configuration in system_configurations:
temp = model_to_dict(system_configuration)
print(temp)
context[temp[‘configuration_name‘]] = temp[‘configuration_value‘]
print(context)
return render(request, ‘./adminWeb/setting_display_info.html‘, context)
?
我们应该将数据和展示分离,也就是说,展示页面只展示,数据通过另外一个接口提供,即数据可以通过在html页面里使用ajax加载。这样就可以分开测试了
?
比如
# 保存设置展示信息
@csrf_exempt
def admin_save_display_info(request):
days_showed_at_most_one_time = request.POST.get(‘days_showed_at_most_one_time‘, None)
if days_showed_at_most_one_time is None or days_showed_at_most_one_time == ‘‘:
return_json = {}
return_json[‘code‘] = 1
return_json[‘msg‘] = ‘必须传递days_showed_at_most_one_time参数‘
return_json[‘data‘] = {}
return HttpResponse(json.dumps(return_json), content_type=‘application/json‘)
defaults = dict()
defaults[‘configuration_name‘] = ‘days_showed_at_most_one_time‘
defaults[‘configuration_value‘] = days_showed_at_most_one_time
result_days_showed_at_most_one_time = SystemConfiguration.objects.update_or_create(defaults=defaults,
configuration_name=‘days_showed_at_most_one_time‘)
print(result_days_showed_at_most_one_time)
# update_or_create返回值为元组: (object, created),
# object为新建或者更新的对象,
# created为一个布尔值,表示是新建还是更新,True为新建,False为更新
context = {}
context[‘result_days_showed_at_most_one_time‘] = json.dumps(result_days_showed_at_most_one_time[1])
print(context)
return_json = {}
return_json[‘code‘] = 0
return_json[‘msg‘] = ‘修改成功‘
return_json[‘data‘] = context
return HttpResponse(json.dumps(return_json), content_type=‘application/json‘)
测试函数为
import requests
import unittest
"""被测代码的一个python文件对应一个unittest测试文件,当前测试adminWeb里views.py"""
"""一个接口一个类,当前测试admin_save_display_info接口"""
class admin_save_display_info(unittest.TestCase):
def setUp(self):
self.url = "http://127.0.0.1:8000/adminweb/save_display_info"
self.headers = {‘Content-Type‘: ‘application/x-www-form-urlencoded‘}
"""测试用例1:必填参数为空"""
def test_params_null(self):
json ={}
res = requests.post(self.url, headers=self.headers, data=json)
data = res.json()
# print(data)
self.assertEqual(res.status_code, 200)
self.assertEqual(data["code"], 1, data["msg"])
"""测试用例2:是否保存成功"""
def test_save(self):
#body接口参数
body = {
"days_showed_at_most_one_time": 9
}
res = requests.post(self.url, data=body, headers=self.headers)
data = res.json()
# print(data)
self.assertEqual(res.status_code, 200)
self.assertEqual(data["code"], 0, data["msg"])
if __name__ == ‘__main__‘:
unittest.main()
?
?
比如测试下面的接口,其中读取了session信息
# 保存用户的预约信息
@csrf_exempt
def save_booking(request):
# 校验是否已经登陆
if request.session.get(‘is_login‘) is None:
return_json = {}
return_json[‘code‘] = 2
return_json[‘msg‘] = ‘必须先实名登陆‘
return_json[‘data‘] = {}
return HttpResponse(json.dumps(return_json), content_type=‘application/json‘)
selected_date_id = request.POST.get(‘selected_date_id‘, None)
if selected_date_id is None or selected_date_id == ‘‘:
return_json = {}
return_json[‘code‘] = 1
return_json[‘msg‘] = ‘必须传递selected_date_id参数‘
return_json[‘data‘] = {}
return HttpResponse(json.dumps(return_json), content_type=‘application/json‘)
# 查询出该时间段的详情
date = EveryDayBookingInfo.objects.filter(id=selected_date_id).first()
selected_date = model_to_dict(date)
print(selected_date)
# 如果可预约人数小于等于0,则表示已经被预约完了
if selected_date[‘remain_number‘] <= 0:
return_json = {}
return_json[‘code‘] = 3
return_json[‘msg‘] = ‘该时间段已经被预约完了‘
return_json[‘data‘] = {}
return HttpResponse(json.dumps(return_json), content_type=‘application/json‘)
# TODO
# 此处省略了校验该用户是否重复预约,同学们可以自己补充
# 若该时间段没有被预约完,则扣减1
update_result = EveryDayBookingInfo.objects.filter(id=selected_date_id).update(remain_number=(selected_date[‘remain_number‘]-1))
# 将预约记录保存到数据库中
add_result = BookingRecord.objects.create(user_id=request.session.get(‘user_id‘),
username=request.session.get(‘username‘), datetime_id=selected_date[‘id‘],
datetime_start=selected_date[‘datetime_start‘],
datetime_end=selected_date[‘datetime_end‘],
submit_datetime=datetime.datetime.now(), is_main_order=1, main_order_id=0,
status=1)
result = {}
result[‘update_result‘] = update_result
result[‘add_result‘] = add_result.id
# TODO
# 此处省略了处理同行人的代码
return_json = {}
return_json[‘code‘] = 0
return_json[‘msg‘] = ‘保存成功‘
return_json[‘data‘] = result
return HttpResponse(json.dumps(return_json), content_type=‘application/json‘)
解决方案
现在浏览器正常登陆,获取sessionid
将sessionid放入到测试函数的headers中
import requests
import unittest
"""被测代码的一个python文件对应一个unittest测试文件,当前测试adminWeb里views.py"""
"""一个接口一个类,当前测试save_booking接口"""
class save_booking(unittest.TestCase):
def setUp(self):
self.url = "http://127.0.0.1:8000/userweb/save_booking"
"""测试用例1:用户未登陆"""
def test_unlogin(self):
self.headers = {‘Content-Type‘: ‘application/x-www-form-urlencoded‘}
body ={}
res = requests.post(self.url, data=body, headers=self.headers)
data = res.json()
# print(data)
self.assertEqual(res.status_code, 200)
self.assertEqual(data["code"], 2, data["msg"])
"""测试用例2:用户未已登陆的情况下,未传递必要参数"""
def test_login_and_params_null(self):
self.headers = {
‘Content-Type‘: ‘application/x-www-form-urlencoded‘,
‘Cookie‘: "sessionid=rcyydgtytt9olvgpusdo66eygzatpomx"
}
body ={
# "selected_date_id": 54
}
res = requests.post(self.url, data=body, headers=self.headers)
data = res.json()
print(data)
self.assertEqual(res.status_code, 200)
self.assertEqual(data["code"], 1, data["msg"])
if __name__ == ‘__main__‘:
unittest.main()
?
?
?
?
五、实操新建一个测试文件
测试代码
import requests
import unittest
"""被测代码的一个python文件对应一个unittest测试文件,当前测试adminWeb里views.py"""
"""一个接口一个类,当前测试admin_booking_history接口"""
class admin_booking_history(unittest.TestCase):
def setUp(self):
self.url = "http://127.0.0.1:8000/adminweb/bookinghistory"
self.headers = {‘Content-Type‘: ‘application/x-www-form-urlencoded‘}
"""测试用例1:测试是否能够正常访问页面"""
def test_get(self):
res = requests.get(self.url)
# 请求成功
self.assertEqual(res.status_code,200)
"""一个接口一个类,当前测试admin_save_display_info接口"""
class admin_save_display_info(unittest.TestCase):
def setUp(self):
self.url = "http://127.0.0.1:8000/adminweb/save_display_info"
self.headers = {‘Content-Type‘: ‘application/x-www-form-urlencoded‘}
"""测试用例1:必填参数为空"""
def test_params_null(self):
json ={}
res = requests.post(self.url, headers=self.headers, data=json)
data = res.json()
# print(data)
self.assertEqual(res.status_code, 200)
self.assertEqual(data["code"], 1, data["msg"])
"""测试用例2:是否保存成功"""
def test_save(self):
#body接口参数
body = {
"days_showed_at_most_one_time": 9
}
res = requests.post(self.url, data=body, headers=self.headers)
data = res.json()
# print(data)
self.assertEqual(res.status_code, 200)
self.assertEqual(data["code"], 0, data["msg"])
"""一个接口一个类,当前测试save_booking接口"""
class save_booking(unittest.TestCase):
def setUp(self):
self.url = "http://127.0.0.1:8000/userweb/save_booking"
"""测试用例1:用户未登陆"""
def test_unlogin(self):
self.headers = {‘Content-Type‘: ‘application/x-www-form-urlencoded‘}
body ={}
res = requests.post(self.url, data=body, headers=self.headers)
data = res.json()
# print(data)
self.assertEqual(res.status_code, 200)
self.assertEqual(data["code"], 2, data["msg"])
"""测试用例2:用户未已登陆的情况下,未传递必要参数"""
def test_login_and_params_null(self):
self.headers = {
‘Content-Type‘: ‘application/x-www-form-urlencoded‘,
‘Cookie‘: "sessionid=rcyydgtytt9olvgpusdo66eygzatpomx"
}
body ={
# "selected_date_id": 54
}
res = requests.post(self.url, data=body, headers=self.headers)
data = res.json()
print(data)
self.assertEqual(res.status_code, 200)
self.assertEqual(data["code"], 1, data["msg"])
if __name__ == ‘__main__‘:
unittest.main()
运行结果
?
?
?
六、更多情况请参考下面的文章和代码示例stduy《python+request+unittest 接口测试练习》
?
?
import requests
import unittest
"""嘉宾查询接口"""
class GuestQuery(unittest.TestCase):
def setUp(self):
self.url="http://127.0.0.1: 8000/api/get_event_list/"
"""使用错误的请求方式post 进行测试"""
def test_method_post(self):
res = requests.post(self.url)
data = res.json()
self.assertEqual(data["status"],"100" )
self.assertEqual(data["message"],"请求方法错误")
"""使用get正确查询"""
def test_method_get(self):
res = requests.get(self.url)
data = res.json()
# print(data)
self.assertEqual(res.status_code,200)
self.assertEqual(data["status"],"110)")
self.assertEqual(data["message"],"查询成功")
"""嘉宾添加接口"""
class GuestAdd(unittest.TestCase):
def setUp(self):
self.url = "http://127.0.0.1: 8000/api/add_event/"
self.headers = {‘Content-Type‘: ‘application/json‘}
"""使用错误的请求方法get 进行测试"""
def test_get_guest(self):
res = requests.get(self.url)
data = res.json()
self.assertEqual(res.status_code,200)
self.assertEqual(data["status"],"404" )
self.assertEqual(data["message"],"请求方法错误")
"""必填参数为空"""
def test_add_guest_params_null(self):
json ={}
res = requests.post(self.url,json,self.headers)
data = res.json()
print(data)
self.assertEqual(res.status_code, 200)
self.assertEqual(data["status"],"10020" )
self.assertEqual(data["message"],"parameter null")
"""必填参数 值为空"""
def test_add_guest_params_value_null(self):
json = {
"event_id": "",
"realname": "",
"phone": "",
"email": "",
"sign": ""}
res = requests.post(self.url,json,self.headers)
data = res.json()
print(data)
self.assertEqual(res.status_code, 200)
self.assertEqual(data["status"],"10021" )
self.assertEqual(data["message"],"parameter error")
"""发布会id为不存在"""
def test_add_guest_event_id(self):
json = {
"event_id": 88888,
"realname": "张三",
"phone": "15210001000",
"email": "152100@qq.com",
"sign": "0"}
res = requests.post(self.url,json,self.headers)
data = res.json()
self.assertEqual(res.status_code, 200)
self.assertEqual(data["status"],"10022" )
self.assertEqual(data["message"],"event id null")
"""发布会id为非整型"""
def test_add_guest_event_id(self):
json = {
"event_id": "123",
"realname": "张三",
"phone": "15210001000",
"email": "152100@qq.com",
"sign": "0"}
res = requests.post(self.url,json,self.headers)
data = res.json()
self.assertEqual(res.status_code, 200)
self.assertEqual(data["status"],"10023" )
self.assertEqual(data["message"],"event status is not available")
"""发布会id已经达到limit人数"""
def test_add_guest_event_id(self):
json = {
"event_id": "1",
"realname": "张三",
"phone": "15210001000",
"email": "152100@qq.com",
"sign": "0"}
res = requests.post(self.url,json,self.headers)
data = res.json()
self.assertEqual(res.status_code, 200)
self.assertEqual(data["status"],"10024" )
self.assertEqual(data["message"],"event number is full")
"""发布会已近结束"""
def test_add_guest_event_id(self):
json = {
"event_id": "10",
"realname": "张三",
"phone": "15210001000",
"email": "152100@qq.com",
"sign": "0"}
res = requests.post(self.url,json,self.headers)
data = res.json()
self.assertEqual(res.status_code, 200)
self.assertEqual(data["status"],"10025" )
self.assertEqual(data["message"],"event has started")
"""S使用已签到的手机号再次进行签到"""
def test_add_guest_event_id(self):
json = {
"event_id": "10",
"realname": "张三",
"phone": "15210001000",
"email": "152100@qq.com",
"sign": "0"}
res = requests.post(self.url,json,self.headers)
data = res.json()
self.assertEqual(res.status_code, 200)
self.assertEqual(data["status"],"10026" )
self.assertEqual(data["message"],"‘the event guest phone number repeat")
"""使用未签到的手机进行签到"""
def test_add_guest_event_id(self):
json = {
"event_id": "10",
"realname": "张三",
"phone": "15210001001",
"email": "152100@qq.com",
"sign": "0"}
res = requests.post(self.url,json,self.headers)
data = res.json()
self.assertEqual(res.status_code, 200)
self.assertEqual(data["status"],"200" )
self.assertEqual(data["message"],"‘add guest success")
class Sign(unittest.TestCase):
def setUp(self):
self.url = "http://127.0.0.1: 8000/api/sign/"
self.headers = {‘Content-Type‘: ‘application/json‘}
"""使用错误的请求方法"""
def test_method_get(self):
res = requests.get(self.url)
data = res.json()
self.assertEqual(data["status"],"404" )
self.assertEqual(data["message"],"请求方法错误")
"""请求参数为空"""
def test_method_get(self):
json = {}
res = requests.post(self.url,json,self.headers)
data = res.json()
self.assertEqual(data["status"],"10020" )
self.assertEqual(data["message"],"parameter is null")
"""请求参数 值为空"""
def test_method_get(self):
json = {"eid":"",
"phone":""}
res = requests.post(self.url,json,self.headers)
data = res.json()
self.assertEqual(data["status"],"10021" )
self.assertEqual(data["message"],"parameter error")
"""发布会id不存在"""
def test_method_get(self):
json = {"eid":9999,
"phone":"15210001000"}
res = requests.post(self.url,json,self.headers)
data = res.json()
self.assertEqual(data["status"],"10022" )
self.assertEqual(data["message"],"event id null")
"""发布会状态是关闭的"""
def test_method_get(self):
json = {"eid":1,
"phone":"15210001000"}
res = requests.post(self.url,json,self.headers)
data = res.json()
self.assertEqual(data["status"],"10023" )
self.assertEqual(data["message"],"event status is not available")
"""当前时间大于发布会时间,发布会已经开始了"""
def test_method_get(self):
json = {"eid":1,
"phone":"15210001000"}
res = requests.post(self.url,json,self.headers)
data = res.json()
self.assertEqual(data["status"],"10024" )
self.assertEqual(data["message"],"event has started")
"""使用嘉宾表不存在的手机号测试"""
def test_method_get(self):
json = {"eid":1,
"phone":"1521888888"}
res = requests.post(self.url,json,self.headers)
data = res.json()
self.assertEqual(data["status"],"10025" )
self.assertEqual(data["message"],"user phone null")
"""使用其他发布会手机号测试"""
def test_method_get(self):
json = {"eid":2,
"phone":"1521888888"}
res = requests.post(self.url,json,self.headers)
data = res.json()
self.assertEqual(data["status"],"10026" )
self.assertEqual(data["message"],"user did not participate in the conference")
"""使用已签到的手机号测试"""
def test_method_get(self):
json = {"eid":1,
"phone":"15210001000"}
res = requests.post(self.url,json,self.headers)
data = res.json()
self.assertEqual(data["status"],"10027" )
self.assertEqual(data["message"],"user has sign in")
"""正常签到"""
def test_method_get(self):
json = {"eid":1,
"phone":"15210001001"}
res = requests.post(self.url,json,self.headers)
data = res.json()
self.assertEqual(data["status"],"200" )
self.assertEqual(data["message"],"sign success")
if __name__ == ‘__main__‘:
unittest.main()
?
【Django 2021年最新版教程35】python+request+unittest 对Django接口进行测试
原文:https://blog.51cto.com/shijianfeng/2986746