Я хочу написать юнит-тесты для класса с несколькими методами преобразования данных.
Высокий уровень:
class my_class:
def __init__(self, file):
# read data out of .yml config file
config = read_data_from_yml_config(file)
self.value1 = config["value1"]
self.value2 = config["value2"]
def get_and_transform(self):
data_dict = self.get_data()
transformed_data = self.transform_data(data_dict)
return transformed_data
def get_data(self):
data_dict = request_based_on_value1(self.value1)
return data_dict
def transform_data(self, data_dict):
trnsf = transform1(data_dict, self.value2)
return trnsf
Здесь у меня есть несколько вопросов. Здесь главное проверить my_class.transform_data()
. Он принимает dict в качестве входных данных, читает его как pandas фрейм данных и выполняет некоторые преобразования.
В моем понимании мне нужно несколько приборов d1
, d2
, d3
, ... (как различные значения для data_dict
), которые представляют различные входные данные тестового примера для my_class.transform_data ( ). Поскольку я хочу убедиться, что выходные данные соответствуют ожидаемым, я также определю ожидаемый результат:
o1 # expected output for transform_data(d1)
o2, o3, ... # respectively
Несколько вопросов к этому:
- Правильно ли подходит этот подход?
- Как и где я могу указать
d1
, d2
, ... и o1
, o2
, ....? Я мог бы сделать это в test_my_class.py
-файле или сохранить d1_sample.pkl, ... в папке tests/
. Здесь я бы выбрал минимальный пример для d
и o
- Поскольку преобразование в
transform_data
также зависит от атрибута self.value2
, как бы я передавал различные значения для value2
без создать экземпляр my_class
?
В общем, мне также не совсем ясно, буду ли я тестировать на уровне «объекта» или на уровне «метода». Выше я описал подход «метод» (потому что меня в основном интересуют результаты transform_data
). Альтернативой может быть предоставление различных файлов .yml и, таким образом, создание различных тестовых экземпляров my_class
.
def yml1():
config = read_in_yml1()
return config
# and so on for different configurations.
, а затем для теста:
@pytest.mark.parametrize("test_input, expected", [(yml1, ???), (yml2, ???)])
def test_my_class():
test_class = my_class(file)
assert test_class.transform_data == expected
Однако в качестве функции ввода my_class.transform_data()
не зависит (напрямую) от содержания yml1
, а скорее от ответа my_class.get_data()
, что, кажется, не имеет большого смысла. Как бы я проверил для различных входных значений data_dict
?
Как правильно написать модульные тесты в этом сценарии?