您当前的位置: 首页 >  Python
  • 0浏览

    0关注

    1477博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Django 2021年最新版教程35】python+request+unittest 对Django接口进行测试

软件工程小施同学 发布时间:2021-07-02 09:32:38 ,浏览量:0

一、测试对象

对于接口类函数,即被GET、POST调用的函数

二、步骤 1. 使用request发送GET、POST请求

请提前安装requests模块

pip install requests

2. 使用unittest作单元测试

3. 使用.json()解析返回值

三、规则 1. 被测代码的一个python文件对应一个unittest测试文件

2. 每个unittest测试文件中可以包含多个类

3. 每个类对应一个被测函数

4. 每个类可以包含多个测试用例函数

5. 每个测试用例函数对应一个测试用例

四、举例 1. 对于仅仅渲染展示页面的函数

比如

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()

2. 对于同时渲染数据和展示页面的函数

比如下面的函数读取了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加载。这样就可以分开测试了

3. 需要POST提交的函数

比如

# 保存设置展示信息
@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()

4. 有的接口需要在用户登陆的情况下测试

比如测试下面的接口,其中读取了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']             
关注
打赏
1665320866
查看更多评论
0.0833s