BigQueryのGoogleクライアントライブラリをテストするために、一連のユニットテストを作成しようとしています。私はクライアントを偽造する未解決のファイルを作るのに苦労しており、私は私の入力をテストさせます。データセットに属するテーブルのリストを返すために、いくつかのセット機能を持つ単純なスクリプトを提供しました。
誰かが私に@ https://github.com/googleapis/gogoogle-cloud-python/blob/master/bigquery/tests/bigquery/tests/bigquery/tests/bigquery/tests/bigquery/tests/bigquery/tests/bigquery/tests/test/bigquery/tests/blob/master/bigquery/tests/unit/ test_client.py コードのメソッドと直接対話していないため、コードに適用できません。
これを達成するためのアイデアや方法を感謝する、私はこの問題を文書化するスタックオーバーフローのどこにも見つけることができないようです。
ありがとう
from google.cloud import bigquery
def get_dataset():
client = bigquery.Client.from_service_account_json('some_client_secret.json')
dataset_id = 'some_project.some_dataset'
dataset = client.get_dataset(dataset_id)
full_dataset_id = "{}.{}".format(dataset.project, dataset.dataset_id)
friendly_name = dataset.friendly_name
print(
"Got dataset '{}' with friendly_name '{}'.".format(
full_dataset_id, friendly_name
)
)
# View dataset properties
print("Description: {}".format(dataset.description))
print("Labels:")
labels = dataset.labels
if labels:
for label, value in labels.items():
print("\t{}: {}".format(label, value))
else:
print("\tDataset has no labels defined.")
# View tables in dataset
print("Tables:")
tables = list(client.list_tables(dataset)) # API request(s)
if tables:
for table in tables:
print("\t{}".format(table.table_id))
else:
print("\tThis dataset does not contain any tables.")
_
それはかなりの量のグーグル、そして試行錯誤をし、これを行う方法を理解するために、そして私はそれを働いたばかりであるので、それは共有の価値があると思いました。
unittest
patch
を提供する使用時に関数を使用することができます、つまり。 [テスト]の下のコードでGoogle APIコールを置き換え、mock
を使用すると、そのモックの属性にアクセスしたり、関数を呼び出す結果をさらにカスタマイズできます。
unittest
docsここでのパッチを説明する: https://docs.python.org/3/library/unittestestestestestestestestestest.mock.htmol#where-to-patch
これはそれがどのように機能するかを説明していますが、これを正しくする方法を理解するために私が見つけた最良の説明: http://alexmarandon.com/articles/python_mock_gotchas/
これはテストされるPythonスクリプト、_mocking_google.py
_、Googleストレージへの参照とBigQuery APIを含むです。
_from google.cloud.bigquery import Client as bigqueryClient
from google.cloud.storage import Client as storageClient
def list_blobs():
storage_client = storageClient(project='test')
blobs = storage_client.list_blobs('bucket', prefix='prefix')
return blobs
def extract_table():
bigquery_client = bigqueryClient(project='test')
job = bigquery_client.extract_table('project.dataset.table_id', destination_uris='uri')
return job
_
これが単位テストです:
_import pytest
from unittest.mock import Mock, patch
from src.data.mocking_google import list_blobs, extract_table
@pytest.fixture
def extract_result():
'Mock extract_job result with properties needed'
er = Mock()
er.return_value = 1
return er
@pytest.fixture
def extract_job(extract_result):
'Mock extract_job with properties needed'
ej = Mock()
ej.job_id = 1
ej.result.return_value = 2
return ej
@patch("src.data.mocking_google.storageClient")
def test_list_blobs(storageClient):
storageClient().list_blobs.return_value = [1,2]
blob_list = list_blobs()
storageClient().list_blobs.assert_called_with('bucket', prefix='prefix')
assert blob_list == [1,2]
@patch("src.data.mocking_google.bigqueryClient")
def test_extract_table(bigqueryClient,extract_job):
bigqueryClient().extract_table.return_value = extract_job
job = extract_table()
bigqueryClient().extract_table.assert_called_with('project.dataset.table_id', destination_uris='uri')
assert job.job_id == 1
assert job.result() == 2
_
これがテスト結果です。
_pytest -v src/tests/data/test_mocking_google.py============================================================ test session starts =============================================================
platform darwin -- Python 3.7.6, pytest-5.3.5, py-1.8.1, pluggy-0.13.1 -- /Users/gaya/.local/share/virtualenvs/autoencoder-recommendation-copy-zpYZ6J1x/bin/python3
cachedir: .pytest_cache
rootdir: /Users/gaya/Documents/GitHub/mlops-autoencoder-recommendation, inifile: tox.ini
plugins: cov-2.8.1
collected 2 items
src/tests/data/test_mocking_google.py::test_list_blobs PASSED [ 50%]
src/tests/data/test_mocking_google.py::test_extract_table PASSED [100%]
============================================================= 2 passed in 1.14s ==============================================================
_
これがどのように機能するかは明確ではない場合はさらに説明してうれしいです:)