Как выполнить модульное тестирование многоэтапных функций-членов в полиморфных классах, используемых с std::variant?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как выполнить модульное тестирование многоэтапных функций-членов в полиморфных классах, используемых с std::variant?

Сообщение Anonymous »

У меня есть три класса процессоров, которые используют общий интерфейс для полиморфного поведения, используя std::variant и std::visit. Каждый процессор имеет функцию-членprocessData(), которая внутри состоит из нескольких зависимых этапов (аналогично вычислительным ядрам в таких средах, как Kokkos).

Код: Выделить всё

template
class Processor1 {
private:
std::vector data;
std::vector intermediate1;
std::vector result;

public:
Processor1(std::vector input) : data(input) { /*...*/ }

// Big function with multiple dependent stages
std::vector processData() {

for (size_t i = 0; i < data.size(); ++i) {
intermediate1[i] = data[i] / 100;
}

for (size_t i = 0; i < intermediate1.size(); ++i) {
result[i] = intermediate1[i] * intermediate1[i];
}

// ... more stages

return result;
}
};

// Similar structure for Processor2 and Processor3
class Processor2 { /*...*/ };
class Processor3 { /*...*/ };
Использование с std::variant

Код: Выделить всё

std::vector> processors;

for (auto& p : processors) {
std::visit([](auto& processor) {
processor.processData();
}, p);
}
Проблема:
Я хочу писать модульные тесты для каждого этапа ProcessData() независимо, а не тестировать весь конвейер как одну монолитную функцию. Тем не менее,processData() — это общий интерфейс, необходимый для полиморфного поведения.
Вопросы:
Могу ли я реорганизовать процессData(), извлекая каждый этап в отдельные функции-члены, не нарушая при этом полиморфный интерфейс?
Влияет ли извлечение этапов на отдельные функции на полиморфное использование с std::variant и std::visit?

Подробнее здесь: https://stackoverflow.com/questions/798 ... sed-with-s
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»