Как я понимаю «компонентное тестирование» |
16.07.2025 00:00 |
Автор: Никонов Владислав Почитываю книжку Искусство Agile-тестирования и наткнулся в ней на такую штуку как "компонентное тестирование" (КТ). Я уже не первый раз натыкаюсь на этот термин, в первый раз я поискал инфу об этом, как то не очень понял и забил. Но с каждой последующей встречей у меня все больше подгорало. В пирамиде тестирования, КТ стоит сразу после модульного. И если unit-тесты это участь разработчиков, то КТ это уже, якобы, зона ответственности тестировщика, отсюда необходимость хоть как то в этом разобраться. Начнем с определений. Самое крутое (тут сарказм), которое я нашел это - "Компонентное тестирование программного обеспечения - это тестирование отдельных компонентов программного обеспечения". Да и вообще, во многих статьях определение пропускается и пишется, что-то вроде "компонентное тестирование это вид тестирования который следует сразу после модульного и до интеграционного". Еще варианты:
Тут интересно уточнение "без интеграции/без связи с др. компонентами", но при этом КТ делиться на два вида: "Тестирование компонентов в малом" и "Тестирование компонентов в целом". И в случае тестирования компонентов в целом, из определения следует, что конкретный компонент тестируется с помощью других компонентов продукта. И вот вам еще на вентилятор, во всех источниках мелькает фраза "компонентное тестирование также называют модульным". Хотя мы уже слышали, что КТ выполняется после модульного. Собственно все эти противоречия порождают следующие вопросы:
Давайте разбираться. Естественно, все что я пишу, это мое субъективное понимание происходящего, буду рад критике, ибо, как фанат Сократа, хочу познать истину.
Говоря про разделение видов тестирования по уровню, мы попадаем в удивительный мир абстракции. Модулем может являться как метод или функция, так и компонент или подпрограмма, главное чтобы его можно было протестировать изолированно. Даже в великой ISTQB, модуль могут назвать компонентом и наоборот. То есть мы видим, что в МТ существуют оба понятия "модуль" и "компонент", и в зависимости от абстракции иногда одно является другим, а значит КТ все-таки можно отнести к МТ.
Теперь, когда мы преисполнились познанием, становится понятно, что второй вопрос некорректный. Правильнее спросить "В чем разница unit-теста и теста компонента?". Помимо субъективного выделения, которое зависит от архитектурных решений, атомарности и фиг знает еще чего, существует различия в тестовых данных, которые использует тест. В одной статье было сказано "разница в том, что в КТ в качестве параметров функций используют реальные объекты, а в unit тестировании - конкретные значения". Как я это понимаю: Например, у нас есть компонент - большой метод, который получает на вход объект собранной корзины с товарами, внутри он разбит на модули - атомарные методы, каждый из которых, выполняет свою работу: один принимает на вход id товара и возвращает его цену, второй применяет скидку если есть купон, третий рассчитывает дополнительные скидки по количеству товаров или общей стоимости и т.д. Отсюда видно, что методы-модули получают на вход технические данные, а метод-компонент получает на вход бизнес данные. С этим можно спорить, но именно появление бизнес данных, это тот момент когда врывается тестировщик, потому что, как правило, это одно из обязанностей QA - подготовка тестовый данных и речь ведь именно о бизнес данных. Другими словами - unit тест проверяет, что модуль работает согласно спецификации, а компонентный тест уже проверяет, что компонент работает согласно бизнес требованию.
Итак, unit тест - это технический тест, а тест компонента - функциональный тест. Если рассуждать так, то вроде вполне логично, что за тесты компонентов должны отвечать тестировщики. Юрий Чернов в книге так и обозначает зоны ответственности. Но я с этим не согласен с точки зрения компетенций тестировщика. Модульное тестирование - это про изоляцию, а значит нужны либо замоканые данные, либо драйверы. Это не тривиальная задача для QA. Выше мы рассмотрели пример ближе к бэковой части, но ведь у фронтенд разработчиков тоже есть МТ, а значит есть и КТ. Тут выделять компоненты мне кажется чуть проще, ну чем вам какая-нибудь отдельная форма не компонент. А отдельное поле, вполне себе модуль. Но на сколько часто QA клепают какие-то тесты на уровне модульного тестирования? С проверками именно корректной работы формы, как отдельной сущности в контексте DOM веб страницы. Напоминаю, это уровень МТ, данные тут изолированы. Это не совсем те ui тесты, которые вы привыкли клепать на Cypress/Selenide. В общем, на мой взгляд, разработчики полностью занимаются уровнем МТ:
Ну а ответ на четвертый вопрос, вы уже сами поняли - так как это МТ, то используются драйверы и заглушки. Это код имитирующий работу смежных компонентов. Например, функциональная последовательность работы компонентов следующая: получение данных -> приведение данных к нужному виду -> работа с данными. Мы проводим КТ третьего компонента. Используя "тестирование компонентов в целом" мы просто замокаем работу второго компонента, от которого тестируемый компонент получает данные. Собственно, так я понял "компонентное тестирование". А вот список статей, которые я почитал:
Вот тут можно указать мне на мою тупость и рассказать как правильно. |