軟體測試中Mock和Stub

2021-08-21 04:08:03 字數 2519 閱讀 9878

1.stub

與mock(1

)相同點

stub

和mock

物件都是用來模擬外部依賴,使我們能控制。

如果被測程式、系統或物件,我們稱之為

a。在測試

a的過程中,

a需要與程式、系統或物件

b進行互動,那麼

stub/mock

就是用來模擬

b的行為來與

a進行互動。(2

)不同點

stub

,也即「樁」,很早就有這個說法了,主要出現在整合測試的過程中,從上往下的整合時,作為下方程式的替代。作用如其名,就是在需要時,能夠發現它存在,即可。就好像點名,「到」即可。

mock

,主要是指某個程式的傀儡,也即乙個虛假的程式,可以按照測試者的意願做出響應,返回被測物件需要得到的資訊。也即是要風得風、要雨得雨、要返回什麼值就返回什麼值。

總體來說,

stub

完全是模擬乙個外部依賴,用來提供測試時所需要的測試資料。而

mock

物件用來判斷測試是否能通過,也就是用來驗證測試中依賴物件間的互動能否達到預期。

下面用兩個圖來說明使用mock和stub在實際測試中的關注點的不同:

左圖中,看到stub作為外部依賴的模擬,只需要模擬返回資料就ok了,我們的測試重點在於自身的邏輯。而右圖中,通過mock,模擬外部依賴的各種的返回值,來驗證與外部依賴的互動。

2.python中mock模組使用舉例

(1)未使用python mock模組的單元測試

# test.py

defadd_and_multiply

(x, y):

addition = x + y

multiple = multiply(x, y)

return (addition, multiple)

defmultiply

(x, y):

return x * y

import unittest

class

mytestcase

(unittest.testcase):

deftest_add_and_multiply

(self):

x =

3y =

5addition, multiple = add_and_multiply(x, y)

self.assertequal(

8, addition)

self.assertequal(

15, multiple)

if __name__ ==

"__main__":

unittest.main()

(2)使用python mock模組的單元測試

# test.py

import mock

import unittest

defadd_and_multiply

(x, y):

addition = x + y

multiple = multiply(x, y)

return (addition, multiple)

defmultiply

(x, y):

return x * y

class

mytestcase

(unittest.testcase):

@mock.patch('multiply')

deftest_add_and_multiply

(mock_multiply):

x =

3y =

5mock_multiply.return_value =

15addition, multiple = add_and_multiply(x, y)

mock_multiply.assert_called_once_with(

3, 5)

self.assertequal(

8, addition)

self.assertequal(

15, multiple)

if __name__ ==

"__main__":

unittest.main()

使用「mock.patch」裝飾器來用mock物件替換"multiply'。然後將它作為乙個引數"mock_multiply"插入到測試**中。在這個測試的上下文中,任何對「multiply」的呼叫都會被重定向到「mock_multiply」物件。

備註:在python2.x 中 mock是乙個單獨模組,需要單獨安裝。在python3.x中,mock已經被整合到了unittest單元測試框架中,所以,可以直接使用。

stub和mock的區別

關於stub mock的確別 1.先說不同點 stub方法裡面需要實現邏輯,因為對stub的呼叫者需要依賴,stub模組或函式的返回值,正因為此,搭建stub跟mock比起來,是比較耗費精力的。也正因為此,stub一般用於粗粒度測試。而mock的關鍵則是他要足夠啥,只要能夠讓他的依賴者與之進行足夠的...

stub 和 mock 有什麼區別

在網上看到以下的描述就 stub vs mock 進行比較 在測試中,經常涉及到對依賴 的處理,這將涉及到系統的結構的設計。乙個好的設計,必然是容易測試的。之間的依賴被極大的隔離開來,很容易的進行測 試。如何對對其他層具有依賴的 進行測試呢?可以有兩種方法 引入stub和引入mock。那麼這兩者之間...

TDD 什麼是樁(stub)和模擬(mock)?

由上圖可以知道mock框架可以非常容易的開發stub和mock,但是stub框架想要提高mock機制就要靠自己擴充套件了。stub存在的意圖是為了讓測試物件可以正常的執行,其實現一般會硬編碼一些輸入和輸出,下面的 使用了ms自帶的fake和shim來實現stub。fake實現 1 using sys...