Pythonで発電機チェーンのユニットテスト

ジェネレータを入力としてジェネレータを生成するメソッドの単体テストを記述したいと思います。私はこの答えを構築しています。

この質問については、次の方法を考えてみましょう:

def candidates_for_deletion(self, generations_to_keep=2):
    for files in self.group_by_version(self.backups()).values():
        yield from files[:-generations_to_keep]

私は動作する次のテストを書いたが、私はそれをユニットテストと呼ぶことはできないと思う。データを再作成するために、S3バケツを嘲笑するすべてのメソッドに依存しているからだ。

import boto3
import pytest
from moto import mock_s3
from gitlabbackups import GitlabBackup


S3_OBJECTS_LIST = [
    '1526781621_2018_05_20_10.8.2_gitlab_backup.tar',
    '1530151221_2018_06_28_11.0.0_gitlab_backup.tar',
    '1530237621_2018_06_29_11.0.0_gitlab_backup.tar',
    '1530324021_2018_06_30_11.0.0_gitlab_backup.tar',
    'some_other_file',
    '1525917621_2018_05_10_10.8.2_gitlab_backup.tar',
    '1530410421_2018_07_01_11.0.1_gitlab_backup.tar',
    '1530496821_2018_07_02_11.0.1_gitlab_backup.tar',
    'a file with spaces inside',
    '1530583221_2018_07_03_11.0.1_gitlab_backup.tar',
    '1530669617_2018_07_04_11.0.1_gitlab_backup.tar'
]


def create_s3_bucket_with_sample_data(bucket):
    conn = boto3.resource('s3', region_name='us-east-1')
    conn.create_bucket(Bucket=bucket)
    for i in S3_OBJECTS_LIST:
        conn.Object(bucket, i).put('some content')


@mock_s3
@pytest.mark.parametrize("generations_to_keep,expected_candidates_for_deletion", [
    (1, ['1525917621_2018_05_10_10.8.2_gitlab_backup.tar',
         '1530151221_2018_06_28_11.0.0_gitlab_backup.tar',
         '1530237621_2018_06_29_11.0.0_gitlab_backup.tar',
         '1530410421_2018_07_01_11.0.1_gitlab_backup.tar',
         '1530496821_2018_07_02_11.0.1_gitlab_backup.tar',
         '1530583221_2018_07_03_11.0.1_gitlab_backup.tar']),
    (2, ['1530151221_2018_06_28_11.0.0_gitlab_backup.tar',
         '1530410421_2018_07_01_11.0.1_gitlab_backup.tar',
         '1530496821_2018_07_02_11.0.1_gitlab_backup.tar'])
])
def test_candidates_for_deletion(generations_to_keep, expected_candidates_for_deletion):
    create_s3_bucket_with_sample_data('mocked-bucket')
    gitlab_backups = GitlabBackups('mocked-bucket')
    candidates_for_deletion = gitlab_backups.candidates_for_deletion(generations_to_keep)
    assert expected_candidates_for_deletion == list(candidates_for_deletion)

私は backups()の出力を提供する必要があると思います。

 {'10.8.2': ['1525917621_2018_05_10_10.8.2_gitlab_backup.tar',
             '1526781621_2018_05_20_10.8.2_gitlab_backup.tar'],
  '11.0.0': ['1530151221_2018_06_28_11.0.0_gitlab_backup.tar',
             '1530237621_2018_06_29_11.0.0_gitlab_backup.tar',
             '1530324021_2018_06_30_11.0.0_gitlab_backup.tar'],
  '11.0.1': ['1530410421_2018_07_01_11.0.1_gitlab_backup.tar',
             '1530496821_2018_07_02_11.0.1_gitlab_backup.tar',
             '1530583221_2018_07_03_11.0.1_gitlab_backup.tar',
             '1530669617_2018_07_04_11.0.1_gitlab_backup.tar']}

他のメソッドに頼るのではなく、ジェネレータを返すヘルパー関数であるかどうかはわかりません。

このようなメソッドの適切な単体テストを書く方法はありますか?コードを書き直すべきですか?

ベストアンサー

有用なテスト、おそらく統合テストのように見えます。

That said you should put this in a unitest2.testcase class
https://docs.python.org/dev/library/unittest.html

It works nicely with pytest https://docs.pytest.org/en/latest/unittest.html

setUpClassメソッドですべてのフィクスチャを作成することができます

test_で始まるすべてのメソッドが実行され、組み込みのアサーションの素晴らしいライブラリを使用することができます。

ジェネレータジェネレータ関数をTestCaseインスタンスのメソッドとして追加し、test_メソッドから呼び出すことができます。

これらのリンクは両方とも詳細をカバーしています。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です