灵机一动之优雅实现用例顺序插入

发表于:2019-6-11 11:47

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:泰斯特test    来源:掘金

  起源
  一组接口测试用例已经在测试平台中编辑好,这时候想在第一条用例执行前插入一条用例,竟发现无从下手。
  解决思路
  经过短暂头脑风暴,我的大脑给出两种解决方案:
  方案一: 给测试用例模型添加新属性testOrder, 用于表示该用例的执行顺序。
  后端改动:
  在新增用例,和修改用例接口中实现 「testOrder」 属性的添加以及修改,并且需要在 执行用例 接口中将一组接口用例按照 「testOrder」 顺序执行。
  仔细一想其实也并非那么简单,新增用例时,需要先搜索当前用例组中最大的 「testOrder」 值,然后将 「最大的testOrder值」+ 1 后写入用例中。这样的话需要给新增用例接口加个锁,否则可能会导致一组用例中存在相同的 「testOrder」 值。
  还有,在修改用例顺序时,需要将当前用例所属用例组中部分用例执行顺序进行重新排序并更新 「testOrder」 值。还有 ... ... ... ...
  既然你(我)都(也)不想听了那么我们进入方案二好了咯
  方案二: 用例执行顺序改为按照创建时间执行。实现一个复制用例的功能同时间接实现用例插入
  后端改动:
  首先在获取测试用例时多加一个sort排序即可,代码如下:
   testing_cases = TestingCase.find({'isDeleted': {'$ne': True}})
  .sort([('createAt', pymongo.ASCENDING)]) # 我就是传说中的 sort排序
   然后新增一个复制用例的接口,也不复杂,核心代码如下:
   # 先获取原用例数据
  test_case = TestingCase.find_one({'_id': ObjectId(case_id)})
  # 去除原用例_id属性
  test_case.pop('_id') if test_case.get('_id') else None
  # 去除原用例createAt属性
  test_case_create_at = test_case.pop('createAt') if 'createAt' in test_case else datetime.datetime.utcnow()
  # 获取新用例的「创建时间」
  new_test_case_create_at = get_new_create_at(test_case_create_at) # 划重点 划重点 划重点
  # 设置新用例的名称后缀便于区分
  new_case_name_suffix = '(复制版)'
  # 设置新用例名称
  new_case_name = test_case.pop('name') + new_case_name_suffix \
  if 'name' in test_case else '未知接口用例' + new_case_name_suffix
  # 赋值
  test_case['createAt'] = new_test_case_create_at
  test_case['name'] = new_case_name
  # 插入数据
  TestingCase.insert(test_case)
   过程就是先将待复制用例中的 _id 以及 createAt 属性去除,然后根据原有用例创建时间生成新用例的创建时间,
  接着设置新用例名称后将数据插入数据库
  相信大家都对上面代码中的 get_new_create_at 函数抱有好奇心 :)
   #TODO 防止意外最好加个🔒
  def get_new_create_at(create_at):
  time_quantity = 1
  while True:
  new_create_at = create_at - datetime.timedelta(milliseconds=time_quantity)
  find_result = list(TestingCase.find({'createAt': new_create_at}))
  has_identical_create_at_case = True if len(find_result) > 0 else False
  if not has_identical_create_at_case:
  return new_create_at
  else:
  time_quantity += 1
   总结成一句话就是拼命往前找,直到找到整个用例库中不存在的用例创建时间为止。
  前端改动:
  新增一个复制按钮即可。
  最终方案
  作为一个有追求的人,当然是选择方案二了。
  效果展示环节:
  可以清晰看到每复制一个用例,都会在当前用例「创建时间」前创建新用例 (列表数据默认按照创建时间倒序排序)。
  最终完美实现需求: 在列表中任意用例前后插入新用例。 (如果说要在最后一个用例后面插入新用例的话直接新建用例即可)

      上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号