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

栏目: 编程工具 · 发布时间: 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
复制代码

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

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

前端改动:

新增一个复制按钮即可。

最终方案

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

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

效果展示环节:

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

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

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

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

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

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

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

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


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

查看所有标签

猜你喜欢:

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

Essential ActionScript 3.0

Essential ActionScript 3.0

Colin Moock / Adobe Dev Library / June 22, 2007 / $34.64

ActionScript 3.0 is a huge upgrade to Flash's programming language. The enhancements to ActionScript's performance, feature set, ease of use, cleanliness, and sophistication are considerable. Essentia......一起来看看 《Essential ActionScript 3.0》 这本书的介绍吧!

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

各进制数互转换器

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具