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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Flask

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

Python 3.x

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

SQLAlchemy

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

ユニットテスト

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

Q&A

1回答

3451閲覧

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

sequelanonymous

総合スコア123

Flask

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

Python 3.x

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

SQLAlchemy

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

ユニットテスト

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

0グッド

0クリップ

投稿2018/07/15 06:13

編集2018/07/15 06:25

現在、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

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

uuid.uuid4() のテスト自体は不要の認識です。
というのも、uuid.uuid4()のテストは、Pythonの公式ライブラリをテストしていることになるためです。
ライブラリはリリース前にきちんとテストされているとみなして問題ないと思います。

uuid.uuid4() で生成されるUUIDは、8桁-4桁-4桁-4桁-12桁の文字列によって構成されますので、もしテストしたいのであれば、このフォーマットをチェックすれば良いのではないでしょうか。

投稿2020/02/22 00:44

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問