测试开发进阶(三十五)

导入测试数据

在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


   
   
  1. def list(self, request, *args, **kwargs):

  2. queryset = self.filter_queryset(self.get_queryset())

  3. page = self.paginate_queryset(queryset)

  4. if page is not None:

  5. serializer = self.get_serializer(page, many=True)

  6. datas = serializer.data

  7. datas = get_count_by_project(datas)

  8. return self.get_paginated_response(datas)

  9. serializer = self.get_serializer(queryset, many=True)

  10. datas = serializer.data

  11. datas = get_count_by_project(datas)

  12. return Response(datas)

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

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

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


   
   
  1. mtch = re.search(r'(.*)T(.*)\..*?', item['create_time'])

  2. item['create_time'] = mtch.group(1) + ' ' + mtch.group(2)

获取项目数据

获取接口总数


   
   
  1. project_id = item['id']

  2. interfaces_testcases_objs = Interfaces.objects.values('id').annotate(testcases=Count('testcases')). \

  3. filter(project_id=project_id, is_delete=False)

  4. interfaces_count = interfaces_testcases_objs.count()

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


   
   
  1. 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

获取用例总数


   
   
  1. testcases_count = 0

  2. for one_dict in interfaces_testcases_objs:

  3. testcases_count += one_dict['testcases']

获取配置数量


   
   
  1. interfaces_configures_objs = Interfaces.objects.values('id').annotate(configures=Count('configures')). \

  2. filter(project_id=project_id, is_delete=False)

  3. configures_count = 0

  4. for one_dict in interfaces_configures_objs:

  5. configures_count += one_dict['configures']

相当于执行了以下SQL


   
   
  1. 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

获取测试套件总数


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

整个函数


   
   
  1. import re

  2. from django.db.models import Count

  3. from interfaces.models import Interfaces

  4. from testsuits.models import Testsuits

  5. def get_count_by_project(datas):

  6. datas_list = []

  7. for item in datas:

  8. mtch = re.search(r'(.*)T(.*)\..*?', item['create_time'])

  9. item['create_time'] = mtch.group(1) + ' ' + mtch.group(2)

  10. project_id = item['id']

  11. interfaces_testcases_objs = Interfaces.objects.values('id').annotate(testcases=Count('testcases')). \

  12. filter(project_id=project_id, is_delete=False)

  13. interfaces_count = interfaces_testcases_objs.count()

  14. testcases_count = 0

  15. for one_dict in interfaces_testcases_objs:

  16. testcases_count += one_dict['testcases']

  17. interfaces_configures_objs = Interfaces.objects.values('id').annotate(configures=Count('configures')). \

  18. filter(project_id=project_id, is_delete=False)

  19. configures_count = 0

  20. for one_dict in interfaces_configures_objs:

  21. configures_count += one_dict['configures']

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

  23. item['interfaces'] = interfaces_count

  24. item['testsuits'] = testsuits_count

  25. item['testcases'] = testcases_count

  26. item['configures'] = configures_count

  27. datas_list.append(item)

  28. return datas_list

结果

返回分页内容

配置 setting.py


   
   
  1. REST_FRAMEWORK = {

  2. 'PAGE_SIZE': 10,

  3. 'DEFAULT_PAGINATION_CLASS': 'utils.pagination.PageNumberPaginationManual',

  4. }

编写自定义分页操作

utils.pagination.PageNumberPaginationManual


   
   
  1. from django.conf import settings

  2. from rest_framework import pagination

  3. class PageNumberPaginationManual(pagination.PageNumberPagination):

  4. max_page_size = 50

  5. page_size_query_param = 'size'

  6. page_query_description = '第几页'

  7. page_size_query_description = '每页几条'

  8. def get_paginated_response(self, data):

  9. response = super(PageNumberPaginationManual, self).get_paginated_response(data)

  10. response.data['total_pages'] = self.page.paginator.num_pages

  11. response.data['current_page_num'] = self.page.number

  12. return response

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值