Модульное тестирование макета GCS

#python #unit-testing #testing #google-cloud-storage #python-mock

#python #модульное тестирование #тестирование #google-облачное хранилище #python-макет

Вопрос:

Мне трудно найти способ сделать модульный тест для методов read and write , присутствующих в этом классе. Я пытаюсь создать макет с помощью библиотеки макетов исправлений, чтобы избежать вызова хранилища Google, но мне трудно понять, как это сделать.

 from google.cloud import storage


class GCSObject(str):
    

    def __init__(self, uri=""):
        self.base, self.bucket, self.path = self.parse_uri(uri)


    def parse_uri(self, uri):
        uri = uri.lstrip("gs://").replace("//", "/").split("/", 1)
        if len(uri) > 1:
            return ("gs://", uri[0], uri[1])
        else:
            return ("gs://", uri[0], "")

    def read(self) -> bytes:
        storage_client = storage.Client()
        bucket = storage_client.bucket(self.bucket)
        return bucket.blob(self.path).download_as_string()

    def write(self, content: bytes):
        storage_client = storage.Client()
        bucket = storage_client.get_bucket(self.bucket)
        blob = bucket.blob(self.path)
        blob.upload_from_string(content)
  

Что я сейчас пытаюсь сделать

 @mock.patch("packages.pyGCP.pyGCP.gcs.storage.Client")
def test_upload(client):
    gcs_path = GCSObject("fake_path")
    reader = gcs_path.read()  
    #  confused what I should assert 
  

Комментарии:

1. используйте мою единственную модель github.com/IT-Support-L2/Unit_Test_Demo/tree/master /…

2. Потрясающий ресурс!

Ответ №1:

Я использую google-cloud-storage==1.32.0 и python 3.7.5. Вот решение для модульного тестирования:

gcs.py :

 from google.cloud import storage


class GCSObject(str):

    def __init__(self, uri=""):
        self.base, self.bucket, self.path = self.parse_uri(uri)

    def parse_uri(self, uri):
        uri = uri.lstrip("gs://").replace("//", "/").split("/", 1)
        if len(uri) > 1:
            return ("gs://", uri[0], uri[1])
        else:
            return ("gs://", uri[0], "")

    def read(self) -> bytes:
        storage_client = storage.Client()
        bucket = storage_client.bucket(self.bucket)
        return bucket.blob(self.path).download_as_string()

    def write(self, content: bytes):
        storage_client = storage.Client()
        bucket = storage_client.get_bucket(self.bucket)
        blob = bucket.blob(self.path)
        blob.upload_from_string(content)
  

test_gcs.py :

 import unittest
from unittest import mock
from unittest.mock import Mock
from gcs import GCSObject


class TestGCSObject(unittest.TestCase):
    @mock.patch('gcs.storage')
    def test_read(self, mock_storage):
        mock_gcs_client = mock_storage.Client.return_value
        mock_bucket = Mock()
        mock_bucket.blob.return_value.download_as_string.return_value = "teresa teng".encode('utf-8')
        mock_gcs_client.bucket.return_value = mock_bucket
        gcs = GCSObject('fake_path')
        actual = gcs.read()
        mock_storage.Client.assert_called_once()
        mock_gcs_client.bucket.assert_called_once_with('fake_path')
        mock_bucket.blob.assert_called_once_with('')
        mock_bucket.blob.return_value.download_as_string.assert_called_once()
        self.assertEqual(actual, "teresa teng".encode('utf-8'))

    @mock.patch('gcs.storage')
    def test_write(self, mock_storage):
        mock_gcs_client = mock_storage.Client.return_value
        mock_bucket = Mock()
        mock_gcs_client.get_bucket.return_value = mock_bucket
        gcs = GCSObject('fake_path')
        gcs.write(b'teresa teng')
        mock_storage.Client.assert_called_once()
        mock_gcs_client.get_bucket.assert_called_once_with('fake_path')
        mock_bucket.blob.assert_called_once_with('')
        mock_bucket.blob.return_value.upload_from_string.assert_called_once_with(b'teresa teng')


if __name__ == '__main__':
    unittest.main()
  

результат модульного теста:

 ..
----------------------------------------------------------------------
Ran 2 tests in 0.004s

OK
Name                                     Stmts   Miss  Cover   Missing
----------------------------------------------------------------------
src/stackoverflow/64672497/gcs.py           18      1    94%   12
src/stackoverflow/64672497/test_gcs.py      29      0   100%
----------------------------------------------------------------------
TOTAL                                       47      1    98%
  

Комментарии:

1. Прекрасный ответ Лин Ду!