Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >测试开发进阶(三十五)

测试开发进阶(三十五)

作者头像
zx钟
发布于 2019-11-14 06:51:08
发布于 2019-11-14 06:51:08
30200
代码可运行
举报
文章被收录于专栏:测试游记测试游记
运行总次数:0
代码可运行

导入测试数据

在Pycharm中连接数据库

执行sql

测试数据在:https://github.com/zx490336534/ApiTest/tree/master/test按照顺序执行

选择执行的目标

处理时间格式

数据库中可以看出,使用 models.DateTimeField生成的时间数据格式为 2019-11-0606:21:19.355242

我们需要返回一个 `2019-11-06 06:21:19的内容

所以我们需要重写 list

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def list(self, request, *args, **kwargs):
    queryset = self.filter_queryset(self.get_queryset())

    page = self.paginate_queryset(queryset)
    if page is not None:
        serializer = self.get_serializer(page, many=True)
        datas = serializer.data
        datas = get_count_by_project(datas)
        return self.get_paginated_response(datas)

    serializer = self.get_serializer(queryset, many=True)
    datas = serializer.data
    datas = get_count_by_project(datas)
    return Response(datas)

将对数据的处理写在 get_count_by_project函数中

通过调试可以看到获取到的datas对象为一个包含字典的列表

很容易的想到使用 正则来进行提取,并修改字典内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mtch = re.search(r'(.*)T(.*)\..*?', item['create_time'])
item['create_time'] = mtch.group(1) + ' ' + mtch.group(2)

获取项目数据

获取接口总数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
project_id = item['id']
interfaces_testcases_objs = Interfaces.objects.values('id').annotate(testcases=Count('testcases')). \
    filter(project_id=project_id, is_delete=False)
interfaces_count = interfaces_testcases_objs.count()

interfaces_testcases_objs相当于调用了以下SQL语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT `tb_interfaces`.`id`, COUNT(`tb_testcases`.`id`) AS `testcases` FROM `tb_interfaces` LEFT OUTER JOIN `tb_testcases` ON (`tb_interfaces`.`id` = `tb_testcases`.`interface_id`) WHERE (`tb_interfaces`.`is_delete` = False AND `tb_interfaces`.`project_id` = 1) GROUP BY `tb_interfaces`.`id` ORDER BY NULL

获取用例总数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
testcases_count = 0
for one_dict in interfaces_testcases_objs:
    testcases_count += one_dict['testcases']

获取配置数量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
interfaces_configures_objs = Interfaces.objects.values('id').annotate(configures=Count('configures')). \
    filter(project_id=project_id, is_delete=False)
configures_count = 0
for one_dict in interfaces_configures_objs:
    configures_count += one_dict['configures']

相当于执行了以下SQL

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT `tb_interfaces`.`id`, COUNT(`tb_configures`.`id`) AS `configures` FROM `tb_interfaces` LEFT OUTER JOIN `tb_configures` ON (`tb_interfaces`.`id` = `tb_configures`.`interface_id`) WHERE (`tb_interfaces`.`is_delete` = False AND `tb_interfaces`.`project_id` = 1) GROUP BY `tb_interfaces`.`id` ORDER BY NULL

获取测试套件总数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
testsuits_count = Testsuits.objects.filter(project_id=project_id, is_delete=False).count()

整个函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import re
from django.db.models import Count
from interfaces.models import Interfaces
from testsuits.models import Testsuits


def get_count_by_project(datas):
    datas_list = []
    for item in datas:
        mtch = re.search(r'(.*)T(.*)\..*?', item['create_time'])
        item['create_time'] = mtch.group(1) + ' ' + mtch.group(2)

        project_id = item['id']
        interfaces_testcases_objs = Interfaces.objects.values('id').annotate(testcases=Count('testcases')). \
            filter(project_id=project_id, is_delete=False)
        interfaces_count = interfaces_testcases_objs.count()
        testcases_count = 0
        for one_dict in interfaces_testcases_objs:
            testcases_count += one_dict['testcases']

        interfaces_configures_objs = Interfaces.objects.values('id').annotate(configures=Count('configures')). \
            filter(project_id=project_id, is_delete=False)
        configures_count = 0
        for one_dict in interfaces_configures_objs:
            configures_count += one_dict['configures']

        testsuits_count = Testsuits.objects.filter(project_id=project_id, is_delete=False).count()

        item['interfaces'] = interfaces_count
        item['testsuits'] = testsuits_count
        item['testcases'] = testcases_count
        item['configures'] = configures_count

        datas_list.append(item)
    return datas_list

结果

返回分页内容

配置 setting.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
REST_FRAMEWORK = {
    'PAGE_SIZE': 10,
    'DEFAULT_PAGINATION_CLASS': 'utils.pagination.PageNumberPaginationManual',
    }

编写自定义分页操作

utils.pagination.PageNumberPaginationManual

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.conf import settings
from rest_framework import pagination


class PageNumberPaginationManual(pagination.PageNumberPagination):
    max_page_size = 50
    page_size_query_param = 'size'
    page_query_description = '第几页'
    page_size_query_description = '每页几条'

    def get_paginated_response(self, data):
        response = super(PageNumberPaginationManual, self).get_paginated_response(data)
        response.data['total_pages'] = self.page.paginator.num_pages
        response.data['current_page_num'] = self.page.number
        return response
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
测试开发进阶(三十四)
数据库模型图 创建app 根据上面的数据库设计,创建9个app configures debugtalks envs interfaces projects reports testsuits tes
zx钟
2019/11/07
5660
测试开发进阶(三十四)
测试开发进阶(三十七)
ConfiguresSerializer里面用 InterfacesAnotherSerializer拿到的东西进行展示
zx钟
2019/11/14
4180
测试开发进阶(三十七)
测试开发进阶(三十六)
names中的 serializer使用 serializers.ProjectNameSerializer
zx钟
2019/11/14
4080
测试开发进阶(三十六)
测试开发进阶(三十九)
首页 使用一个简单的get函数返回需要的内容 statistics = { 'projects_count': projects_count, 'interfaces_count': interfaces_count, 'testcases_count': testcases_count, 'testsuits_count': testsuits_count, 'configures_count': configures_count, 'envs_count': envs
zx钟
2019/12/05
3210
测试开发进阶(二十八)
进入 get_object_or_404可以看到一个解包,这样就拿到了查询集中 id=1的内容
zx钟
2019/10/25
8570
测试开发进阶(三十八)
从https://cn.httprunner.org/development/dev-api/可以看出,我们可以通过传入yaml路径来执行测试
zx钟
2019/11/25
4280
测试开发进阶(三十八)
测试开发进阶(二十七)
projects.serializer.ProjectModelSerializer中添加
zx钟
2019/10/23
6900
测试开发进阶(二十七)
测试开发进阶(二十三)
「Tutorials」入门:https://docs.djangoproject.com/en/2.2/intro/
zx钟
2019/10/12
3900
测试开发进阶(二十三)
测试开发进阶(二十九)
rest_framework.generics.ListCreateAPIView
zx钟
2019/10/24
7310
测试开发进阶(二十五)
LearnDjango/settings.py中添加 'rest_framework'
zx钟
2019/10/17
9360
从入门到"精通"Django REST Framework-(五)
GenericAPIView 是 Django REST Framework (DRF) 中的一个基础视图类,它继承自 APIView,并添加了一些常用的功能,特别是与数据库模型交互的功能。它是 DRF 中通用视图和视图集的基础,提供了查询、序列化、分页等常用操作的标准实现。本质上它是 DRF 中所有通用视图(如 ListAPIView、RetrieveAPIView 等)的基础。
rxg456
2025/03/01
4420
从入门到"精通"Django REST Framework-(五)
Django REST framework+Vue 打造生鲜超市(四)
五、商品列表页 5.1.django的view实现商品列表页 (1)goods/view_base.py 在goods文件夹下面新建view_base.py,为了区分django和django rest framework的view 利用Django的view实现返回json数据 # goods/view_base.py from django.views.generic import View from goods.models import Goods class GoodsListView(Vie
zhang_derek
2018/04/11
4.9K0
Django REST framework+Vue 打造生鲜超市(四)
Django+Vue开发生鲜电商平台之11.首页、商品数量、缓存和限速功能开发
Github和Gitee代码同步更新: https://github.com/PythonWebProject/Django_Fresh_Ecommerce; https://gitee.com/Python_Web_Project/Django_Fresh_Ecommerce。
cutercorley
2020/08/05
2.3K0
Django+Vue开发生鲜电商平台之11.首页、商品数量、缓存和限速功能开发
Django REST 框架详解 05 | 视图家族 Mixins
Django REST framework 为了方便视图类的操作,构建了包括以下几种视图类和工具集:
白墨石
2021/01/12
1.3K0
Python进阶41-drf框架(三)
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
6520
Python进阶41-drf框架(三)
测试开发进阶(二十二)
让图中的 Persons变为中文:修改 projects.models.Person保存后刷新页面
zx钟
2019/09/29
7560
测试开发进阶(二十二)
DRF视图之重写mixins
我们知道,DRF视图体系,封装程度最高的是ModelViewSet,它集增删改查的mixins与GenericViewSet于一体。
倔强的数学课代表
2023/08/11
3480
django pagination 自定义分页
pagination #0 GitHub https://github.com/Coxhuang/django-Pagination #1 环境 Python3.6 Django==2.0.7 djangorestframework==3.8.2 #2 需求分析 查看某个列表式,需要分页展示 自定义分页输出的格式 自定义分页的参数 #3 开始 #3.1 新建一个Django项目 #3.2 新建文件 pagination.py(文件名随意) from rest_framework.pagination im
Autooooooo
2020/11/09
8300
3. DRF进阶之DRF视图和常用功能
APIView:DRF提供的所有视图的基类,继承View并扩展,具备了身份认证、权限检查、流量控制等功能
alexhuiwang
2023/01/16
5.4K0
Django Rest Framework(分页、视图、路由、渲染器)
1、基于limit offset 做分页(如:在url后面加上?offset=0&limit=2,即代表从第0条开始,往后取2条(即1,2))
用户1214487
2022/03/26
1.3K0
Django Rest Framework(分页、视图、路由、渲染器)
相关推荐
测试开发进阶(三十四)
更多 >
LV.1
浙江宇视科技有限公司自动化测试
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档