舉例告訴你,未開發完成的接口該如何測試

發表于:2021-4-13 09:40  作者:測試安靜   來源:51Testing軟件測試網原創

字體: | 上一篇 | 下一篇 |我要投稿 | 推薦標簽: 軟件測試技術 接口測試

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

  mock
  什么是mock?mock測試就是在測試過程中,對于某些不容易構造或者不容易獲取的對象,用一個虛擬的對象來創建以便測試的測試方法。在工作中如果在接口沒有開發完成時,也可以進行來模擬接口的返回數據從而驗證接口的正確性。

  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的方法。
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方法加入到我們需要用到的項目中。從而更加方面的完成自動化,以及覆蓋更多的自動化測試用例。

      版權聲明:本文出自51Testing會員投稿,51Testing軟件測試網及相關內容提供者擁有內容的全部版權,未經明確的書面許可,任何人或單位不得對本網站內容復制、轉載或進行鏡像,否則將追究法律責任。

評 論

論壇新帖

頂部 底部


建議使用IE 6.0以上瀏覽器,800×600以上分辨率,法律顧問:上海信義律師事務所 項棋律師
版權所有 上海博為峰軟件技術股份有限公司 Copyright©51testing.com 2003-2021, 滬ICP備05003035號
投訴及意見反饋:webmaster@51testing.com; 業務聯系:service@51testing.com 021-64471599-8017

滬公網安備 31010102002173號

51Testing官方微信

51Testing官方微博

掃一掃 測試知識全知道

农村里的风流韵事