大家好~我是
米洛
!
我正在從0到1打造一個開源的介面測試平臺, 也在編寫一套與之對應的教學
,希望大家多多支援。
歡迎關注我的公眾號米洛的測開日記
,獲取最新文章教學!
上一節我們構思了一下怎麼去支援Python指令碼,在和@joker討論以後,考慮到python指令碼不會太複雜,所以我們這一節我們就先實現exec
的版本。
exec是一個比較厲害的內建庫
,它為想要執行python程式碼的使用者提供了便利,與之對應的還有execfile版本,這個是檔案版本的exec,也就是說,他接受的引數從一段程式碼變成了一個指定的檔案
。
上一節我們似乎介紹了exec的普通用法,那今天我們就講講怎麼通過exec拿到對應的執行結果,畢竟對於執行結果我們是會渴望能拿到的。
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'])
其實本身是不想提供這個介面的,因為大部分指令碼都可以在本地測試後傳上來,但想了下,有就有吧,對於os.remove這樣危險的語句還是得禁止掉。
不過由於是演示,我就不禁止了。
先看一張效果圖,執行完成後會有資料返回。但一定要注意的是,如果想拿到返回值,必須要有:
current_time = xxx
,並且把返回值設定為current_time。
為什麼呢?因為exec本身是拿不到返回值的,如果你去exec語句裡面定義一個變數:
current_time2 = "234"
這樣就能在loc裡面取到返回值了,所以如果要求有返回值,則必須寫上上述的python語句。
我們就是通過exec執行程式碼,定義變數為返回值,接著取出該變數的方式實現整個過程的。
來看下程式碼怎麼寫:
和上文提到的一樣,如果沒有返回值的話,直接就是None了。
和redis操作很相似,實現run方法,也是記錄資料並拿到返回值。
新增Python型別,注意這裡我把這些數位,0-3都放到了Config類裡面。
提醒一下各位,比如我這裡的方法沒有給出對應的檔案路徑,大家可以全域性搜尋,找到之。
對應Config.py也增加了這樣的子類。
頁面基本是沿用的Redis的部分,在外部也稍微改造了一下:
改用開關的形式,看起來更直觀。
今天的內容就介紹到這裡了,歡迎大家積極提出建議,一起打造一款開源工具。