[Python] RESTful API 測試神器 VCRPY

Bryan Yang
A multi hyphen life
3 min readJan 9, 2018

輕鬆 Mock 各種 Request 結果

在微服務架構中,或是要使用其他人提供的 API,寫個 API Wrapper 也是很常見的事情.在寫 Wrapper 的過程中,最麻煩的倒不是 wrapper 本身,而是寫 test case 的過程.因為充滿了各種 side effect ,大部分的動作都需要 mock 打 API 的結果才能測試.如果 API 是自己寫的還好,用別人的就很麻煩了.常常就是一邊開視窗打 API,一邊紀錄回傳結果作為 mock 使用.直到有一天突然發現這個神器… https://github.com/kevin1024/vcrpy

簡而言之,這個神器能自動記錄你的程式打 API 的結果並且記錄下來,之後就會直接比對程式和記錄下來的結果,不需要真的去打 API.而且紀錄的內容包括完整的 response ,比自己紀錄還方便啊阿阿.

使用方法

  1. 安裝
pipenv install --dev vcrpy

2. import

import requests
import vcr
@vcr.use_cassette('tests/vcr_cassettes/healthchack.yml')
def test_api_healthcheck(self):
r = requests.get('your-api-server')
self.assertEqual(r.status_code, 200)

將要 mock 的 function 上面用 \@vcr.use_cassette(‘檔案路徑’) 表示 requests 結果的存放位置.

3. 使用

可以透過 nosetests 來執行多個 unit test.

第一次使用時,請確保你與目標API server的連線是沒有問題的,vcr 會自動幫你把 requests 的結果記錄在指定位置,下次就會自行用指定位置的檔案當成 requests 結果.

結果會用 yaml 的形式記錄下來,例如:

interactions:
- request:
body: null
headers:
Accept: [‘*/*’]
Accept-Encoding: [‘gzip, deflate’]
Connection: [keep-alive]
User-Agent: [python-requests/2.18.4]
method: GET
uri: http://ksql-server:8080/
response:
body: {string: ‘{“KSQL Server Info”:{“version”:”0.2"}}’}
headers:
Content-Type: [application/json]
Date: [‘Tue, 09 Jan 2018 15:54:44 GMT’]
Server: [Jetty(9.2.z-SNAPSHOT)]
status: {code: 200, message: OK}
version: 1

內容包含完整的 request 和 response 結果,像是 return code 以及 body.對於一些很難 mock 的 API,如果有需要也可以自行修改檔案內容,有 vcr 真的太方便啦~(已跪)

--

--

Bryan Yang
A multi hyphen life

Data Engineer, Data Producer Manager, Data Solution Architect