測試平台系列(83) 前置條件支持Redis語句


大家好~我是米洛

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

歡迎關注我的公眾號米洛的測開日記,獲取最新文章教程!

回顧

上節我們打了個野,解決了一下APScheduler的重復執行問題。在更上一節,我們編寫好了Redis的在線執行功能。

那這一節我們就得把它運用到前置條件里面來了。

成果展示

由於博主都是先編碼,再寫文。所以是能展示成果的,今日份變化如下:

  • 支持了前置條件(REDIS類型)

稍微改動了下頁面, 感覺有些花里胡哨了

點擊左邊播放按鈕可以在線執行redis命令

思路

前置條件要想支持Redis,思路其實很簡單,模式也和SQL差不多。所以我們可以照搬SQL的代碼。

之前我們的Executor都放在utils包下面,其實很不友好。為了顯示專業性,我決心把Executor從utils抽離出來,放到新目錄core下面。

這個core目錄打算放一些用例執行的核心方法,咱們拭目以待。

如何修改文件而不影響其他數據

這個就需要偉大的Pycharm了,我們其實新建一個core目錄以后,直接把executor.py移動到core目錄即可。

通過pycharm移動文件,他不僅僅只是移動文件那么簡單,它還會幫你處理這個文件引入了哪些包,如果路徑發生變化了,他也會自動幫忙更新,如果有其他文件引用了executor.py,它也會順道幫助更新。

有如此強大的ide作為支撐,所以我玩起來也是隨心所欲

拆分Executor

隨着case執行的邏輯越來越多,我們的executor.py有點hold不住,倒不是說一個py文件不能放1000行代碼,只是我們沒有必要讓它那么臃腫

我們最能拆除的就是執行構造方法的函數了,首先我們的構造方法有固定的幾種,先看看只支持sql和用例的時候,我們是怎么寫的:

    async def execute_constructor(self, env, index, path, params, req_params, constructor: Constructor):
        if not constructor.enable:
            self.append(f"當前路徑: {path}, 構造方法: {constructor.name} 已關閉, 不繼續執行")
            return
        if constructor.type == 0:
            try:
                data = json.loads(constructor.constructor_json)
                case_id = data.get("case_id")
                testcase, _ = await TestCaseDao.async_query_test_case(case_id)
                self.append(f"當前路徑: {path}, 第{index + 1}條構造方法")
                # 說明是case
                executor = Executor(self.logger)
                new_param = data.get("params")
                if new_param:
                    temp = json.loads(new_param)
                    req_params.update(temp)
                result, err = await executor.run(env, case_id, params, req_params, f"{path}->{testcase.name}")
                if err:
                    raise Exception(err)
                if not result["status"]:
                    raise Exception(f"斷言失敗, 斷言數據: {result.get('asserts', 'unknown')}")
                params[constructor.value] = result
                # await self.parse_params(testcase, params)
            except Exception as e:
                raise Exception(f"{path}->{constructor.name} 第{index + 1}個構造方法執行失敗: {e}")
        elif constructor.type == 1:
            # 說明是sql語句
            try:
                self.append(f"當前路徑: {path}, 第{index + 1}條構造方法")
                data = json.loads(constructor.constructor_json)
                database = data.get("database")
                sql = data.get("sql")
                self.append(f"當前構造方法類型為sql, 數據庫名: {database}\nsql: {sql}\n")
                sql_data = await DbConfigDao.execute_sql(env, database, sql)
                params[constructor.value] = sql_data
                self.append(f"當前構造方法返回變量: {constructor.value}\n返回值:\n {sql_data}\n")
            except Exception as e:
                raise Exception(f"{path}->{constructor.name} 第{index + 1}個構造方法執行失敗: {e}")

可以看到,才2種方法,就已經很臃腫了。其實更可讀一點的寫法,需要把幾種構造方法拆開,拆開后分別有一個run方法,這樣我們只需要判斷類型是啥,執行對應的run方法即可。

新建abstract基類

from abc import ABC

from app.models.constructor import Constructor


class ConstructorAbstract(ABC):

    @staticmethod
    def run(executor, env, index, path, params, req_params, constructor: Constructor, **kwargs):
        pass

基類方法類似Java的abstract類,定義一個類,不實現里面的方法則無法實例化

  • sql實現

和以前類似,只是把代碼拷貝了過來,放到了新類下面

  • testcase實現

測試用例這兒有些復雜的變動:

一般來說,我們是case調用前置條件的run方法,但由於測試用例需要再次調用executor,所以導致了什么呢?

executor引用testcase引用executor,也就是引用循環,這在python里面是禁止的,畢竟你套娃了!

所以這里采取的土方法是把我的Executor類當參數傳遞進來 =。=(夠土)

  • redis實現

    其實執行redis的時候我們已經編寫過類似的方法了,但因為之前是根據id執行redis,現在要改改,需要根據name執行。

    根據name執行有些迫不得已,主要是因為我們case編寫是適配多套環境,如果傳入id的話,那么redis對應的都是固定環境的配置,無法適配多環境。

    和sql一樣,我們采取 env+name確定redis連接(name不變,env切換的時候,redis連接也變成動態了)

redis執行命令還需改動一下唉:

這里傳入的參數不只是id了,當你傳入id=xx的時候則根據id查詢,傳入name=xxx的時候就根據name查詢,兼容了在線執行redis的接口

executor收尾

新的執行構造方法的函數很輕便,雖然也有if else,但比之前一坨好多了)

最終效果

看起來一目了然,其實有點像interface和impl。


今天的內容就到這里啦~下一波做啥還沒想好,可能會完善后置條件或者在線執行case也或者七牛雲oss吧。前路漫漫,都已經83節了。

在線體驗: http://test.pity.fun

喜歡的話可以給pity點個star哦,你們的star是我的動力= =


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM