最近,在做测试开发平台的时候,需要对测试用例的列表进行后端分页,在实际去写代码和测试的过程中,发现这里面还是有些细节的,故想复盘一下,所以有了这篇文章。

分页的目的

做个假设,加入用例库有 1W 条数据,如果想要以列表形式展示,一次性返回 1W 条数据;这样做有两个弊端:

1.这样写出来的接口会慢。想一下如果随着时间的发展,这个数量变成了 10W、100W 该怎么办?

2.对前端不友好。用前端渲染 1W 条数据,有理智的开发都不会这么做。

所以,我们做分页的目的,主要是为了性能的提高,提高使用体验。

我这边开发语言是Python,Web框架用的是 Tornado,后台数据库用的是 Mongodb。

接口设计

首先,我们做一下接口的设计,如下:

HTTP URL: /api/admin/v1/case/list
HTTP Method: GET
Request Params
Reponse Data
{"code": 0,"message": null,"data": {"cases": [{"method": str,"url": str,"request_data"?: str,"request_params"?: str,"header": dict,"reponse_data"?: str},...],"count": int}
}

返回数据结构解析:

  • cases 的值是包含多个 case 对象的列表;
  • count 指的是 case 的总数,这样前端就可以通过 count 来判断一共有多少页,然后通过点击的页数直接请求到对应页的数据做展示,这样做可以有效的控制返回的数据量以及返回时间,提高用户体验感。

根据上述的接口约定,接口实现如下(仅展示关键代码):

class CaseList(APIHandler):async def get_handler(self):page = self.input.page or 1limit = self.input.limit or 12page, limit = int(page), int(limit)skip = limit * (page - 1)return {'customers': await CaseService.get_case_list(filter_={}, skip=skip, limit=limit),'count': await CaseService.get_count(filter_={})}

接口解读

下面我们逐行来解读这个接口。

1.根据 API 约定,page和limit是不必传且有默认值,所以获取时可以直接写为self.input.page or 1,其中当page不传时self.input.page为None。

2.后端获取到的GET请求的请求参数是String,所以需要int()转为整型,这里直接int(page)即可,因为经过了前面的处理,page必然是有值的。

3.通过limit * (page - 1),计算出跳过多少个;白话描述skip的作用就是,从第skip个对象开始,往后取limit个,返回。

4.get_case_list方法和get_count方法的filter_参数的值应该保持一致,因为他们都是对case这个对象做操作,只不过count是取总数而已。

CaseService.get_case_list方法

async def get_case_list(filter_: dict, skip: int = None, limit: int = None) -> Optional[List[dict]]:""" 获取 case 列表 """sort = [('create_time', -1)]if skip is not None and limit is not None:ret = await cls.find('case', filter=filter_, sort=sort, limit=limit, skip=skip)else:ret = await cls.find('case', filter=filter_, sort=sort)return ret

1.对skip和limit的空值判断要用is not None,因为skip可能为,如果使用if skip来判断,skip=0的时候也会进入分支。

2.sort = [(‘create_time’, -1)]的传入使返回的列表按照创建时间倒叙排列,如果你不做这个,相信负责人的测试同学会给你提一个“易用性问题”。

3.sort + skip + limit是有执行优先级的,他们优先级依次是sort→skip→limit,skip+limit的优先级为skip→limit。

这里大家不要去考虑pymogo执行的时候会不会对sort、skip、limit自动给按照优先级执行,传参的时候按照优先级去传参就好了,养成良好的习惯,不必纠结其他的。

CaseService.get_count方法

async def get_count(cls, filter_: dict) -> int:""" 获取 case 总数 """return await ModelHandler.count('case', filter=filter_)

这里用count来获取数据,可以直接拿到总数,而不是取出list然后去求length,避免了内存空间的浪费。

以上,就是对列表接口进行分页的整个过程啦,谢谢阅读,这不是一篇喂饭教程,是带你熟悉了写这个接口的整个过程及其中的细节,具体的实现还需要大家动手去实践。

最后: 可以在公众号:伤心的辣条 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!喜欢软件测试的小伙伴们,可以加入我们的测试技术交流扣扣群:914172719(里面有各种软件测试资源和技术讨论)


好文推荐

转行面试,跳槽面试,软件测试人员都必须知道的这几种面试技巧!

面试经:一线城市搬砖!又面软件测试岗,5000就知足了…

面试官:工作三年,还来面初级测试?恐怕你的软件测试工程师的头衔要加双引号…

什么样的人适合从事软件测试工作?

那个准点下班的人,比我先升职了…

测试岗反复跳槽,跳着跳着就跳没了…

如何优雅的对列表接口进行分页?相关推荐

  1. Python如何优化列表接口进行分页

    最近,在做测试开发平台的时候,需要对测试用例的列表进行后端分页,在实际去写代码和测试的过程中,发现这里面还是有些细节的,故想复盘一下 分页的目的 做个假设,加入用例库有 1W 条数据,如果想要以列表形 ...

  2. 【测试开花】三、项目管理-后端-实现列表接口(含分页、模糊查询)

    基于 springboot+vue 的测试平台开发继续更新. 打开项目管理,就需要看到列表里展示项目数据,比如这样(截图是这个前端框架的demo,仅作示意): 那么对应到我们平台的项目管理功能,就需要 ...

  3. 淘宝京东拼多多抖音1688苏宁淘特等关键词搜索商品API接口(关键词搜索商品API接口,关键词搜索商品列表接口,分类ID搜索商品列表接口,关键词搜索商品销量接口)

    淘宝京东拼多多抖音1688苏宁淘特等关键词搜索商品API接口(关键词搜索商品API接口,关键词搜索商品列表接口,分类ID搜索商品列表接口,关键词搜索商品销量接口)代码对接如下: 1.公共参数 名称 类 ...

  4. 尚医通-医院列表接口-等级接口-功能测试(二十二)

    目录: (1)医院列表接口-医院等级接口  (2)医院列表接口-远程调用  (3)医院列表接口-功能测试 (1)医院列表接口-医院等级接口 由于我们的医院等级.省市区地址都是取的数据字典value值, ...

  5. 六、教师管理-列表查询、分页、搜索

    一. 需求分析 教师管理主要针对充值教师进行管理,首先开发教师管理模块中的列表功能,包含条件查询.下拉框.日期功能. 数据列表.分页. 二. 教师数据列表 1 nodejs 添加数据列表接口,去nod ...

  6. 分页技巧_实现第一个分页功能(回复列表中的分页)

    分页技巧_实现第一个分页功能(回复列表中的分页) ======================================== 假设共25条数据,每页显示10条,则共3页 first  max - ...

  7. 转载:如何优雅的实现INotifyPropertyChanged接口

    转载来源:http://www.cnblogs.com/TianFang/p/6240933.html 如何优雅的实现INotifyPropertyChanged接口 INotifyPropertyC ...

  8. 第三百八十九节,Django+Xadmin打造上线标准的在线教育平台—列表筛选结合分页...

    第三百八十九节,Django+Xadmin打造上线标准的在线教育平台-列表筛选结合分页 根据用户的筛选条件来结合分页 实现原理就是,当用户点击一个筛选条件时,通过get请求方式传参将筛选的id或者值, ...

  9. element 修改分页样式_如何给wordpress网站的文章列表,添加分页效果?可以通过2种方式...

    在上一章节中,我们为wordpress网站的首页添加了全站文章列表.一个wordpress网站不可能只有几篇文章,可能会有成千上万的文章,作为一个wordpress博客主题模板,一般情况下,不可能让所 ...

最新文章

  1. MSSQL 2008里事务的一个问题
  2. 鸿蒙系统开发者公测,公测尝鲜开启!华为Mate40/P40开始和安卓渐行渐远
  3. Linux下的LVM创建以及Linux快照卷
  4. hive 小技巧总结
  5. sql-server基础知识四(视图和索引)
  6. c++语言表白超炫图形_青少年编程学习之C语言怎么学?现在知道,将来不亏!...
  7. 作者招募 | 加入PaperWeekly,让你的文字被更多人看到
  8. ansys添加力矩_ANSYS软件中施加扭矩的方法
  9. .net mvc actionresult 返回字符串_Spring 框架基础(06):Mvc架构模式简介,执行流程详解
  10. linux 文本 编辑 软件下载,文本编辑软件 Atom 1.5.0 已经发布下载
  11. 什么是应用管理与运维平台(ServiceStage)?
  12. 动态规划01背包问题入门学习,详细笔记,推荐阅读
  13. Spark中的Shuffle算子
  14. CCF推荐的计算机顶级期刊和论文参考
  15. 局域网部署文档协同办公系统:Windows + onlyoffice + dzzoffice
  16. ICT技术成熟度曲线:零信任、数据安全、云原生安全的兴起
  17. ms vc9 php,php连接sql server数据库库
  18. JAVA实现接入企业微信报警
  19. 计算机无法搜索到计算器,我的电脑中的计算器没有了,怎么办?
  20. 什么是站群以及站群的排名原理和作用解答

热门文章

  1. python约瑟夫环算法和流程图_约瑟夫环问题及python与c++实现效率对比
  2. Pandas+Pyecharts:2021中国大学综合排名分析+可视化,来围观看看你的大学上榜没
  3. xmos驱动_独家!XMOS发表最新Xcore.ai“跨界处理器”
  4. python渲染html页面_在Python中使用CasperJS获取JS渲染生成的HTML内容的教
  5. 如何下载python模块_python中模块包的离线下载教程
  6. 何时、何地应用何种窗函数?
  7. linux桌面环境与窗口管理器,窗口管理器和桌面环境的区别 | MOS86
  8. dos从优盘启动计算机,DOS启动版U盘制作方法(usbboot)
  9. webpack4+vue打包简单入门
  10. mesos 学习笔记-- mesos安装和配置