• 0
  • 0
分享
  • 如何优雅的对列表接口进行分页?——软件测试圈
  • 曼倩诙谐 2021-10-21 10:53:35 字数 2744 阅读 997 收藏 0

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

  分页的目的

  做个假设,加入用例库有 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 1
        limit = self.input.limit or 12
        page, 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,避免了内存空间的浪费。

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



作者:Ethan   

来源:http://www.51testing.com/html/90/n-4479090.html


2021 问卷礼物图.png

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 1、引言在微服务最流行的年代,开发与测试是不可缺少的环节(这说的跟没说一样),至于开发的环节,我就不说了(说的好像我会似的…);来聊一聊测试环节中的接口测试(这是我擅长的)。2、参数传递方式2.1 定义及方式接口测试目的:    验证微服务对客户端或服务暴露的接口是否能够正常工作。主要方式:    构造并发送HTTP请求消息给微服务,然后接收并验证微服务回复的HTTP响应消息。2.2 Path Parameter(路径参数)    1、在HTTP中,URL是一个很基本的概念,...
            1 2 12305
            分享
          •   前言  支付系统,这个名词相信生活在当下社会的大家应该都不在陌生了吧,他时时刻刻充斥在我们的日常生活中,哪里有交易发生,哪里就有它的身影。其实直白的来说,支付系统是扮演着连接消费者、商家、银行和其他金融机构之间的桥梁角色。对于支付系统的质量保障活动自然也成为了金融行业中产品与项目阶段的重中之重,当然除了基础的功能测试之外,安全测试也是保障支付系统的另外一个重要的保障维度,那么做为一个从事测试工作十多余年的测试管理者来说,在我眼中的境外支付系统安全测试是什么样的呢?今天就由我来为大家详细的介绍一下吧。  概念  其实境外的支付系统与我国的支付系统本质上没有特别的大的区别,但因为其本身的系统特...
            0 0 629
            分享
          • JMeter 作为一个开源的接口性能测试工具,其本身的小巧和灵活性给了测试人员很大的帮助,但其本身作为一个开源工具,相比于一些商业工具(比如 LoadRunner),在功能的全面性上就稍显不足。这篇博客,就介绍下 JMeter 的一些常用插件。JMeter Plugins Manager从 JMeter Plugins Manager 官方下载网站 下载安装 JMeter Plugins Manager。安装 JMeter Plugins Manager 后,点击 “Options” > “Plugins Manager” 打开插件管理器,其他的插件都可以在这里进行管理。Bas...
            0 0 1481
            分享
          •   测试分析与设计  测试是一门精细的学科,新人同学很容易有的误区是认为做测试主要就是编写测试用例和执行测试用例,进阶能力是写自动化脚本或研发工具。而实际上,测试人员最难修炼的是测试分析能力,测试分析能力是衡量一位测试同学是否专业的分水岭。分析除了使用方法,还需要有对业务、经验、质量的深度理解。自动化或工具实际是对分析和设计结果的一种实现,分析和设计的有效会决定实现的效果。  分析与设计过程  测试分析要从业务需求最开始就要介入,流程覆盖业务整个生命周期。在做分析的过程要想清楚,整体后续的设计怎么做。  测试分析可总结为四步:  ·建模 - 输出业务/系统流程 (分析:业务流程 - 系统流程)...
            0 0 1395
            分享
      • 51testing软件测试圈微信