測試平臺系列(70) 豐富斷言型別

米洛丶發表於2021-11-02

大家好~我是米洛

我正在從0到1打造一個開源的介面測試平臺, 也在編寫一套與之對應的完整教程,希望大家多多支援。

歡迎關注我的公眾號測試開發坑貨,獲取最新文章教程!

回顧

上一節我們支援了SQL型別的構造方法。

接下來我們要講的是如何豐富我們的斷言型別。

基礎斷言

我們之前的斷言部分還是比較殘缺的,就好像辟邪劍譜一樣。今天我們就來儘量完善下斷言的內容。

先看看之前的斷言型別:

  • 等於
  • 不等於
  • 屬於

但這些往往還不夠,我們還需要新增一些。還記得我們之前寫的如何比對2個JSON物件嗎?我們今天也要把它運用到實戰裡面。

編寫utils/json_compare.py

由於之前已經講過json對比的思路,所以這邊貼一下原始碼,並把JsonCompare類進行單例包裝。

import json

from app.utils.decorator import SingletonDecorator


@SingletonDecorator
class JsonCompare(object):

    def compare(self, exp, act):
        ans = []
        self._compare(exp, act, ans, '')
        return ans

    def _compare(self, a, b, ans, path):
        a = self._to_json(a)
        b = self._to_json(b)
        if type(a) != type(b):
            ans.append(f"{path} 型別不一致, 分別為{type(a)} {type(b)}")
            return
        if isinstance(a, dict):
            keys = []
            for key in a.keys():
                pt = path + "/" + key
                if key in b.keys():
                    self._compare(a[key], b[key], ans, pt)
                    keys.append(key)
                else:
                    ans.append(f"{pt} 在實際結果中不存在")
            for key in b.keys():
                if key not in keys:
                    pt = path + "/" + key
                    ans.append(f"{pt} 在實際結果中多出")
        elif isinstance(a, list):
            i = j = 0
            while i < len(a):
                pt = path + "/" + str(i)
                if j >= len(b):
                    ans.append(f"{pt} 在實際結果中不存在")
                    i += 1
                    j += 1
                    continue
                self._compare(a[i], b[j], ans, pt)
                i += 1
                j += 1
            while j < len(b):
                pt = path + "/" + str(j)
                ans.append(f"{pt} 在預期結果中不存在")
                j += 1
        else:
            if a != b:
                ans.append(
                    f"{path} 資料不一致: {a} "
                    f"!= {b}" if path != "" else
                    f"資料不一致: {a} != {b}")

    def _color(self, text, _type=0):
        if _type == 0:
            # 說明是綠色
            return """<span style="color: #13CE66">{}</span>""".format(text)
        return """<span style="color: #FF4949">{}</span>""".format(text)

    def _weight(self, text):
        return """<span style="font-weight: 700">{}</span>""".format(text)

    def _to_json(self, string):
        try:
            float(string)
            return string
        except:
            try:
                if isinstance(string, str):
                    return json.loads(string)
                return string
            except:
                return string

改寫斷言方式

看看之前的斷言方式:

方式有點少,需要補充

因為我們也不可能補充很多內容,所以我們只新增一些常見的

我們新增一些,包含/不包含/包含於/不包含於/長度等於/長度大於/長度小於/JSON等於這樣的校驗方式。並且用emoji區分了是否成功。

來看看效果吧~

這樣就稍微豐富了我們們的斷言手段,但我們還有一些JSON包含等,以及文字比對相似度斷言的方式還沒派上用場,之後有機會再給大家展示。

今天的內容就分享到這兒了,有興趣的朋友們可以一起動手寫起來呀!~

(本期內容比較少,下期帶來重磅的Python的定時任務系列)

線上體驗地址: http://test.pity.fun

前端程式碼倉庫: https://github.com/wuranxu/pityWeb

後端程式碼倉庫: https://github.com/wuranxu/pity

相關文章