#python #pytest #python-unittest
Вопрос:
Я запускаю несколько тестов для функции, целью которой является получение дочернего класса объекта (вызываемого Parameter
) на основе строки, возвращаемой из атрибута Parameter
дочернего класса param_name
. Тест определен ниже:
@pytest.mark.parametrize('param_string, expected_result', [ ('Zip Code', p.ZipCode), ('Property Type', p.PropertyType) ]) def test_check_class_from_param_string(param_string, expected_result): assert utils.check_class_from_param_string(param_string) == expected_result
Функция check_class_from_param_string
определена ниже:
def check_class_from_param_string(param): ''' Given a parameter string, pair it up with a Parameter child class. :param str param: the param_name of a Parameter child class :return: the Parameter child class that matches the string :rtype: Parameter child class or None ''' # Iterate through the list of Parameter child classes for c in PARAMETERS: # If the name matches the class's name, return the class if c.param_name == param: return c return None
Несмотря на то, что я знаю, что этот тест должен пройти, это не так, потому ZipCode
PropertyType
что классы и имеют несколько разные относительные пути в соответствии с Pytest. Ниже приведен результат теста:
FAILED testing/test_utils.py::test_check_class_from_param_string[Zip Code-ZipCode] - AssertionError: assert lt;class 'parameters.ZipCode'gt; == lt;class 'project.parameters.ZipCode'gt; FAILED testing/test_utils.py::test_check_class_from_param_string[Property Type-PropertyType] - AssertionError: assert lt;class 'parameters.PropertyType'gt; == lt;class 'project.parameters.PropertyType'gt;
Как вы можете видеть, на одной стороне ZipCode
находится файл «Найдено parameters.ZipCode
«, в то время как на другой стороне находится папка проекта project.parameters.ZipCode
. Ниже приведено мое дерево папок:
. ├── project │ ├── app.py │ ├── constants.py │ ├── parameters.py ├── testing │ ├── test_parameters.py
Почему классы имеют разные относительные пути?
Комментарии:
1. Потому что , скорее всего, вы что-то напутали
sys.path
, поэтому для определения местоположения импорта используются как корневой каталог, так иproject
каталог.