軟體測試技術乾貨丨舉個例子告訴你,未開發完成的介面該如何測試

博為峰網校發表於2021-04-20

前言

在做介面測試的過程中,介面還沒有開發完成呢,領導就讓介入測試,剛開始小夥伴們肯定會懵,介面都沒有開發完成,怎麼測試?有的狀態不容易構造目前介面沒有辦法實現,這個時候怎麼測試?這個時候就要引入新的知識點---mock。

mock

什麼是mock?mock測試就是在測試過程中,對於某些不容易構造或者不容易獲取的物件,用一個虛擬的物件來建立以便測試的測試方法。在工作中如果在介面沒有開發完成時,也可以進行來模擬介面的返回資料從而驗證介面的正確性。加我VX:atstudy-js 回覆“測試”,進入軟體測試學習交流裙~~

mock需要場景

工作中,為了節約專案時間,開發測試可以進行同步進行,當開發沒有完成介面時,測試人員可以透過mock來模擬介面返回資料內容。

模擬暫時無法實現的功能:比如真實的支付功能。

測試覆蓋內容,當我們執行介面想要模擬狀態400、500的場景,這個時候也可以透過mock。

python中的mock

python中有多重執行mock的方法,其中mock模組在python3.3以上版本已經內建到單元測試unittest中,python3.3以下的版本需要透過pip install mock的方法進行安裝。

mock引數

mock在使用過程中需要最常用的3個引數。

name:表示mock的名稱。

from unittest import mock

result = mock.Mock(name='mock的名稱')

print(result)

# 結果:

<Mock name='mock的名稱' id='2721150378120'>

return_value:表示mock的值。

side_effect:表示mock需要呼叫的物件(當使用return_value和side_effect值同時存在時,優先返回side_effect的值)。

unittest.mock()

這裡安靜舉一個天氣的例子進行實現,測試查詢天氣這個介面,最近上海都沒有雪,那麼我怎麼去模擬雪這個場景?需要等到真正下雪的那天才可以嗎?這裡透過unittest.mock的方法。加我VX:atstudy-js 回覆“測試”,進入軟體測試學習交流裙~~

import unittest

from unittest import mock

class Test01(unittest.TestCase):

def weather(self):

'''天氣介面'''

# result = {'result': "雪", 'status': '下雪了!'}

pass

def weather_result(self):

'''模擬天氣介面返回值'''

result = Test01.weather(self)

if result['result'] == '雪':

print('下雪了!!!')

elif result['result'] == '雨':

print('下雨了!!!')

elif result['result'] == '晴天':

print('晴天!!!!')

else:

print('返回值錯誤!')

return result['status']

def test_01(self):

'''模擬下雪天場景'''

mock_xue_result = {'result': "雪", 'status': '下雪了!'}

# 使用mock庫進行模擬

Test01.weather = mock.Mock(return_value=mock_xue_result)

statues = Test01.weather_result(self)

self.assertEqual(statues, '下雪了!')

def test_02(self):

'''模擬下雨天場景'''

mock_yu_result = {'result': "雨", 'status': '下雨了!'}

# 使用mock庫進行模擬

Test01.weather = mock.Mock(return_value=mock_yu_result)

statues = Test01.weather_result(self)

self.assertEqual(statues, '下雨了!')

if __name__ == '__main__':

unittest.main()

透過執行發現,我們想要的下雪天氣已經模擬成功了,說明當查詢天氣介面返回為雪的時候,就代表會下雪了。這樣就不用在等到下雪的時候進行測試這個介面了。

mock.patch()

mock.patch()是mock的一個裝飾器方法,其中patch的值表示寫入需要mock的物件,還拿天氣舉例子,這裡的patch的引數就需要填寫天氣的介面,需要透過python呼叫的方式進行填寫天氣介面。

# w1.py

def weather():

'''天氣介面'''

pass

def weather_result():

'''模擬天氣介面返回值'''

result = weather()

if result['result'] == '雪':

print('下雪了!!!')

elif result['result'] == '雨':

print('下雨了!!!')

elif result['result'] == '晴天':

print('晴天!!!!')

else:

print('返回值錯誤!')

return result['status']

透過mock.patch()裝飾器進行來mock返回資料。

import unittest

from unittest import mock

# 匯入介面檔案

import w1

class Test01(unittest.TestCase):

@mock.patch(target="w1.weather")

def test_01(self, mock_login):

'''下雪了'''

mock_login.return_value={'result': "雪", 'status': '下雪了!'}

statues = w1.weather_result()

self.assertEqual(statues, '下雪了!')

@mock.patch(target='w1.weather')

def test_02(self,mock_login):

'''下雨了!'''

mock_login.return_value = {'result': "雨", 'status': '下雨了!'}

statues = w1.weather_result()

self.assertEqual(statues, '下雨了!')

if __name__ == '__main__':

unittest.main()

透過執行後發現,測試透過,已經成功的模擬了天氣介面的返回值內容。

pytest.mock()

上面介紹的屬於unittest中的mock,既然unittest中存在mock模組,那麼pytest中也存在mock模組pytest-mock。

安裝:

pip install pytest-mock

這裡的mock和unittest的mock基本上都是一樣的,唯一的區別在於pytest.mock需要匯入需要mock物件的詳細路徑。

# weateher_r.py

class Mock_weather():

def weather(self):

'''天氣介面'''

pass

def weather_result(self):

'''模擬天氣介面'''

result = self.weather()

if result['result'] == '雪':

print('下雪了!!!')

elif result['result'] == '雨':

print('下雨了!!!')

elif result['result'] == '晴天':

print('晴天!!!!')

else:

print('返回值錯誤!')

return result['status']

先將需要模擬的天氣介面,以及需要模擬的場景的程式碼寫好,然後在進行遵循pytest的用例規範進行書寫關於mock的測試用例。

# test_01.py

import pytest

from test_01.weather_r import Mock_weather

def test_01(mocker):

# 例項化

p = Mock_weather()

moke_value = {'result': "雪", 'status': '下雪了!'}

# 透過object的方式進行查詢需要mock的物件

p.weather = mocker.patch.object(Mock_weather, "weather", return_value=moke_value)

result =p.weather_result()

assert result=='下雪了!'

def test_02(mocker):

# 例項化

product = Mock_weather()

# Mock的返回值

mock_value = {'result': "雨", 'status': '下雨了!'}

# 第一個引數必須是模擬mock物件的完整路徑

product.weather = mocker.patch('test_01.weather_r.Mock_weather.weather', return_value=mock_value)

result = product.weather_result()

assert result=='下雨了!'

if __name__ == '__main__':

pytest.main(['-vs'])

透過上述程式碼,安靜提供pytest中mock的2種方法:

第一種中的第一個引數是透過object的方式進行查詢關於Mock_weather的類,然後在找到下面的需要mock的物件方法名稱,第2個參數列示mock的值。

第二種方法中的第一個引數是透過完整的路徑進行找到需要mock的物件,第2個引數是mock的值。

透過執行發現,兩種方法都是可以mock成功的。

總結

簡單的透過一個小的例子介紹瞭如何在python中使用mock的方法。大家也可以將mock方法加入到我們需要用到的專案中。從而更加方面的完成自動化,以及覆蓋更多的自動化測試用例。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31407649/viewspace-2768969/,如需轉載,請註明出處,否則將追究法律責任。

相關文章