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

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   新手学软件测试工程师学得好吗?如果你想转行到IT行业,软件测试是一门相对简单的学科,非常适合零基础的人学习。如果你决心学好软件测试并充满兴趣,那么学习不会太难。如果你是转行的人,买本软件测试书先学习基础知识,对基础知识有一定的理解很重要。  新手的软件测试课程实际上并不难学习,具有一定的学历,非计算机专业背景也可以学,软件测试不需要敲太多代码,只要操作测试工具进行测试就可以,细心耐心就可以胜任。软件测试入门简单,但深入困难,入门时只要理解中文,理解能力没有问题,就可以根据测试用例实施用例。  测试理论知识的学习测试定义、测试分类、测试方法、测试生命周期、测试计划、测试方案、测试策略、测试用...
            0 0 814
            分享
          • 读者提问:工作中大家用的比较多的测试用例管理工具有哪些呢 ?阿常回答:1、Excel 2、WPS3、Xmind4、GitMind5、MindMaster6、iMindMap7、MindNode8、MindLine9、zhimap10、Mindjet Maps11、思维简图12、3A 思维导图13、ProcessOn14、用例管理工具:PingCode、TestLink阿常碎碎念:阿常在平时工作中 1、13、14 使用得更多一些。1 用于本地写测试用例;13 用于在线写测试大纲;14 用于做测试用例管理。看完今天的分享对你是不是有所启发呢,有任何想法都欢迎大家后台私信阿常,一...
            0 0 1147
            分享
          •   1、压测机  无论是从成本角度还是维护的难易方面,压测机的数量,适量就好。举个例子,8C16G的一台服务器,部署Jmeter后,根据我个人的测试比对数据,配置≤1500个线程数,最好。太多了性能损耗较大,延时高;太少了又浪费。controller与agent:模拟的并发线程数超过5K,建议留出一台做专门的controller机器,主要是避免agent机器数据上报带来的影响。服务授权:如果压测启动和服务配置都是root权限,那么在linux环境下,需要给jmeter和jmeter-server授权,命令为:  chmod 777 jmeter  2、服务通信  所有的压测...
            0 0 912
            分享
          • 1. 游戏测试主要内容1. 功能测试功能测试是游戏测试中最常见的模式,主要测试方法为黑盒测试功能测试主要用来验证功能是否符合需求设计功能测试主要考虑正确性,而不考虑游戏底层结构及代码错误功能测试通常从界面着手开始测试,尽量模拟用户可能出现的操作。从需求的角度来发现功能中的一些缺陷,并反馈2. 客户端的性能测试客户端CPU使用率客户端内存占用率客户端网络流量使用情况客户端耗电量客户端贞率(FPS)ios常用工具:xcode自带的instrument安卓常用工具emmage和GT3. 服务端的压力测试服务器cpu使用率服务器内存占用率系统吞吐量(TPS)事务响应时间事务成功率通常会写机器人模拟大量...
            0 0 1799
            分享
          • 首先我们先明确测试用例是什么?个人觉得测试用例应该有:标题,测试目的,前提(预设条件),测试步骤,预期结果等。测试人员可以根据测试用例的这些要素,可以执行测试。那么它在软件测试流程中是必需的吗?先分享下个人关于测试用例方面的经历:A公司和B公司。A公司有完备的大型软件开发流程,产品有自己完备的测试用例库和测试用例管理规范,在项目中也有测试用例的输出阶段:功能需求和概要设计出来以后,测试人员就根据这些输入开始着手准备测试用例,接下来还会经历测试用例点的评审和测试用例的定稿阶段,测试人员根据完成的用例执行测试。在项目发布之后,还会预留时间对测试用例进行修改入库。这些入库的测试用例会作为回归测试的全...
            1 1 3688
            分享
      • 51testing软件测试圈微信