Python:使用md5校验和测试响应流

时间:2016-11-19 08:45:33

标签: python flask python-unittest

我刚刚开始使用Python,我想通过执行响应的md5sum测试我的应用程序的休止符,该响应本质上是一个二进制文件流。

test_file.py

import main
import unittest
import hashlib

class MainTest(unittest.TestCase):

  def setUp(self):
    self.app = main.app.test_client()
...
  # This test checks if the app retuns our new firmware correctly
  def test_get_firmware_esp_new(self):
    rv = self.app.get('/firmware',
              environ_base={'HTTP_USER_AGENT': 'test-blabla'})
    print rv.response.__dict__
    self.assertEqual(hashlib.md5(rv.response).hexdigest(), 'bf8ad256d69fa98b9facca6fb43cb234')

我得到的错误是:

  File "test_file.py", line 24, in test_get_firmware_esp_new
    self.assertEqual(hashlib.md5(rv.response).hexdigest(), 'bf8ad256d69fa98b9facca6fb43cb234')
TypeError: must be convertible to a buffer, not ClosingIterator

在main.py中,我有一行代码如下:

return get_stream_fw(FWupdate)

streamfw.py

from flask import Response, stream_with_context
import requests

def get_stream_fw(name):
  url = 'https://media.giphy.com/media/9Sxp3YOKKFEBi/giphy.gif'
  req = requests.get(url, stream = True)
  return Response(stream_with_context(req.iter_content(chunk_size=1024)), content_type = req.headers["content-type"])

执行响应哈希的正确方法是什么,实际上是一个不超过1MB数据的流?

2 个答案:

答案 0 :(得分:1)

我最终这样做了:

hs = hashlib.md5()
hs.update(rv.data)
self.assertEqual(hs.hexdigest(), '80c9574fc2d169fe9c097239c2ed0b02')

所以我没有使用rv.response,而是使用rv.data

答案 1 :(得分:0)

通过阅读help(hashlib),我认为您可以按照以下方式迭代您的回复:

hs = hashlib.md5()
...
for i in rv.response:
  hs.update(i)

self.assertEqual(hs.hexdigest(), ...)