Как передать разные значения типа DataType в гипотезе и как проверить, что возвращаемый тип и значение верны в Python

Выполнение примера кода для модульного тестирования в Python с модулем гипотезы. Написал просто getTimeDelta функция, чтобы получить разницу во времени между двумя датами.

Хотите написать юнит тест getTimeDelta функция. Используются модули гипотез для получения нескольких datetime ценности.

Вопрос в том, что: 1. Как передать разные значения типа данных, т.е. time1 это ул и time2 является datetime без написания нескольких функций?

  1. проверка только типа данных возвращаемого значения, а не фактический результат является правильным или нет. Как это сделать?

  2. Как проверить типы данных элементов, кортежа результата? 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 ответ

  1. one_of это совершенно правильный подход.

  2. Есть много способов проверить свойства (см., Например, эту статью), но самым простым здесь, вероятно, является "тестовый оракул": просто сравните результат с заведомо хорошей реализацией! В противном случае вы могли бы, например. проверьте, что timedelta отрицательна /0/ положительна, если time1 равно lt/eq/gt time2 - это в основном оракул с более низким разрешением.

  3. Ваш assertIsInstance звонки выглядят так, как будто они будут работать на меня.

Другие вопросы по тегам