測試平臺系列(95) 前置條件支援簡單的python指令碼

米洛丶發表於2022-05-29

大家好~我是米洛

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

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

回顧

上一節我們構思了一下怎麼去支援Python指令碼,在和@joker討論以後,考慮到python指令碼不會太複雜,所以我們這一節我們就先實現exec的版本。

exec初體驗

exec是一個比較厲害的內建庫,它為想要執行python程式碼的使用者提供了便利,與之對應的還有execfile版本,這個是檔案版本的exec,也就是說,他接受的引數從一段程式碼變成了一個指定的檔案

上一節我們似乎介紹了exec的普通用法,那今天我們就講講怎麼通過exec拿到對應的執行結果,畢竟對於執行結果我們是會渴望能拿到的。

  • 實現第一個python方法: 獲取本月第一天的日期
import datetime


def get_first_day_of_month():
    # 把day指定為01,肯定就是第一天啦
    return datetime.today().strftime("%Y-%m-01")

python程式碼是如此編寫的,那exec裡面我們怎麼拿到這個方法的結果呢?

首先呢,exec是沒用返回值的。我們只能通過,在exec執行的程式碼塊裡面定義變數去接收返回值。

import datetime


return_value = datetime.today().strftime("%Y-%m-01")
  

那麼在我們的後臺程式碼裡面,就可以拿到return_value作為變數。

但我實際在fastapi的方法裡面,發現是不生效的。會報return_value not defined,但是單個執行檔案確實是可以。

於是我採用了新的方法,定義一個dict,傳給exec,這樣exec裡面用到的變數等資訊,都會返回到dict裡面。

command = """
import datetime


return_value = datetime.today().strftime("%Y-%m-01")
"""
loc = dict()
exec(command, loc)
print(loc['return_value'])

編寫線上執行exec介面

其實本身是不想提供這個介面的,因為大部分指令碼都可以在本地測試後傳上來,但想了下,有就有吧,對於os.remove這樣危險的語句還是得禁止掉。

不過由於是演示,我就不禁止了。

先看一張效果圖,執行完成後會有資料返回。但一定要注意的是,如果想拿到返回值,必須要有:

current_time = xxx,並且把返回值設定為current_time。

為什麼呢?因為exec本身是拿不到返回值的,如果你去exec語句裡面定義一個變數:

current_time2 = "234"

這樣就能在loc裡面取到返回值了,所以如果要求有返回值,則必須寫上上述的python語句。

我們就是通過exec執行程式碼,定義變數為返回值,接著取出該變數的方式實現整個過程的。

來看下程式碼怎麼寫:

和上文提到的一樣,如果沒有返回值的話,直接就是None了。

編寫python資料構造器

和redis操作很相似,實現run方法,也是記錄資料並拿到返回值。

改寫獲取資料構造器的方法

新增Python型別,注意這裡我把這些數字,0-3都放到了Config類裡面。

提醒一下各位,比如我這裡的方法沒有給出對應的檔案路徑,大家可以全域性搜尋,找到之。

對應Config.py也增加了這樣的子類。

前端部分的改動

頁面基本是沿用的Redis的部分,在外部也稍微改造了一下:

改用開關的形式,看起來更直觀。


今天的內容就介紹到這裡了,歡迎大家積極提出建議,一起打造一款開源工具。

相關文章