# 請看VCR.feat pytest ###### tags: `unit-test` `pytest` ## 序言 今天隨筆的主題是VCR 各位如果在須測試的程式中,有使用別人開發的API,或是去爬一些網頁的時候,一定會覺得在撰寫測試的過程中覺得厭世。 為什麼? 想像一個API會回傳多少資訊,要注意response的格式對不對,headers可能也要注意,算上別的意外,如果要把這個API的所有回傳都mock,那會有複數的mock需要維護,我們就只能對著API一個一個把mock刻出來。 但是別擔心,今天的我們有...VCR!  ## pytest-recording https://github.com/kiwicom/pytest-recording 這個library是在基於vcrpy的基礎上的pytest plugin,由於我們過往的測試範例都是以pytest撰寫,以下的example都會用這個lib來做。 ```python= # get_google.py in ./app import requests def call(): response = requests.get('https://www.google.com.tw/') # do something with response return response ``` 現在我們有一個包起來的requests去抓某個網址,這邊用google主頁當範例,但各位可以替換成常用的API。 然後我們做個測試: ```python= # test_get_google.py import pytest from app import get_google @pytest.mark.vcr def test_get_google(): response = get_google.call() assert response.status_code == 200 ``` 如果沒有VCR的話,我們會做的事情就是開著postman,看著回傳回來的body跟header,思考到底有那些東西是需要用mock替代的,非常的心累。 但是別擔心,今天的我們有...VCR! ~~你怎麼又來了~~ 今天只要用裝飾器的方式在測試前加上 ```python= @pytest.mark.vcr ``` 然後在cmd中執行 ``` pytest --record-mode=once test_get_google.py ``` 在這個範例中,測試執行時會自動把requests.get回來的所有東西記錄成一個.yaml檔案,之後進行到這個測試時,requests.get會自動把.yaml檔案抓來用,避免call太多次API。 這邊值得一提的是record-mode這個參數,設定為once的情況下,會先尋找有沒有紀錄的yaml檔,如果沒有的話會執行一次request,把回傳記錄到預設的位置,以後的測試就不會真的去request API了。 ```yaml # cassettes/{module_name}/{test_function_name}.yaml interactions: - request: body: null headers: Accept: - '*/*' Accept-Encoding: - gzip, deflate Connection: - keep-alive User-Agent: - python-requests/2.26.0 method: GET uri: https://www.google.com.tw/ response: body: string: !!binary | H4sIAAAAAAAC/71822/kWHrfe/8VJbZXKkJUFcm6V4mS1Wp1tzx9mR6pZ8ajUZRD8lQVW7yJZOnS pcpfs1nbAWKsYXvXXgcIgiBA3pwgDwEC+CVPeQxgI4gfAuT3nUOyWCX19mYMZGdHRZ7Ldz/f+b7v ...... ``` 這樣我們就可以節省很多設計mock的時間,如果需要的話,我們也可以手動修改這個yaml檔案的內容。 ## 與flask test_client的相容性 如果測試是基於flask test_client上執行,各位可能會有個疑惑,通常測試的code會長這樣 ```python= # test_flask.py def test_flask(client): response = client.get("tested_url") # ... ``` 那這邊如果我們用VCR,會不會把我們自己寫的API的回傳抓進來? 答案是不會,各位可以放心,VCR支援的HTTP library不包含flask,VCR會好好的如預期的工作的。 如果各位對這方面的相容性有興趣,可以參考: https://vcrpy.readthedocs.io/en/latest/installation.html#compatibility ## 結語 通過今天的隨筆,希望各位能對這樣方便的工具有興趣,可以試用看看,絕對不會後悔的。 最後,除了祝各位測試順利之外,請各位跟我喊一次... 今天的我們有...VCR! 
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up