Как я могу создать настраиваемые стратегии пользовательских гипотез, которые используют `builds()`?

Я создал собственные стратегии гипотез, используя builds() а также @composite (дизайн вдохновлен этим примером из документации). Стратегии разработаны аналогично псевдокоду ниже:

# strategies.py

from hypothesis.strategies import builds, composite, draw, floats, integers

class SutConfiguration:
    """ Data which represents the configuration of the system under test. """
    def __init__(self, integer, float):
        self.integer = integer
        self.float = float

# custom strategy which uses builds()
SutConfigurationStrategy = builds(
    SutConfiguration,
    integer=integers(min_value=APP_SPECIFIC_INT_MIN, max_value=APP_SPECIFIC_INT_MAX),
    float=floats(min_value=APP_SPECIFIC_FLOAT_MIN, max_value=APP_SPECIFIC_FLOAT_MAX),
)

@composite
def overall_test_configuration(draw, sut_st=SutConfigurationStrategy, env_st=SutEnvironmentStrategy):
    """Custom strategy which uses draw."""
    sut_config = draw(sut_st)
    env_config = draw(env_st)
    return (sut_config, rc_stereomatching_config, env_config)

Стратегия используется как обычно, например, используя unittest в качестве тестового бегуна:

# test.py

import unittest
from <package>.strategies import overall_test_configuration

class TestSut(unittest.TestCase):
    """Class containing several tests for the system under test."""
    @given(overall_test_configuration())
    def test_something():
        """Test which uses overall_test_configuration"""
        ...

Теперь я хотел бы сделать стратегии настраиваемыми для реального приложения, чтобы определить, например, min_value в integers(min_value=APP_SPECIFIC_INT_MIN, ...) при определении тестовой функции. Это можно сделать для @composite стратегии с помощью агентов, как здесь. Но как я могу сделать стратегии, которые используют builds() настраивается?

2 ответа

Решение

Решение, примененное к псевдокоду выше, чтобы сделать, например, целочисленное значение конфигурации SUT SutConfigurationStrategy настраиваемый будет выглядеть так:

# strategies.py

from hypothesis.strategies import builds, composite, draw, floats, integers

class SutConfiguration:
    """ Data which represents the configuration of the system under test. """
    def __init__(self, integer, float):
        self.integer = integer
        self.float = float

# custom strategy which uses builds()
def SutConfigurationStrategy(min_int_config, max_int_config):
    return builds(SutConfiguration,
                  integer=integers(min_value=min_int_config, max_value=max_int_config),
                  float=floats(min_value=APP_SPECIFIC_FLOAT_MIN, max_value=APP_SPECIFIC_FLOAT_MAX),
)

@composite
def overall_test_configuration(draw, sut_min_int_config, sut_max_int_config, sut_st=SutConfigurationStrategy, env_st=SutEnvironmentStrategy):
    """Custom strategy which uses draw."""
    sut_config = draw(sut_st(sut_min_int_config, sut_max_int_config))
    env_config = draw(env_st)
    return (sut_config, rc_stereomatching_config, env_config)

Целочисленное значение стратегии может, например, быть настроено на минимальное из 10 и максимум 100 (снова: unittest как тестовый бегун):

# test.py

import unittest
from <package>.strategies import overall_test_configuration

class TestSut(unittest.TestCase):
    """Class containing several tests for the system under test."""
    @given(overall_test_configuration(min_int_config=10, max_int_config=100))
    def test_something():
        """Test which uses overall_test_configuration"""
        ...

Примечание: это не оптимально для использования class SutConfiguration здесь, чтобы инкапсулировать данные. Namedtuple был бы лучшим выбором здесь...

Вы можете определить функцию, которая возвращает стратегию, как и любую другую:

def some_custom_strategy(a, b):
    return builds(foo, bar(a, b))

Это все, что происходит с составным, когда у вас есть дополнительные аргументы - составной определяет функцию, которая возвращает стратегию, и эти дополнительные аргументы передаются через функцию в базовую декорированную функцию.

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