質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • Python 3.x

    7398questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Flask

    248questions

    FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

  • SQLAlchemy

    48questions

    SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

  • ユニットテスト

    37questions

    ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。

UUIDのuuid4()のテスト方法(python3/pytest)

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 253

現在、pytestでテストコードを書いています。そのテスト対象のpythonコードで書かれた関数内でアカウントがuuid4()によって作成されています。そのuuid4()によって生成されたUUIDがちゃんと返されているかどうか、そのIDがUUIDであるかどうかを確認できるテストコードを書きたいと思っています。
しかし、中々そういったテストの方法が見つかりません。毎回生成されるIDがランダムでユニークなのでその値がUUIDであるかどうか、という点のみをチェックできればよいのかなと思っています。

具体的には、以下のような関数に対してテストコードを書きたいです。

pythonコード

def account_id (id,name):
    account = str(uuid.uuid4())

    return account

テストコード(pytest)

id = 9999
name = 'testuser'

def test_account_id():

    account = account_id(id,name)
##ココから下がどう書いていけばよいのかわからない。
    val = xxxx()

    assert account == val

以下のようなサンプルコードをみつけましたが、このコードは、UUIDが生成されたかどうかを確認しているコードでuuid4()によって生成されたコードがUUIDであるかどうかのチェックはしていないと思っています。

from uuid import UUID

def validate_uuid4(uuid_string):

    """
    Validate that a UUID string is in
    fact a valid uuid4.
    Happily, the uuid module does the actual
    checking for us.
    It is vital that the 'version' kwarg be passed
    to the UUID() call, otherwise any 32-character
    hex string is considered valid.
    """

    try:
        val = UUID(uuid_string, version=4)
    except ValueError:
        # If it's a value error, then the string 
        # is not a valid hex code for a UUID.
        return False

    # If the uuid_string is a valid hex code, 
    # but an invalid uuid4,
    # the UUID.__init__ will convert it to a 
    # valid uuid4. This is bad for validation purposes.

    return val.hex == uuid_string

また、pytestのmockを利用してpythonコードから返すuuidにprefixをつけて、テストコード側では擬似的にuuidを生成してprefixをつけてprefixがあっているかどうかをテストコードで書くというコードもweb上でみつけましたが、正直、このテストコードのやりたいことが理解できません。どなたか咀嚼して教えて頂けると嬉しいです。
https://stackoverflow.com/questions/44395755/how-to-mock-uuid-generation-in-a-test-case

一方で、以下のコードを組み合わせると生成されたUUIDがversion4なのかどうかをチェックはできるような気がしますが、実際にこれが正解な解答なのかどうか自信がありません。

from uuid import UUID


def version_uuid(uuid):
    try:
        return UUID(uuid).version
    except ValueError:
        return None

def version_list(l):
    return [version_uuid(uuid) for uuid in l]

if __name__=="__main__":
    uuids = (
        '0d14fbaa-8cd6-11e7-b2ed-28d244cd6e76',
        '6fa459ea-ee8a-3ca4-894e-db77e160355e',
        '16583cd3-8361-4fe6-a345-e1f546b86b74',
        '886313e1-3b8a-5372-9b90-0c9aee199e5d',
        '0d14fbaa-8cd6-11e7-b2ed-28d244cd6e7',
        '6fa459ea-ee8a-3ca4-894e-db77e160355',
        '16583cd3-8361-4fe6-a345-e1f546b86b7',
        '886313e1-3b8a-5372-9b90-0c9aee199e5',
        '481A8DE5-F0D1-E211-B425-E41F134196DA',
    )
    assert version_list(uuids) == [1,3,4,5,None,None,None,None,14]

自分で書き換えたコード

id = 9999
name = 'testuser'

def test_account_id():
    account = account_id(id, name)
    assert UUID(account).version == 4
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    7398questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • Flask

    248questions

    FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

  • SQLAlchemy

    48questions

    SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

  • ユニットテスト

    37questions

    ユニットテストは、システムのテスト手法の一つで、個々のモジュールを対象としたテストの事を指します。対象のモジュールが要求や性能を満たしているか確認する為に実行します。