靈機一動之優雅實現用例順序插入

起源

一組接口測試用例已經在測試平臺中編輯好,這時候想在第一條用例執行前插入一條用例,竟發現無從下手前端

解決思路

通過短暫頭腦風暴,個人大腦給出兩種解決方案:數據庫

方案一: 給測試用例模型添加新屬性 「testOrder」 , 用於表示該用例的執行順序。

後端改動:

新增用例,和修改用例接口中實現 「testOrder」 屬性的添加以及修改,而且須要在 執行用例 接口中將一組接口用例按照 「testOrder」 順序執行。後端

仔細一想其實也並不是那麼簡單,新增用例時,須要先搜索當前用例組中最大的 「testOrder」 值,而後將 「最大的testOrder值」+ 1 後寫入用例中。這樣的話須要給新增用例接口加個鎖,不然可能會致使一組用例中存在相同的 「testOrder」 值。ide

還有,在修改用例順序時,須要將當前用例所屬用例組中部分用例執行順序進行從新排序更新 「testOrder」 值。還有 ... ... ... ...函數

既然你(我)都(也)不想聽了那麼咱們進入方案二好了咯測試

方案二: 用例執行順序改成按照「建立時間」執行。實現一個「複製用例」的功能同時「間接實現用例插入」

後端改動:

首先在獲取測試用例時多加一個sort排序便可,代碼以下:spa

testing_cases = TestingCase.find({'isDeleted': {'$ne': True}})
                                .sort([('createAt', pymongo.ASCENDING)]) # 我就是傳說中的 sort排序
複製代碼

而後新增一個複製用例的接口,也不復雜,核心代碼以下:3d

# 先獲取原用例數據
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 屬性去除,而後根據原有用例建立時間生成新用例的建立時間, 接着設置新用例名稱後將數據插入數據庫。code

相信你們都對上面代碼中的 get_new_create_at 函數抱有好奇心 :)cdn

#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
複製代碼

總結成一句話就是拼命往前找,直到找到整個用例庫中不存在的用例建立時間爲止。

前端改動:

新增一個複製按鈕便可。

最終方案

做爲一個有追求的人,固然是選擇方案二了。

效果展現環節:

能夠清晰看到每複製一個用例,都會在當前用例「建立時間」前建立新用例 (列表數據默認按照建立時間倒序排序)。

最終完美實現需求: 在列表中任意用例先後插入新用例。 (若是說要在最後一個用例後面插入新用例的話直接新建用例便可)

感謝讀者耐心看完這篇文章,以爲有意思的點個贊哦~

有任何問題或者對筆者測試平臺感興趣的話歡迎掃碼關注一下 公衆號 「智能自動化測試」 哦:)

--堅持天天進步一點點,你將會在不遠的未來看到不同的本身

相關文章
相關標籤/搜索