導航:首頁 > 編程語言 > python如何使用mock

python如何使用mock

發布時間:2022-06-30 03:00:00

1. python unittest的mock模塊怎麼理解side

在Python2.x 中 mock是一個單獨模塊,需要單獨安裝。
> pip install -U mock
在Python3.x中,mock已經被集成到了unittest單元測試框架中,所以,可以直接使用。

2. python該如何使用

1、要使用string的方法要先import,但後來由於眾多的python使用者的建議。

2、從python2.0開始, string方法改為用S.method()的形式調用,只要S是一個字元串對象就可以這樣使用,而不用import。

3、同時為了保持向後兼容,現在的Python中仍然保留了一個string的mole。闡述編制Python程序相關注意什麼是Python 解釋器及其使用。

4、深度剖析Python Web 應用程序怎樣正確安裝Python,淺析Python中的Python全局變數其中定義的方法與python字元串操作是相同的,這些方法都最後都指向了用S.method ()調用的函數。

3. python mock怎麼測試資料庫

你這個測試只是告訴你mock是做什麼用的。mock 的真正意義在於簡化測試環境。假如你現在要測試一個,但是你有不想構建資料庫環境就可以用mock模擬資料庫的返回結果。

4. python 開發經驗怎麼xie

當我開始學習Python的時候,有些事我希望我一早就知道。我花費了很多時間才學會這些東西。我想要把這些重點都編纂到一篇文章當中。這篇文章的目標讀者,是剛剛開始學習Python語言的有經驗的程序員,想要跳過前幾個月研究Python使用的那些他們已經在用的類似工具。包管理和標准工具這兩節對於初學者來說同樣很有幫助。
我的經驗主要基於Python 2.7,但是大多數的工具對任何版本都有效。
如果你從來沒有使用過Python,我強烈建議你閱讀Python introction,因為你需要知道基本的語法和類型。
包管理
Python世界最棒的地方之一,就是大量的第三方程序包。同樣,管理這些包也非常容易。按照慣例,會在 requirements.txt 文件中列出項目所需要的包。每個包佔一行,通常還包含版本號。這里有一個例子,本博客使用Pelican:

1
2
3

pelican==3.3
Markdown
pelican-extended-sitemap==1.0.0

Python 程序包有一個缺陷是,它們默認會進行全局安裝。我們將要使用一個工具,使我們每個項目都有一個獨立的環境,這個工具叫virtualenv。我們同樣要安裝一個更高級的包管理工具,叫做pip,他可以和virtualenv配合工作。
首先,我們需要安裝pip。大多數python安裝程序已經內置了easy_install(python默認的包管理工具),所以我們就使用easy_install pip來安裝pip。這應該是你最後一次使用easy_install 了。如果你並沒有安裝easy_install ,在linux系統中,貌似從python-setuptools 包中可以獲得。
如果你使用的Python版本高於等於3.3, 那麼Virtualenv 已經是標准庫的一部分了,所以沒有必要再去安裝它了。
下一步,你希望安裝virtualenv和virtualenvwrapper。Virtualenv使你能夠為每個項目創造一個獨立的環境。尤其是當你的不同項目使用不同版本的包時,這一點特別有用。Virtualenv wrapper 提供了一些不錯的腳本,可以讓一些事情變得容易。

1

sudo pip install virtualenvwrapper

當virtualenvwrapper安裝後,它會把virtualenv列為依賴包,所以會自動安裝。
打開一個新的shell,輸入mkvirtualenv test 。如果你打開另外一個shell,則你就不在這個virtualenv中了,你可以通過workon test 來啟動。如果你的工作完成了,可以使用deactivate 來停用。

IPython
IPython是標准Python互動式的編程環境的一個替代品,支持自動補全,文檔快速訪問,以及標准互動式編程環境本應該具備的很多其他功能。
當你處在一個虛擬環境中的時候,可以很簡單的使用pip install ipython 來進行安裝,在命令行中使用ipython 來啟動

另一個不錯的功能是」筆記本」,這個功能需要額外的組件。安裝完成後,你可以使用ipython notebook,而且會有一個不錯的網頁UI,你可以創建筆記本。這在科學計算領域很流行。

測試
我推薦使用nose或是py.test。我大部分情況下用nose。它們基本上是類似的。我將講解nose的一些細節。
這里有一個人為創建的可笑的使用nose進行測試的例子。在一個以test_開頭的文件中的所有以test_開頭的函數,都會被調用:

1
2

def test_equality():
assert True == False

不出所料,當運行nose的時候,我們的測試沒有通過。

1
2
3
4
5
6
7
8
9
10
11
12
13

(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ nosetests
F
======================================================================
FAIL: test_nose_example.test_equality
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/jhaddad/.virtualenvs/test/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
self.test(*self.arg)
File "/Users/jhaddad/.virtualenvs/test/src/test_nose_example.py", line 3, in test_equality
assert True == False
AssertionError
----------------------------------------------------------------------

nose.tools中同樣也有一些便捷的方法可以調用

1
2
3

from nose.tools import assert_true
def test_equality():
assert_true(False)

如果你想使用更加類似JUnit的方法,也是可以的:

1
2
3
4
5
6
7
8
9
10

from nose.tools import assert_true
from unittest import TestCase
class ExampleTest(TestCase):
def setUp(self): # setUp & tearDown are both available
self.blah = False
def test_blah(self):
self.assertTrue(self.blah)

開始測試:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ nosetests
F
======================================================================
FAIL: test_blah (test_nose_example.ExampleTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/jhaddad/.virtualenvs/test/src/test_nose_example.py", line 11, in test_blah
self.assertTrue(self.blah)
AssertionError: False is not true
----------------------------------------------------------------------
Ran 1 test in 0.003s
FAILED (failures=1)

卓越的Mock庫包含在Python 3 中,但是如果你在使用Python 2,可以使用pypi來獲取。這個測試將進行一個遠程調用,但是這次調用將耗時10s。這個例子顯然是人為捏造的。我們使用mock來返回樣本數據而不是真正的進行調用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14

import mock
from mock import patch
from time import sleep
class Sweetness(object):
def slow_remote_call(self):
sleep(10)
return "some_data" # lets pretend we get this back from our remote api call
def test_long_call():
s = Sweetness()
result = s.slow_remote_call()
assert result == "some_data"

當然,我們的測試需要很長的時間。

1
2
3
4
5

(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ nosetests test_mock.py
Ran 1 test in 10.001s
OK

太慢了!因此我們會問自己,我們在測試什麼?我們需要測試遠程調用是否有用,還是我們要測試當我們獲得數據後要做什麼?大多數情況下是後者。讓我們擺脫這個愚蠢的遠程調用吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

import mock
from mock import patch
from time import sleep
class Sweetness(object):
def slow_remote_call(self):
sleep(10)
return "some_data" # lets pretend we get this back from our remote api call
def test_long_call():
s = Sweetness()
with patch.object(s, "slow_remote_call", return_value="some_data"):
result = s.slow_remote_call()
assert result == "some_data"

好吧,讓我們再試一次:

1
2
3
4
5
6

(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ nosetests test_mock.py
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK

好多了。記住,這個例子進行了荒唐的簡化。就我個人來講,我僅僅會忽略從遠程系統的調用,而不是我的資料庫調用。
nose-progressive是一個很好的模塊,它可以改善nose的輸出,讓錯誤在發生時就顯示出來,而不是留到最後。如果你的測試需要花費一定的時間,那麼這是件好事。
pip install nose-progressive 並且在你的nosetests中添加--with-progressive
調試
iPDB是一個極好的工具,我已經用它查出了很多匪夷所思的bug。pip install ipdb 安裝該工具,然後在你的代碼中import ipdb; ipdb.set_trace(),然後你會在你的程序運行時,獲得一個很好的互動式提示。它每次執行程序的一行並且檢查變數。

python內置了一個很好的追蹤模塊,幫助我搞清楚發生了什麼。這里有一個沒什麼用的python程序:

1
2
3

a = 1
b = 2
a = b

這里是對這個程序的追蹤結果:

1
2
3
4
5
6
7

(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ python -m trace --trace tracing.py 1 ?
--- molename: tracing, funcname: <mole>
tracing.py(1): a = 1
tracing.py(2): b = 2
tracing.py(3): a = b
--- molename: trace, funcname: _unsettrace
trace.py(80): sys.settrace(None)

當你想要搞清楚其他程序的內部構造的時候,這個功能非常有用。如果你以前用過strace,它們的工作方式很相像
在一些場合,我使用pycallgraph來追蹤性能問題。它可以創建函數調用時間和次數的圖表。

最後,objgraph對於查找內存泄露非常有用。這里有一篇關於如何使用它查找內存泄露的好文。
Gevent
Gevent 是一個很好的庫,封裝了Greenlets,使得Python具備了非同步調用的功能。是的,非常棒。我最愛的功能是Pool,它抽象了非同步調用部分,給我們提供了可以簡單使用的途徑,一個非同步的map()函數:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

from gevent import monkey
monkey.patch_all()
from time import sleep, time
def fetch_url(url):
print "Fetching %s" % url
sleep(10)
print "Done fetching %s" % url
from gevent.pool import Pool
urls = ["http://test.com", "http://bacon.com", "http://eggs.com"]
p = Pool(10)
start = time()
p.map(fetch_url, urls)
print time() - start

非常重要的是,需要注意這段代碼頂部對gevent monkey進行的補丁,如果沒有它的話,就不能正確的運行。如果我們讓Python連續調用 fetch_url 3次,通常我們期望這個過程花費30秒時間。使用gevent:

1
2
3
4
5
6
7
8

(test)jhaddad@jons-mac-pro ~VIRTUAL_ENV/src$ python g.py
Fetching http://test.com
Fetching http://bacon.com
Fetching http://eggs.com
Done fetching http://test.com
Done fetching http://bacon.com
Done fetching http://eggs.com
10.001791954

如果你有很多資料庫調用或是從遠程URLs獲取,這是非常有用的。我並不是很喜歡回調函數,所以這一抽象對我來說效果很好。

5. Python中Mock和MagicMock的區別

先看一下官方文檔的定義:
MagicMock is a subclass of Mock with all the magic methods pre-created and ready to use.
其實已經很清楚了,MagicMock是Mock的子類,並且預先創建了全部magic method的mock。也就是說,如果不需要mock magic method,兩者使用起來並沒有什麼分別。
來看個例子,先定義個類,裡面只有一個成員方法,返回10倍的數值:
class Person:
def get_10_times_value(self, value)
return 10 * value

使用Mock類來mock掉這個成員方法:
def test_should_mock_get_10_times_value_with_Mock(self):
p = Person()
p.get_10_times_value = Mock(return_value=100)

self.assertEqual(p.get_10_times_value(), 100)

使用MagicMock類來mock:
def test_should_mock_get_10_times_value_with_MagicMock(self):
p = Person()
p.get_10_times_value = MagicMock(return_value=100)

self.assertEqual(p.get_10_times_value(), 100)

兩者沒有任何區別,都成功了mock了成員方法。
再看下兩者的區別:
def test_should_raise_exception(self):
m = Mock()
list(m)

TypeError: 'Mock' object is not iterable

因為使用Mock類時,默認不會創建__iter__這個magic method的mock,所以報錯。
如果想mock __iter__這個方法,得自己去做,如下:
def test_should_mock_magic_method_with_Mock(self):
m = Mock()
m.__iter__ = Mock(return_value=iter([]))

self.assertEqual(list(m), [])

而使用MagicMock類時默認就會mock掉所有的magic method,所以不需要自己mock,__iter__默認是空數組:
def test_should_mock_magic_method_with_MagicMock(self):
m = MagicMock()

self.assertEqual(list(m), [])

因為已經默認創建了magic method的mock,所以可以直接使用return_value屬性來改變值:
def test_should_mock_magic_method_with_MagicMock(self):
m = MagicMock()
m.__iter__.return_value = [1, 2, 3]

self.assertEqual(list(m), [1, 2, 3])

6. mock怎麼使用道具

1.mock的頁面的左下角上會一排的圖形,然後右擊一下那個橢圓形的圖形,就好出現一小排的幾個圖形,然後用滑鼠點上去查看一下是什麼文字,查看完畢之後,單擊一下道具就完成了。
2.Mock說白了就是打樁(Stub)或則模擬,當你調用一個不好在測試中創建的對象時,Mock框架為你模擬一個和真實對象類似的替身來完成相應的行為。
3.mock主要的作用就是解決依賴問題,達到解耦作用當我們測試某個目標介面(模塊)時,該介面依賴其他介面,當被依賴的介面未開發完成時,可以用mock模擬被依賴介面,完成目標介面的測試。
4.mock的優點是成本低,使用簡單,只需要學習 Mock.js 模板語法。不受網路影響。改動 Mock 能夠快速看到效果。
5.mock的缺點就是Mock 代碼與業務代碼耦合高,上線容易遺漏測試代碼,為代碼偷偷埋下一顆地雷。無法快速響應文檔改動,保持Mock 返回數據與文檔一致。只有前端開發人員能用到 Mock,無法與其他部門人員協同工作。沒有 API 請求,不夠真實。

7. python如何開展單元測試

首先你要知道單元測試是什麼,單元測試就是針對軟體中的最小可測試單元進行檢查和驗證,在python中可以理解為是對類或者是方法的正確性驗證
其次要了解python語言中的單元測試框架有哪些,在python語言中的單元測試框架也有很多,解釋本身自帶的unittest單元測試框架,還有很流行的pytest(有豐富的插件),這些在我之前在黑馬程序員學習測試時都有涉及,或者你可以去看論壇上面有很多python開展單元測試的技術文章。
最後使用某個單元測試框架如何實現,拿解釋器自帶的unittest舉例子吧,使用這個框架來實現單元測試的話,需要創建測試類,創建測試方法,設置fixture,斷言,然後通過測試條件和運行器來執行測試用例.其測試數據可以使用參數化動態獲取.

8. 前段如何用mock返回對象

在使用mock的時候,只需要傳入參數,那麼自動就會返回對象,所以你需要先設置一個對象,比如說var OA. OA=mock(ob)

9. python mock和patch的區別

patch 函數會返回一個 mock 內部的類實例,這個類是class _patch

閱讀全文

與python如何使用mock相關的資料

熱點內容
華為伺服器如何進陣列卡配置 瀏覽:433
apache伺服器ip地址訪問 瀏覽:716
如何買到安卓手機預裝軟體 瀏覽:535
冤罪百度雲不要壓縮 瀏覽:83
蘇州雲存儲伺服器 瀏覽:173
解壓收納原聲 瀏覽:384
java注冊驗證 瀏覽:372
火花app怎麼上推薦 瀏覽:980
什麼app能游戲投屏到電視上 瀏覽:455
伺服器託管到雲端是什麼意思 瀏覽:835
app保存草稿怎麼用 瀏覽:808
安卓如何進入proumb 瀏覽:144
主機虛擬雲伺服器 瀏覽:619
刪除分區加密的空間會不會恢復 瀏覽:706
京東app客戶上門怎麼看搜索量 瀏覽:741
怎麼在農行app購買黃金 瀏覽:46
c型開發板和單片機 瀏覽:146
虛擬機建立用戶的模板文件夾 瀏覽:904
無錫代碼編程培訓班 瀏覽:632
eps圖形數據加密 瀏覽:933