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

栏目: 编程工具 · 发布时间: 5年前

内容简介:一组接口测试用例已经在测试平台中编辑好,这时候想在第一条用例经过短暂在

一组接口测试用例已经在测试平台中编辑好,这时候想在第一条用例 执行前 插入一条用例,竟发现 无从下手

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

解决思路

经过短暂 头脑风暴 ,我的大脑给出两种解决方案:

方案一: 给测试用例模型添加新属性「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 防止意外最好加个:lock:
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
复制代码

总结成一句话就是 拼命往前找 ,直到找到整个用例库中 不存在的 用例创建时间为止。

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

前端改动:

新增一个复制按钮即可。

最终方案

作为一个有追求的人,当然是选择方案二了。

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

效果展示环节:

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

可以清晰看到每复制一个用例,都会在当前用例「创建时间」前创建新用例 (列表数据默认按照创建时间倒序排序)。

最终完美实现需求: 在列表中任意用例前后插入新用例 。 (如果说要在最后一个用例后面插入新用例的话直接新建用例即可)

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

感谢读者耐心看完这篇文章,觉得有意思的点个赞哦~

有任何问题或者对笔者测试平台感兴趣的话欢迎扫码关注一下 公众号 「智能自动化测试」 哦:)

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

-- 坚持每天进步一点点,你将会在不远的将来看到不一样的自己


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

网站运维技术与实践

网站运维技术与实践

饶琛琳 / 电子工业出版社 / 2014-3 / 69.00元

网站运维工作,一向以内容繁杂、覆盖面广著称。《网站运维技术与实践》选取日常工作涉及的监测调优、日志分析、集群规划、自动化部署、存储和数据库等方面,力图深入阐述各项工作的技术要点及协议原理,并介绍相关开源产品的实践经验。在技术之外,作者也分享了一些关于高效工作及个人成长方面的心得。 《网站运维技术与实践》适合Linux 系统管理员、中大型网站运维工程师及技术负责人、DevOps 爱好者阅读。同......一起来看看 《网站运维技术与实践》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具