Как передать разные значения типа DataType в гипотезе и как проверить, что возвращаемый тип и значение верны в Python
Выполнение примера кода для модульного тестирования в Python с модулем гипотезы. Написал просто getTimeDelta
функция, чтобы получить разницу во времени между двумя датами.
Хотите написать юнит тест getTimeDelta
функция. Используются модули гипотез для получения нескольких datetime
ценности.
Вопрос в том, что:
1. Как передать разные значения типа данных, т.е. time1
это ул и time2
является datetime
без написания нескольких функций?
проверка только типа данных возвращаемого значения, а не фактический результат является правильным или нет. Как это сделать?
Как проверить типы данных элементов, кортежа результата?
assertIsInstance
Код:
import unittest
from hypothesis import given
from hypothesis import strategies as st
import datetime
from dateutil.parser import parse as time_parse
def getTimeDelta(time1, time2):
try:
if isinstance(time1, str):
time1 = time_parse(time1)
if isinstance(time2, str):
time2 = time_parse(time2)
return (time1 - time2, {"message": ""})
except Exception as err:
return (False, {"message": "Exception {}".format(err)})
class TestTimeDeltaCalc(unittest.TestCase):
def __init__(self, *args, **kwargs):
super(TestTimeDeltaCalc, self).__init__(*args, **kwargs)
self.utils = Utils()
@given(st.datetimes(), st.datetimes())
def test_time_delta(self, time1, time2):
time_delta = getTimeDelta(time1, time2)
if time_delta[0] is False:
self.assertIsInstance(time_delta[0], bool)
else:
self.assertIsInstance(time_delta[0], datetime.timedelta)
self.assertIsInstance(time_delta[1], dict)
@given(st.text(), st.text())
def test_time_delta(self, time1, time2):
time_delta = getTimeDelta(time1, time2)
if time_delta[0] is False:
self.assertIsInstance(time_delta[0], bool)
else:
self.assertIsInstance(time_delta[0], datetime.timedelta)
self.assertIsInstance(time_delta[1], dict)
if __name__ == '__main__':
unittest.main()
Изменить 01:
Мы можем исправить # Вопрос1 hypothesis.strategies.one_of(*args)
, ссылка
1 ответ
one_of
это совершенно правильный подход.Есть много способов проверить свойства (см., Например, эту статью), но самым простым здесь, вероятно, является "тестовый оракул": просто сравните результат с заведомо хорошей реализацией! В противном случае вы могли бы, например. проверьте, что timedelta отрицательна /0/ положительна, если time1 равно lt/eq/gt time2 - это в основном оракул с более низким разрешением.
Ваш
assertIsInstance
звонки выглядят так, как будто они будут работать на меня.