【问题标题】:Python Unittest for method returning json string用于返回json字符串的方法的Python Unittest
【发布时间】:2015-06-20 15:18:15
【问题描述】:

我是编写 python 单元测试的新手。我在一个类中有一个从 API 返回 Json 响应的方法。 JSON 响应包含数据、令牌、对象名称和状态等属性。该方法每次都会访问 API 并返回具有不同值的响应,因此我无法对响应进行硬编码并对其进行测试。我怎样才能为这种类型的方法编写单元测试。

我想到的一件事是检查响应是否不为空。我可以在这里做任何其他类型的检查吗?

每次它返回一个不同的标记,日期(时间戳)。状态将相同。

def Json_get_status(self):
    get_url = "xxxx" #URL to hit API
    r = requests.get(get_url)
    self.get_json = json.loads(r.text)
    self.get_token=self.get_json["token"]
    self.get_date=self.get_json["date"]
    self.get_status=self.get_json["status"]
    return self.get_json

【问题讨论】:

  • 所有的数据是否每次都不同,或者有一些可以测试的字段?你能测试一下所有字段的类型是否正确,或者在适当的范围内吗?你能模拟出 API 调用吗?你到底想测试什么?
  • 刚刚进行了有问题的编辑。是的,我可以尝试模拟 API 调用。我正在尝试测试此方法是否从 Json 响应中正确读取状态。
  • 如果您将其拆分为更多单独的部分,您可能会发现这更容易 - 测试一个方法是否可以正确解析 JSON 字符串应该是微不足道的。您能否发布该方法,并在其周围放置一个最小的类骨架?
  • 添加了方法骨架

标签: json python-3.x python-unittest


【解决方案1】:

如果您的测试方法应该“正确读取状态”,那么您可能需要专门测试它。

所以假设你的应用是这样的

def read_status(response):
    parsed = json.loads(response)
    # does other stuff
    return something

然后在你的 test_unit.py 中

def test_read_status(self):
   mock_input_val = {'something': 'good val'}
   expected_positive_return_val = something
   self.assertEqual(read_status(json.dumps(mock_input_val)),       
                    expected_positive_return_val)

对 read_status 无法解析 json 对象或在响应中发现错误的情况进行否定测试也很好。

【讨论】:

  • 是的,但它没有接收 json 作为争论。它每次都轮询 API,然后使用该 JSON 响应(方法内部)
  • 根据您提供的代码,我建议制作一个内部函数来接收 json.loads(resp.text) 的输出,然后对该函数进行单元测试。这样,您就可以将网络和业务逻辑解耦。单元测试只是发出一个 http get 的东西没有多大价值。使用模拟服务可以让您变得更复杂,但从简单开始是好的。
猜你喜欢
  • 1970-01-01
  • 2012-02-05
  • 1970-01-01
  • 2018-08-23
  • 1970-01-01
  • 2022-01-24
  • 2015-06-09
  • 2020-04-13
  • 2023-03-30
相关资源
最近更新 更多