单元测试 python?
Unittesting python?
我有一些功能 api
def is_car_exist(make, model):
url = f'https://vpic.nhtsa.dot.gov/api/vehicles/GetModelsForMake/\
{make.capitalize()}?format=json'
data = requests.get(url).json()['Results']
return any(model.capitalize() == car['Model_Name'] for car in data)
我有一些集成测试:
class TestCar(unittest.TestCase):
def test_is_car_exist(self):
self.assertTrue(car.is_car_exist('honda', 'civic'))
self.assertFalse(car.is_car_exist('Mars', 'merana'))
请你展示一下 Unittest 相对于我的函数看起来如何。
解决方案
使用unittest.mock
模块。可以找到更多详细信息 here.
import unittest
from unittest.mock import patch
import car
class TestCar(unittest.TestCase):
@patch("requests.get")
def test_is_car_exist(self, requests_get):
requests_get.return_value.json.return_value = {"Results": [{"Model_Name": "Civic"}]}
self.assertTrue(car.is_car_exist('honda', 'civic'))
self.assertFalse(car.is_car_exist('Mars', 'merana'))
说明
patch
将真实对象或函数替换为模拟对象或函数。它需要一个位置参数 target
来填充。此目标需要像正常导入一样使用 path.to.module
符号导入。
一种使用方法是将其用作装饰器。作为装饰器使用时,需要在装饰函数中添加参数。在这种情况下,它是 requests_get
.
.return_value
用于函数调用和你想要的 return.
requests_get.return_value.json.return_value
表示您希望 requests.get
的 return 值是一个对象,该对象具有一个名为 json
的方法,该方法 returns {"Results": [{"Model_Name": "Civic"}]}
我有一些功能 api
def is_car_exist(make, model):
url = f'https://vpic.nhtsa.dot.gov/api/vehicles/GetModelsForMake/\
{make.capitalize()}?format=json'
data = requests.get(url).json()['Results']
return any(model.capitalize() == car['Model_Name'] for car in data)
我有一些集成测试:
class TestCar(unittest.TestCase):
def test_is_car_exist(self):
self.assertTrue(car.is_car_exist('honda', 'civic'))
self.assertFalse(car.is_car_exist('Mars', 'merana'))
请你展示一下 Unittest 相对于我的函数看起来如何。
解决方案
使用unittest.mock
模块。可以找到更多详细信息 here.
import unittest
from unittest.mock import patch
import car
class TestCar(unittest.TestCase):
@patch("requests.get")
def test_is_car_exist(self, requests_get):
requests_get.return_value.json.return_value = {"Results": [{"Model_Name": "Civic"}]}
self.assertTrue(car.is_car_exist('honda', 'civic'))
self.assertFalse(car.is_car_exist('Mars', 'merana'))
说明
patch
将真实对象或函数替换为模拟对象或函数。它需要一个位置参数 target
来填充。此目标需要像正常导入一样使用 path.to.module
符号导入。
一种使用方法是将其用作装饰器。作为装饰器使用时,需要在装饰函数中添加参数。在这种情况下,它是 requests_get
.
.return_value
用于函数调用和你想要的 return.
requests_get.return_value.json.return_value
表示您希望 requests.get
的 return 值是一个对象,该对象具有一个名为 json
的方法,该方法 returns {"Results": [{"Model_Name": "Civic"}]}