python裝飾器在介面自動化測試中的應用

2022-07-09 11:45:12 字數 4868 閱讀 9764

在講解裝飾器在介面自動化測試專案的應用之前,我們先來介紹一下python裝飾器到底是個什麼

說裝飾器就不得不提一下函式這個一等公民了,在python中函式有幾個特性先來了解一下

函式的一些特性

在python中函式也是物件,可以把函式賦值給變數,比如下面這樣:

def func(message):

print("列印一條message: {}".format(message))

send_message = func

send_message("123")

我們把函式 func 賦予了變數 send_message,這樣之後你呼叫 send_message,就相當於是呼叫函式 func()

函式也可以當做引數傳遞給另乙個函式使用,比如:

def func(message):

print("列印一條message: {}".format(message))

def call_func(func, message):

func(message)

函式的巢狀就是說在函式裡再定義乙個函式,比如這樣:

def call_func(message):

def func(message):

print("列印一條message: {}".format(message))

return func(message)

上面在call_func的內部又定義了乙個函式func,並在call_func裡呼叫了這個內部的函式,呼叫後作為call_func的返回值返回

我們修改一下上面的例子。如下:

def call_func():

def func(message):

print("列印一條message: {}".format(message))

return func

result = call_func()

result("hello world")

函式 call_func() 的返回值是函式物件 func 本身,之後,我們將其賦予變數 result,再呼叫 result(『hello world』),最後輸出了'列印一條message: hello world'.

簡單的裝飾器

def my_decorator(func):

func()

def greet():

print('hello world')

greet = my_decorator(greet)

greet()

# 輸出

hello world

語法糖@
def my_decorator(func):

func()

@my_decorator

def greet():

print('hello world')

greet()

這裡的@,我們稱之為語法糖,@my_decorator就相當於前面的greet=my_decorator(greet)語句,只不過更加簡潔。因此,如果你的程式中有其它函式需要做類似的裝飾,你只需在它們的上方加上@decorator就可以了,這樣就大大提高了函式的重複利用和程式的可讀性。

帶引數的裝飾器

如果原函式 greet() 是需要接收引數,因為被裝飾函式是在裝飾器裡執行,那就需要把函式接收的引數傳遞到裝飾器裡,該怎麼辦呢?很簡單,只需在裝飾器的巢狀函式上增加入參就行,比如

def my_decorator(func):

func(message)

@my_decorator

def greet(message):

print(message)

greet('hello world')

# 輸出

hello world

不過一般不這麼乙個個的寫,麻煩,直接這樣搞:

def my_decorator(func):

func(*args, **kwargs)

裝飾器也是可以接收引數的

裝飾器還有更大程度的靈活性,可以接受自己定義的引數,可以給裝飾器本身傳遞引數

def repeat(num):

def my_decorator(func):

for i in range(num):

func(*args, **kwargs)

return my_decorator

@repeat(4)

def greet(message):

print(message)

greet('hello world')

類裝飾器

類也可以作為裝飾器。類裝飾器主要依賴於函式__call__(),每當你呼叫乙個類的示例時,函式__call__()就會被執行一次。

class request:

def __init__(self, func):

self.func = func

self.num_calls = 0

def __call__(self, *args, **kwargs):

self.num_calls += 1

print('num of calls is: {}'.format(self.num_calls))

return self.func(*args, **kwargs)

@request

def example():

print("hello world")

example()

# 輸出

num of calls is: 1

hello world

example()

# 輸出

num of calls is: 2

hello world

...

這個類裝飾器還不支援接收引數,後面我們實戰的裝飾器時可以支援結束引數的。

至此我們介紹完了裝飾器,下面我們基於之前的理論,來進行一次實戰。

需求是希望通過裝飾器來實現介面的請求,能夠自定義請求方法、請求的根路徑、公共引數、headers設定等功能。

class request:

def __init__(self, url='', method='get'):

''''''

self.url = url # 請求路徑

self.method = method # 請求方法

self.func_return = none # 被裝飾器標記的方法的返回引數

self.func_im_self = none # 被裝飾器標記的方法的類的例項

self.session = none # 當前使用的會話物件

def __call__(self, func):

self.func = func

self.is_class = false

try:

if inspect.getfullargspec(self.func).args[0] == 'self':

self.is_class = true

except indexerror:

pass

# 呼叫被裝飾標記的方法,這個方法會返回請求介面所需要的返回值

self.func_return = self.func(*args, **kwargs) or {}

self.func_im_self = args[0] if self.is_class else object

self.create_url()

self.create_session()

self.session.headers.update(getattr(self.func_im_self, 'headers', {}))

self.decorator_args.update(getattr(self.func_im_self, 'common_params', {}))

self.decorator_args.update(self.func_return)

return request(self.method, self.url, self.session)

def create_url(self):

"""生成http請求的url,跟路徑和介面路由進行拼接

"""base_url = getattr(self.func_im_self, 'base_url', '')

self.url = self.func_return.pop('url', none) or self.url

self.url = ''.join([base_url, self.url])

使用的時候要定義乙個類,比如下面這樣:

class advertservice:

def __init__(self):

self.common_params = {} # 定義介面請求的公共引數

self.headers = {} # 定義請求的header

self.base_url = self._config.ad_admin_root_url

@request(url=「/v3/advert/create」, method='post')

def _create_ad(self, advert: advert):

return dict(json=advert)

上面的header會被自動的新增的session的header裡,common_params也會被新增到引數裡,base_url和裝飾器裡傳的url會被拼接成乙個完整的url去請求介面。

python裝飾器在介面自動化測試中的應用

在講解裝飾器在介面自動化測試專案的應用之前,我們先來介紹一下python裝飾器到底是個什麼 說裝飾器就不得不提一下函式這個一等公民了,在python中函式有幾個特性先來了解一下 函式的一些特性 在python中函式也是物件,可以把函式賦值給變數,比如下面這樣 def func message pri...

Python 介面自動化

python環境搭建 第三方庫 requests安裝 pip install requests 網爛時可能安裝失敗,嗯 pip安裝第三方庫提示版本較低時需要更新pip的版本 命令 python m pip install upgrade pip 檢視安裝的第三方庫 pip list requests...

Python 介面自動化(六)

介面基礎知識 六 七 介面 1 介面 外部系統與本系統之間以及系統內部的各個子系統間,以約定標準提供的服務,包括對外提供的介面 對外提供的介面。不同的請求協議 http webservice dubbo socket http請求分為 get post delete put head option ...