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

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。