Unit test – один из самых значимых этапов выпуска программного обеспечения. В данной статье предстоит выяснить, что он собой представляет, какие особенности, преимущества и недостатки имеет. Необходимо понять разницу между модульным и итерационным тестированием, рассмотреть методы и виды изучаемой операции. Дополнительно нужно ознакомиться со смежной манипуляцией – разработкой через тестирование. Предложенная информация подойдет как тестировщикам, так и обычным программистам.
Определение
Тест – это исследование того или иного проекта. Целью соответствующей операции является получение данных о качестве программы. Тесты кодов дают возможность оценивать разнообразные риски программного обеспечения, а также удостовериться в его исправности и работоспособности.
Юнит тестирование – тесты кодов, направленные на проверку исправности функционирования отдельных частей приложения (модулей), а также их процессов. С помощью таких тестов получается избегать ошибок, быстро обнаруживать текущие неисправности в процессе обновления того или иного проекта.
Юнит тесты не требуют полной проверки исходного приложения – только его определенных частей. Проводятся они обычно на этапе разработки (непосредственного написания кода).
Модульные тесты будут изолировать часть кода, а затем проверять его на факт работоспособности. В виде единиц измерения обычно выступают:
- объекты;
- методы;
- модули;
- определенные функции;
- процедуры.
Рассматриваемые тесты – это первый этап тестирования. Они относятся к «белому ящику» (white box), который выполняется непосредственно программистом. Данная задача может быть поручена QA-инженерам, но такое наблюдается лишь в небольших компаниях с маленьким кадровым составом.
Зачем используется
Модульные тесты заключаются в том, чтобы избежать накапливания ошибок в коде в будущем, а также исключить регрессию ранее отлаженных модулей.
Рассматриваемые операции решают следующие задачи:
- Поиск ошибок и их исправление на ранних этапах программирования. Это помогает значительно снизить затраты на разработку проекта в будущем.
- Улучшение понимания разработчиками базового кода программного обеспечения.
- Предоставление возможности простой и быстрой корректировки кода приложения в случае необходимости.
- Повторное использование кода или его фрагментов в других продуктах (включая сами тесты).
- Предоставление своеобразной проектной документации. В Unit test описываются особенности исходного кода. С их помощью программисты, не знакомые с проектом, смогут быстро понять принцип его функционирования.
С помощью модульного тестирования удается экономить разнообразные ресурсы разработчиков и заказчика. Сюда относятся не только финансы, но и время на программирование/поддержку имеющегося программного проекта.
Преимущества и недостатки
Рассматриваемая операция имеет как сильные, так и слабые стороны. Модульные тесты пользуются огромным спросом в большинстве программных продуктов. Именно поэтому его особенности должен знать каждый тестировщик.
К преимуществам Юнит тестов относят:
- Простоту. Написание теста для отдельных модулей кода намного проще, чем проверка всего приложения целиком.
- Высокий уровень информативности. Грамотно составленный тест помогает понять API-программы, функциональные возможности того или иного модуля, особенности его применения. Все это бывает очень полезно, если при работе над проектом произошла смена ответственных лиц за разработку и проверку продуктов.
- Возможность реализации параллельной разработки. Рассматриваемый процесс позволяет организовать проверку работы одного элемента (фрагмента) независимо от других частей приложения. Данный прием позволяет параллельно разрабатывать разнообразные программные модули. Время на создание исходного проекта будет сокращено.
- Возможность повторного использования. Достаточно один раз создать тест для проверки конкретного модуля, чтобы вернуться к нему позднее для повторной проверки фрагмента кода.
Недостатки у Юнит тестов тоже есть. К ним можно отнести:
- Отсутствие гарантий обнаружения ошибок. Это связано с тем, что даже в небольших и простых приложениях проблематично предугадать все возможные сценарии реализации (выполнения).
- Возможность выявления ошибок только в отдельных модулях, а не во всем программном обеспечении. Модульные тесты не позволяют увидеть неполадки и ошибки, возникающие при интеграции фрагментов кода друг с другом.
Рассматриваемый процесс не подойдет для выявления системных ошибок во всем проекте целиком.
Модульное и интеграционное тестирование: разница
Unit testing часто путают с интеграционным тестированием. Это не совсем правильно. Оба вида проверки – это тесты, но они совершенно разные в плане реализации и назначения уровня проверки исходных кодов.
У модульного тестирования можно выделить следующие ключевые особенности:
- Узкая специализация. Проверять предстоит только отдельно взятые фрагменты кода, а не все приложение сразу.
- Простота реализации. Тестирование модулей отдельно друг от друга (особенно в процессе параллельной разработки) – это достаточно простая операция в плане реализации. Она может быть организована без привлечения дополнительных внешних ресурсов.
Интеграционные тесты отличаются такими особенностями как:
- Общая направленность. При организации интеграционных тестов кода проверке подвергается все программное обеспечение, включая основное ядро и функциональные возможности имеющегося проекта.
- Сложность реализации. Интеграционное тестирования осуществляется в среде, которая максимально приближена к реальной. Такая операция требует значительных ресурсов (баз данных, серверов).
Модульное и интеграционное тестирование в реальной практике не противопоставляются. Они прекрасно дополняют друг друга. За счет проверки каждого отдельного модуля исходного кода можно минимизировать количество ошибок, которые обязательно всплывут при интеграции элементов приложения. Интеграционное тестирование дает возможность оценить взаимодействие фрагментов программного обеспечения друг с другом и с ядром проекта.
Виды тестирования
Юнит тесты бывают разными. А именно:
- Ручными. Они проводятся очень просто по заранее сформированной документации, включающей в себя пошаговые инструкции. Такой подход рекомендуется только для небольших и достаточно простых фрагментов кода. Ручные тесты отнимают много времени.
- Автоматизированными. Юнит тесты заключаются в использовании специально разработанных тестовых сред. Они будут проверять работу модулей и выявлять в них ошибки. Для каждой функциональной части программного обеспечения пишется отдельный код теста. Один и тот же тест для проверки разных элементов проекта применять нельзя. Проверяемый модуль при автоматизированном тестировании требуется изолировать от ядра приложения и других его составляющих. Это поможет избежать искажения результатов проверки.
Рекомендуется пользоваться обоими видами модульного тестирования для самых разных проектов. Автоматизированный подход позволяет смоделировать разнообразные сценарии поведения исходного кода. Если в процессе проверки обнаруживаются серьезные сбои и ошибки, система остановит процесс до их непосредственного устранения программистом. После этого тест запускается снова.
Методы реализации
Для организации рассматриваемого процесса используются разнообразные методы. К ним относят:
- Черный ящик (black box). При таком подходе тестирование организовывается по входным и выходным сигналам модуля без анализа структуры его исходного кода. Обычно «черный ящик» используется тогда, когда проверка выполняется новым или сторонним разработчиком – специалистом, который не участвовал в непосредственной разработке проекта или его компонентов.
- Белый ящик (white box). При таком методе тестированию подвергаются внутренние структуры модулей, их возможности, особенности поведения, реакции на посылаемые (входные) сигналы и так далее. Изначально здесь изучаемый элемент является полностью прозрачным и понятным разработчику, оценивающим внутренние и внешние аспекты его работы.
К одному и тому же элементу можно применять различные концепции проверки. «Черный и белый ящики» не исключают других инструментов тестирования. Обычно программисты создают для каждого проекта уникальные тесты, принимающие во внимание особенности того или иного программного продукта.
Реализация «белого ящика»
Чтобы лучше понимать рассматриваемые тесты, подробнее будет изучен метод «белого ящика». Он включает в себя несколько этапов:
- Анализ отдельно взятого модуля. На этом этапе проверки программист занимается изучением внутренней структуры кода, а также функциональные возможности модуля и его поведение в процессе работы. Этот этап проходит на порядок быстрее, если разработчик сам создавал фрагмент кода или участвовал в его формировании. В противном случае придется поднимать соответствующую документацию, а также консультироваться с создателем блока кода. Только это поможет понять, как работает проверяемый компонент.
- Формирование кейс-листа. Так называется сценарий или модуль, которые должны продемонстрировать поведение проверяемого фрагмента исходного кода в реальной обстановке. Далее создаются искусственные среды, максимально приближенные к реальной, но без привлечения внешних ресурсов (они обычно используются в работе программы): веб-серверов, информационных баз и так далее.
- Тестирование модуля. Проверяемый элемент, предварительно изолированный от ядра программы и других фрагментов кода, запускается в тесте. Разработчику необходимо обратить внимание на то, как кодовый блок реагирует на входные сигналы, как он работает, соответствует ли его структура выполняемым задачам. Программист также анализирует возможные ошибки и неполадки.
Описанный алгоритм характеризует метод «белого ящика», часто встречающийся в юнит тестах. С его помощью получится лучше и быстрее понять, за что отвечает рассматриваемый тип проверки программного обеспечения.
Рекомендации к модульному тестированию
Чтобы грамотно провести Unit тестирование, необходимо, чтобы тесты:
- Соответствовали определенному модулю. Один и тот же тест не может применяться для тестирования разных в плане реализации и назначения фрагментов кода.
- Являлись автоматизированными. Ручная проверка тоже может пригодиться, но она менее эффективна и более трудоемка. Unit тесты лучше вписывать в сам код. Это поможет запускать соответствующую проверку автоматически.
- Были современными. Если тест не может быть написан до разработки самого кода программы, его лучше создавать параллельно. Такой прием позволит сэкономить много времени в будущем.
- Отвечали ключевым (основным) задачам. В процессе написания тестов не требуется учитывать все возможные сценарии поведения программы. Рекомендуется сосредоточиться на ключевых задачах, а остальные вносить (дополнять) по мере необходимости.
- Обладать понятными и хорошими названиями. Имена у проверок должны описывать то, что именно проверяется, в каких условиях это делается. Рекомендуется также указывать желаемые результаты.
Эти советы помогут лучше понять, как писать юнит тесты в том или ином случае. Существуют ситуации, при которых модульные проверки проводить не рекомендуется. О них тоже должен помнить каждый разработчик.
Когда не нужны модульные проверки
От рассматриваемого типа проверки программного обеспечения необходимо отказаться в следующих случаях:
- Проводится тестирование сложных и разветвленных алгоритмов (примером может послужить красно-черное дерево). В этом случае приходится разрабатывать огромное количество тестов, что значительно усложняет и замедляет проверку.
- Когда отсутствуют четкие результаты. Примером может послужить математическое моделирование природных процессов. Эта операция настолько сложная, что их «выход» невозможно спрогнозировать – лишь описать в виде интервалов вероятных значений.
- При проверке кода, взаимодействующего с системой. Пример – модуль, связанный с портами, таймерами или иными «нестабильными» элементами, которые проблематично изолировать.
- В процессе проверки всего кода приложения. Юнит тестирование не показывает интеграционные ошибки, неполадки в ядре и иные сбои, которые не относятся непосредственно к тому или иному модулю.
- Если у разработчика недостаточно квалификации и низкая культура программирования. Это связано с тем, что «модульная проверка» работает лишь тогда, когда строго соблюдаются правила и принципы технологии. Этот процесс также сопровождается постоянным отслеживанием всех вносимых во фрагмент кода изменений.
Рассматриваемая проверка кода неэффективна при работе с максимально простым кодом. Она сработает и покажет верный результат, но нет смысла тратить ресурсы (силы, время и так далее) на ее реализацию.
Разработка через тестирование
При разработке программного обеспечения обычной является ситуация, при которой программист сначала пишет код, а затем создает под него тесты и выполняет проверку. Достаточно часто используется и обратный процесс. Речь идет о ситуации, когда сначала разрабатывается тест, а затем на его основе пишется программный код.
Описанный процесс – это «разработка через тестирование». Его суть заключается в том, чтобы с помощью заранее написанных тестов определить требования к будущему проекту.
Разработку через тестирование можно разделить на несколько этапов:
- Формирование и добавление теста. Операция осуществляется перед внедрением каждой новой функции в исходный код приложения. Запускаться проверка не будет из-за того, что проверяемый блок (фрагмент) еще не написан. Если тестирование сработало, значит проект имеет схожую или аналогичную функцию. Второй вариант – тест написан некорректно.
- Написание программного кода. Опираясь на то, как должно вести себя тестирование в «идеальных» условиях, разработчик пишет код того или иного модуля. Необязательно делать это с высокой точностью – на следующем этапе разработки предстоит внести корректировки в исходный код. Сейчас все, что от него требуется – это прохождение теста. Как только та или иная часть приложения написана, она прогоняется через тест-программу, а затем анализируется.
- Рефакторинг. Как только программист убедится в том, что написанный модуль успешно тестируется, соответствующий элемент должен быть проверен на наличие мусора, дублирования, неточностей. На этом этапе предстоит максимально очистить блок кода, чтобы сделать его максимально понятным, простым и прозрачным.
Основы работы с unit test изучены. Чтобы научиться тестировать таким способом приложения, а также создавать тест-программы, рекомендуется пройти дистанционные компьютерные курсы. Они рассчитаны на срок от нескольких месяцев до года и позволяют сформировать первое портфолио, а также получить документ, подтверждающий знания и навыки в выбранном направлении.
Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus!
<!DOCTYPE html>
<html dir="ltr" lang="ru-RU">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<title>Все, что нужно знать о модульном тестировании OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="Unit test – один из самых значимых этапов выпуска программного обеспечения. В данной статье предстоит выяснить, что он собой представляет, какие особенности, преимущества и недостатки имеет. Необходимо понять разницу между модульным и итерационным тестированием, рассмотреть методы и виды изучаемой операции. Дополнительно нужно ознакомиться со смежной манипуляцией – разработкой через тестирование. Предложенная информация подойдет как тестировщикам," />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/vse-chto-nuzhno-znat-o-modulnom-testirovanii/" />
<meta name="generator" content="All in One SEO (AIOSEO) 4.5.2.1" />
<script type="application/ld+json" class="aioseo-schema">
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/otus.ru\/journal\/vse-chto-nuzhno-znat-o-modulnom-testirovanii\/#article","name":"\u0412\u0441\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043e \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 OTUS","headline":"\u0412\u0441\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043e \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438","author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2024\/05\/oj-1080x720-2024-05-14T001112.521.jpg","width":2245,"height":1587},"datePublished":"2024-05-13T21:11:28+00:00","dateModified":"2024-05-13T21:11:30+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/vse-chto-nuzhno-znat-o-modulnom-testirovanii\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/vse-chto-nuzhno-znat-o-modulnom-testirovanii\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u044e\u043d\u0438\u0442-\u0442\u0435\u0441\u0442\u044b"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/vse-chto-nuzhno-znat-o-modulnom-testirovanii\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/#listItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/otus.ru\/journal\/","nextItem":"https:\/\/otus.ru\/journal\/vse-chto-nuzhno-znat-o-modulnom-testirovanii\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/vse-chto-nuzhno-znat-o-modulnom-testirovanii\/#listItem","position":2,"name":"\u0412\u0441\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043e \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438","previousItem":"https:\/\/otus.ru\/journal\/#listItem"}]},{"@type":"Organization","@id":"https:\/\/otus.ru\/journal\/#organization","name":"\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","url":"https:\/\/otus.ru\/journal\/","sameAs":["https:\/\/www.youtube.com\/channel\/UCetgtvy93o3i3CvyGXKFU3g"],"contactPoint":{"@type":"ContactPoint","telephone":"+74999389202","contactType":"Customer Support"}},{"@type":"Person","@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author","url":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/","name":"A. Pavlenko","image":{"@type":"ImageObject","@id":"https:\/\/otus.ru\/journal\/vse-chto-nuzhno-znat-o-modulnom-testirovanii\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d4c499a104d7c2522fa41f89e6819499?s=96&d=mm&r=g","width":96,"height":96,"caption":"A. Pavlenko"}},{"@type":"WebPage","@id":"https:\/\/otus.ru\/journal\/vse-chto-nuzhno-znat-o-modulnom-testirovanii\/#webpage","url":"https:\/\/otus.ru\/journal\/vse-chto-nuzhno-znat-o-modulnom-testirovanii\/","name":"\u0412\u0441\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c \u043e \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 OTUS","description":"Unit test \u2013 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0445 \u044d\u0442\u0430\u043f\u043e\u0432 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u044f\u0441\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u043e\u043d \u0441\u043e\u0431\u043e\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442, \u043a\u0430\u043a\u0438\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 \u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0438 \u0438\u043c\u0435\u0435\u0442. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0443 \u043c\u0435\u0436\u0434\u0443 \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u043c \u0438 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u0432\u0438\u0434\u044b \u0438\u0437\u0443\u0447\u0430\u0435\u043c\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u043c\u0435\u0436\u043d\u043e\u0439 \u043c\u0430\u043d\u0438\u043f\u0443\u043b\u044f\u0446\u0438\u0435\u0439 \u2013 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u043a\u0430\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430\u043c,","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/vse-chto-nuzhno-znat-o-modulnom-testirovanii\/#breadcrumblist"},"author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"creator":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2024\/05\/oj-1080x720-2024-05-14T001112.521.jpg","@id":"https:\/\/otus.ru\/journal\/vse-chto-nuzhno-znat-o-modulnom-testirovanii\/#mainImage","width":2245,"height":1587},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/vse-chto-nuzhno-znat-o-modulnom-testirovanii\/#mainImage"},"datePublished":"2024-05-13T21:11:28+00:00","dateModified":"2024-05-13T21:11:30+00:00"},{"@type":"WebSite","@id":"https:\/\/otus.ru\/journal\/#website","url":"https:\/\/otus.ru\/journal\/","name":"OTUS JOURNAL","description":"Blog about IT","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"}}]}
</script>
<!-- All in One SEO -->
<link rel='dns-prefetch' href='//otus.ru' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='stylesheet' id='wp-block-library-css' href='https://otus.ru/journal/wp-includes/css/dist/block-library/style.min.css?ver=6.4.7' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='wbcr-comments-plus-url-span-css' href='https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/css/url-span.css?ver=2.2.0' type='text/css' media='all' />
<link rel='stylesheet' id='wpel-style-css' href='https://otus.ru/journal/wp-content/plugins/wp-external-links/public/css/wpel.css?ver=2.59' type='text/css' media='all' />
<link rel='stylesheet' id='ez-toc-css' href='https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.61' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li {font-size: 95%;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='contentberg-fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700%7CPT+Serif%3A400%2C400i%2C600%7CIBM+Plex+Serif%3A500' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-core-css' href='https://otus.ru/journal/wp-content/themes/contentberg/style.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-lightbox-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/lightbox.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/fontawesome/css/font-awesome.min.css?ver=1.8.3' type='text/css' media='all' />
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/otus.ru\/journal","ignore_remote_prefetch":"1","ignore_list":["\/wp-admin\/"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/lazysizes.js" id="lazysizes-js"></script>
<link rel="https://api.w.org/" href="https://otus.ru/journal/wp-json/" /><link rel="alternate" type="application/json" href="https://otus.ru/journal/wp-json/wp/v2/posts/9913" /><link rel='shortlink' href='https://otus.ru/journal/?p=9913' />
<link rel="alternate" type="application/json+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fvse-chto-nuzhno-znat-o-modulnom-testirovanii%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fvse-chto-nuzhno-znat-o-modulnom-testirovanii%2F&format=xml" />
<script>var Sphere_Plugin = {"ajaxurl":"https:\/\/otus.ru\/journal\/wp-admin\/admin-ajax.php"};</script><link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-32x32.png" sizes="32x32" />
<link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-180x180.png" />
<meta name="msapplication-TileImage" content="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-270x270.png" />
<style type="text/css" id="wp-custom-css">
#menu-item-10406 .wpel-icon {
display: none;
}
#menu-item-10407 .wpel-icon {
display: none;
}
.otus-login-site a .wpel-icon {
display: none;
}
.menu-menju-navykov-container a .wpel-icon {
display: none;
}
.otus-login-site a
{
background: #ffd709;
border-radius: 12px;
color: #0f0f10;
font-size: 14px;
font-weight: 700;
line-height: 20px;
display: block;
text-align: center;
padding: 8px 25px;
}
.main-footer.dark {
background: linear-gradient(90deg, #a64fc5, #4f54e6);
border-color: transparent;
}
.main-footer.bold .copyright {
color: #fff;
}
.main-footer.bold .to-top i {
color: #fff;
}
.main-footer.bold .back-to-top {
color: #fff;
}
.nav__scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.scrollable-menu .menu {
display: flex;
}
.nav__scroll
{
background: linear-gradient(90deg, #a64fc5, #4f54e6);
}
.scrollable-menu .menu .menu-item {
flex: 0 0 auto;
padding: 15px 15px;
}
.scrollable-menu .menu .menu-item a {
color: #fff;
}
.nav__scroll::-webkit-scrollbar{background-color:#fff;height:5px;}
.nav__scroll::-webkit-scrollbar-thumb{background-color:#dcdcdc;}
.nav__scroll::-webkit-scrollbar-track{-webkit-border-radius:0;border-radius:0;background-color:#fff;}/
body {
min-width: 320px;
}
.banner-click img {
margin: 0 auto;
display: block;
}
.banner-click {
cursor: pointer;
}
.banner-footer-area {
margin-bottom: 20px;
}
.banner-left-area {
margin-top: 40px;
} </style>
<!--Start VDZ Yandex Metrika Plugin-->
<!-- Yandex.Metrika counter --><script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");ym(34531570, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer"});</script>
<noscript><div><img src="https://mc.yandex.ru/watch/34531570" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter --><!--START ADD EVENTS FROM CF7--><script type='text/javascript'>document.addEventListener( 'wpcf7submit', function( event ) {
//event.detail.contactFormId;
if(ym){
//console.log(event.detail);
ym(34531570, 'reachGoal', 'VDZ_SEND_CONTACT_FORM_7');
ym(34531570, 'params', {
page_url: window.location.href,
status: event.detail.status,
locale: event.detail.contactFormLocale,
form_id: event.detail.contactFormId,
});
}
}, false );
</script><!--END ADD EVENTS FROM CF7-->
<!--End VDZ Yandex Metrika Plugin-->
</head>
<body class="post-template-default single single-post postid-9913 single-format-standard right-sidebar lazy-normal has-lb">
<div class="main-wrap">
<header id="main-head" class="main-head head-nav-below has-search-modal simple simple-boxed">
<div class="inner inner-head" data-sticky-bar="0">
<div class="wrap cf wrap-head">
<div class="left-contain">
<span class="mobile-nav"><i class="fa fa-bars"></i></span>
<div class="title">
<a href="https://otus.ru/journal/" title="OTUS JOURNAL" rel="home" data-wpel-link="internal">
<span class="text-logo"><img src="/journal/wp-content/themes/contentberg/img/logo_site.svg" alt="OTUS JOURNAL"></span>
</a>
</div>
</div>
<div class="navigation-wrap inline">
<nav class="navigation inline simple light" data-sticky-bar="0">
<div class="menu-rubriki-container"><ul id="menu-rubriki" class="menu"><li id="menu-item-109" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-1 menu-item-109"><a href="https://otus.ru/journal/category/pro-it/" data-wpel-link="internal"><span>Про IT</span></a></li>
<li id="menu-item-113" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-cat-4 menu-item-113"><a href="https://otus.ru/journal/category/polza/" data-wpel-link="internal"><span>Полезное</span></a></li>
<li id="menu-item-114" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-3 menu-item-114"><a href="https://otus.ru/journal/category/lifestyle/" data-wpel-link="internal"><span>Лайфстайл</span></a></li>
<li id="menu-item-10406" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10406"><a href="https://otus.ru/catalog/courses" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Обучение</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10407" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10407"><a href="https://otus.ru/about" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Информация</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </nav>
</div>
<div class="actions">
<div class="otus-login-site">
<a href="https://otus.ru/login/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Войти<span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
<a href="#" title="Search" class="search-link"><i class="fa fa-search"></i></a>
</div>
</div>
</div>
</header> <!-- .main-head -->
<div class="nav nav_disable nav_colored nav_transparent course-categories__nav nav__scroll ">
<div class="container wrap">
<div class="links inline simple light scrollable-menu">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov" class="menu"><li id="menu-item-10413" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10414" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10415" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10416" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10417" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10419" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10420" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10421" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
</div>
</div>
<div class="main wrap">
<div class="ts-row cf">
<div class="col-8 main-content cf">
<article id="post-9913" class="the-post post-9913 post type-post status-publish format-standard has-post-thumbnail category-polza tag-programmirovanie tag-junit-testy">
<header class="post-header the-post-header cf">
<div class="post-meta the-post-meta">
<span class="post-cat">
<a href="https://otus.ru/journal/category/polza/" class="category" data-wpel-link="internal">Полезное</a>
</span>
<h1 class="post-title">
Все, что нужно знать о модульном тестировании
</h1>
<a href="https://otus.ru/journal/vse-chto-nuzhno-znat-o-modulnom-testirovanii/" class="date-link" data-wpel-link="internal"><time class="post-date">13 мая, 2024</time></a>
</div>
<div class="featured">
<a href="https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-14T001112.521.jpg" class="image-link" data-wpel-link="internal"><img width="770" height="515" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20770%20515%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-contentberg-main size-contentberg-main lazyload wp-post-image" alt="Все, что нужно знать о модульном тестировании" title="Все, что нужно знать о модульном тестировании" decoding="async" fetchpriority="high" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-14T001112.521-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-14T001112.521-270x180.jpg 270w" data-src="https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-14T001112.521-770x515.jpg" data-sizes="(max-width: 770px) 100vw, 770px" /> </a>
</div>
</header><!-- .post-header -->
<div class="post-content description cf entry-content content-normal">
<div id="ez-toc-container" class="ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title " >Содержание</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5" title="Определение">Определение</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-2" href="#%D0%97%D0%B0%D1%87%D0%B5%D0%BC_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D1%82%D1%81%D1%8F" title="Зачем используется">Зачем используется</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-3" href="#%D0%9F%D1%80%D0%B5%D0%B8%D0%BC%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%B8_%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B8" title="Преимущества и недостатки">Преимущества и недостатки</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-4" href="#%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%B8_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0" title="Модульное и интеграционное тестирование: разница">Модульное и интеграционное тестирование: разница</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-5" href="#%D0%92%D0%B8%D0%B4%D1%8B_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F" title="Виды тестирования">Виды тестирования</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-6" href="#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8" title="Методы реализации">Методы реализации</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-7" href="#%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%C2%AB%D0%B1%D0%B5%D0%BB%D0%BE%D0%B3%D0%BE_%D1%8F%D1%89%D0%B8%D0%BA%D0%B0%C2%BB" title="Реализация «белого ящика»">Реализация «белого ящика»</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-8" href="#%D0%A0%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC%D1%83_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8E" title="Рекомендации к модульному тестированию">Рекомендации к модульному тестированию</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-9" href="#%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0_%D0%BD%D0%B5_%D0%BD%D1%83%D0%B6%D0%BD%D1%8B_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8" title="Когда не нужны модульные проверки">Когда не нужны модульные проверки</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-10" href="#%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" title="Разработка через тестирование">Разработка через тестирование</a></li></ul></nav></div>
<p>Unit test – один из самых значимых этапов выпуска программного обеспечения. В данной статье предстоит выяснить, что он собой представляет, какие особенности, преимущества и недостатки имеет. Необходимо понять разницу между модульным и итерационным тестированием, рассмотреть методы и виды изучаемой операции. Дополнительно нужно ознакомиться со смежной манипуляцией – разработкой через тестирование. Предложенная информация подойдет как тестировщикам, так и обычным программистам.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5"></span>Определение<span class="ez-toc-section-end"></span></h2>
<p> Тест – это исследование того или иного проекта. Целью соответствующей операции является получение данных о качестве программы. Тесты кодов дают возможность оценивать разнообразные риски программного обеспечения, а также удостовериться в его исправности и работоспособности.</p>
<p>Юнит тестирование – тесты кодов, направленные на проверку исправности функционирования отдельных частей приложения (модулей), а также их процессов. С помощью таких тестов получается избегать ошибок, быстро обнаруживать текущие неисправности в процессе обновления того или иного проекта.</p>
<p>Юнит тесты не требуют полной проверки исходного приложения – только его определенных частей. Проводятся они обычно на этапе разработки (непосредственного написания кода).</p>
<p>Модульные тесты будут изолировать часть кода, а затем проверять его на факт работоспособности. В виде единиц измерения обычно выступают:</p>
<ul>
<li>объекты;</li>
<li>методы;</li>
<li>модули;</li>
<li>определенные функции;</li>
<li>процедуры.</li>
</ul>
<p>Рассматриваемые тесты – это первый этап тестирования. Они относятся к «белому ящику» (white box), который выполняется непосредственно программистом. Данная задача может быть поручена QA-инженерам, но такое наблюдается лишь в небольших компаниях с маленьким кадровым составом.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%97%D0%B0%D1%87%D0%B5%D0%BC_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D1%82%D1%81%D1%8F"></span>Зачем используется<span class="ez-toc-section-end"></span></h2>
<p>Модульные тесты заключаются в том, чтобы избежать накапливания ошибок в коде в будущем, а также исключить регрессию ранее отлаженных модулей.</p>
<p>Рассматриваемые операции решают следующие задачи:</p>
<ol>
<li>Поиск ошибок и их исправление на ранних этапах программирования. Это помогает значительно снизить затраты на разработку проекта в будущем.</li>
<li>Улучшение понимания разработчиками базового кода программного обеспечения.</li>
<li>Предоставление возможности простой и быстрой корректировки кода приложения в случае необходимости.</li>
<li>Повторное использование кода или его фрагментов в других продуктах (включая сами тесты).</li>
<li>Предоставление своеобразной проектной документации. В Unit test описываются особенности исходного кода. С их помощью программисты, не знакомые с проектом, смогут быстро понять принцип его функционирования.</li>
</ol>
<p>С помощью модульного тестирования удается экономить разнообразные ресурсы разработчиков и заказчика. Сюда относятся не только финансы, но и время на программирование/поддержку имеющегося программного проекта.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%80%D0%B5%D0%B8%D0%BC%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%B8_%D0%BD%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%B8"></span>Преимущества и недостатки<span class="ez-toc-section-end"></span></h2>
<p>Рассматриваемая операция имеет как сильные, так и слабые стороны. Модульные тесты пользуются огромным спросом в большинстве программных продуктов. Именно поэтому его особенности должен знать каждый тестировщик.</p>
<p>К преимуществам Юнит тестов относят:</p>
<ol>
<li>Простоту. Написание теста для отдельных модулей кода намного проще, чем проверка всего приложения целиком.</li>
<li>Высокий уровень информативности. Грамотно составленный тест помогает понять API-программы, функциональные возможности того или иного модуля, особенности его применения. Все это бывает очень полезно, если при работе над проектом произошла смена ответственных лиц за разработку и проверку продуктов.</li>
<li>Возможность реализации параллельной разработки. Рассматриваемый процесс позволяет организовать проверку работы одного элемента (фрагмента) независимо от других частей приложения. Данный прием позволяет параллельно разрабатывать разнообразные программные модули. Время на создание исходного проекта будет сокращено.</li>
<li>Возможность повторного использования. Достаточно один раз создать тест для проверки конкретного модуля, чтобы вернуться к нему позднее для повторной проверки фрагмента кода.</li>
</ol>
<p> Недостатки у Юнит тестов тоже есть. К ним можно отнести:</p>
<ol>
<li>Отсутствие гарантий обнаружения ошибок. Это связано с тем, что даже в небольших и простых приложениях проблематично предугадать все возможные сценарии реализации (выполнения).</li>
<li>Возможность выявления ошибок только в отдельных модулях, а не во всем программном обеспечении. Модульные тесты не позволяют увидеть неполадки и ошибки, возникающие при интеграции фрагментов кода друг с другом.</li>
</ol>
<p>Рассматриваемый процесс не подойдет для выявления системных ошибок во всем проекте целиком.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%B8_%D0%B8%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%BE%D0%B5_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0"></span>Модульное и интеграционное тестирование: разница<span class="ez-toc-section-end"></span></h2>
<p>Unit testing часто путают с интеграционным тестированием. Это не совсем правильно. Оба вида проверки – это тесты, но они совершенно разные в плане реализации и назначения уровня проверки исходных кодов.</p>
<p>У модульного тестирования можно выделить следующие ключевые особенности:</p>
<ol>
<li>Узкая специализация. Проверять предстоит только отдельно взятые фрагменты кода, а не все приложение сразу.</li>
<li>Простота реализации. Тестирование модулей отдельно друг от друга (особенно в процессе параллельной разработки) – это достаточно простая операция в плане реализации. Она может быть организована без привлечения дополнительных внешних ресурсов.</li>
</ol>
<p>Интеграционные тесты отличаются такими особенностями как:</p>
<ol>
<li>Общая направленность. При организации интеграционных тестов кода проверке подвергается все программное обеспечение, включая основное ядро и функциональные возможности имеющегося проекта.</li>
<li>Сложность реализации. Интеграционное тестирования осуществляется в среде, которая максимально приближена к реальной. Такая операция требует значительных ресурсов (баз данных, серверов).</li>
</ol>
<p>Модульное и интеграционное тестирование в реальной практике не противопоставляются. Они прекрасно дополняют друг друга. За счет проверки каждого отдельного модуля исходного кода можно минимизировать количество ошибок, которые обязательно всплывут при интеграции элементов приложения. Интеграционное тестирование дает возможность оценить взаимодействие фрагментов программного обеспечения друг с другом и с ядром проекта.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%92%D0%B8%D0%B4%D1%8B_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F"></span>Виды тестирования<span class="ez-toc-section-end"></span></h2>
<p>Юнит тесты бывают разными. А именно:</p>
<ol>
<li>Ручными. Они проводятся очень просто по заранее сформированной документации, включающей в себя пошаговые инструкции. Такой подход рекомендуется только для небольших и достаточно простых фрагментов кода. Ручные тесты отнимают много времени.</li>
<li>Автоматизированными. Юнит тесты заключаются в использовании специально разработанных тестовых сред. Они будут проверять работу модулей и выявлять в них ошибки. Для каждой функциональной части программного обеспечения пишется отдельный код теста. Один и тот же тест для проверки разных элементов проекта применять нельзя. Проверяемый модуль при автоматизированном тестировании требуется изолировать от ядра приложения и других его составляющих. Это поможет избежать искажения результатов проверки.</li>
</ol>
<p>Рекомендуется пользоваться обоими видами модульного тестирования для самых разных проектов. Автоматизированный подход позволяет смоделировать разнообразные сценарии поведения исходного кода. Если в процессе проверки обнаруживаются серьезные сбои и ошибки, система остановит процесс до их непосредственного устранения программистом. После этого тест запускается снова.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8"></span>Методы реализации<span class="ez-toc-section-end"></span></h2>
<p>Для организации рассматриваемого процесса используются разнообразные методы. К ним относят:</p>
<ol>
<li>Черный ящик (black box). При таком подходе тестирование организовывается по входным и выходным сигналам модуля без анализа структуры его исходного кода. Обычно «черный ящик» используется тогда, когда проверка выполняется новым или сторонним разработчиком – специалистом, который не участвовал в непосредственной разработке проекта или его компонентов.</li>
<li>Белый ящик (white box). При таком методе тестированию подвергаются внутренние структуры модулей, их возможности, особенности поведения, реакции на посылаемые (входные) сигналы и так далее. Изначально здесь изучаемый элемент является полностью прозрачным и понятным разработчику, оценивающим внутренние и внешние аспекты его работы.</li>
</ol>
<p>К одному и тому же элементу можно применять различные концепции проверки. «Черный и белый ящики» не исключают других инструментов тестирования. Обычно программисты создают для каждого проекта уникальные тесты, принимающие во внимание особенности того или иного программного продукта.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%C2%AB%D0%B1%D0%B5%D0%BB%D0%BE%D0%B3%D0%BE_%D1%8F%D1%89%D0%B8%D0%BA%D0%B0%C2%BB"></span>Реализация «белого ящика»<span class="ez-toc-section-end"></span></h3>
<p>Чтобы лучше понимать рассматриваемые тесты, подробнее будет изучен метод «белого ящика». Он включает в себя несколько этапов:</p>
<ol>
<li>Анализ отдельно взятого модуля. На этом этапе проверки программист занимается изучением внутренней структуры кода, а также функциональные возможности модуля и его поведение в процессе работы. Этот этап проходит на порядок быстрее, если разработчик сам создавал фрагмент кода или участвовал в его формировании. В противном случае придется поднимать соответствующую документацию, а также консультироваться с создателем блока кода. Только это поможет понять, как работает проверяемый компонент.</li>
<li>Формирование кейс-листа. Так называется сценарий или модуль, которые должны продемонстрировать поведение проверяемого фрагмента исходного кода в реальной обстановке. Далее создаются искусственные среды, максимально приближенные к реальной, но без привлечения внешних ресурсов (они обычно используются в работе программы): веб-серверов, информационных баз и так далее.</li>
<li>Тестирование модуля. Проверяемый элемент, предварительно изолированный от ядра программы и других фрагментов кода, запускается в тесте. Разработчику необходимо обратить внимание на то, как кодовый блок реагирует на входные сигналы, как он работает, соответствует ли его структура выполняемым задачам. Программист также анализирует возможные ошибки и неполадки.</li>
</ol>
<p>Описанный алгоритм характеризует метод «белого ящика», часто встречающийся в юнит тестах. С его помощью получится лучше и быстрее понять, за что отвечает рассматриваемый тип проверки программного обеспечения.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D0%B0%D1%86%D0%B8%D0%B8_%D0%BA_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC%D1%83_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8E"></span>Рекомендации к модульному тестированию<span class="ez-toc-section-end"></span></h2>
<p>Чтобы грамотно провести Unit тестирование, необходимо, чтобы тесты:</p>
<ol>
<li>Соответствовали определенному модулю. Один и тот же тест не может применяться для тестирования разных в плане реализации и назначения фрагментов кода.</li>
<li>Являлись автоматизированными. Ручная проверка тоже может пригодиться, но она менее эффективна и более трудоемка. Unit тесты лучше вписывать в сам код. Это поможет запускать соответствующую проверку автоматически.</li>
<li>Были современными. Если тест не может быть написан до разработки самого кода программы, его лучше создавать параллельно. Такой прием позволит сэкономить много времени в будущем.</li>
<li>Отвечали ключевым (основным) задачам. В процессе написания тестов не требуется учитывать все возможные сценарии поведения программы. Рекомендуется сосредоточиться на ключевых задачах, а остальные вносить (дополнять) по мере необходимости.</li>
<li>Обладать понятными и хорошими названиями. Имена у проверок должны описывать то, что именно проверяется, в каких условиях это делается. Рекомендуется также указывать желаемые результаты.</li>
</ol>
<p>Эти советы помогут лучше понять, как писать юнит тесты в том или ином случае. Существуют ситуации, при которых модульные проверки проводить не рекомендуется. О них тоже должен помнить каждый разработчик.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0_%D0%BD%D0%B5_%D0%BD%D1%83%D0%B6%D0%BD%D1%8B_%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8"></span>Когда не нужны модульные проверки<span class="ez-toc-section-end"></span></h2>
<p>От рассматриваемого типа проверки программного обеспечения необходимо отказаться в следующих случаях:</p>
<ol>
<li>Проводится тестирование сложных и разветвленных алгоритмов (примером может послужить красно-черное дерево). В этом случае приходится разрабатывать огромное количество тестов, что значительно усложняет и замедляет проверку.</li>
<li>Когда отсутствуют четкие результаты. Примером может послужить математическое моделирование природных процессов. Эта операция настолько сложная, что их «выход» невозможно спрогнозировать – лишь описать в виде интервалов вероятных значений.</li>
<li>При проверке кода, взаимодействующего с системой. Пример – модуль, связанный с портами, таймерами или иными «нестабильными» элементами, которые проблематично изолировать.</li>
<li>В процессе проверки всего кода приложения. Юнит тестирование не показывает интеграционные ошибки, неполадки в ядре и иные сбои, которые не относятся непосредственно к тому или иному модулю.</li>
<li>Если у разработчика недостаточно квалификации и низкая культура программирования. Это связано с тем, что «модульная проверка» работает лишь тогда, когда строго соблюдаются правила и принципы технологии. Этот процесс также сопровождается постоянным отслеживанием всех вносимых во фрагмент кода изменений.</li>
</ol>
<p>Рассматриваемая проверка кода неэффективна при работе с максимально простым кодом. Она сработает и покажет верный результат, но нет смысла тратить ресурсы (силы, время и так далее) на ее реализацию.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A0%D0%B0%D0%B7%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5"></span>Разработка через тестирование<span class="ez-toc-section-end"></span></h2>
<p>При разработке программного обеспечения обычной является ситуация, при которой программист сначала пишет код, а затем создает под него тесты и выполняет проверку. Достаточно часто используется и обратный процесс. Речь идет о ситуации, когда сначала разрабатывается тест, а затем на его основе пишется программный код.</p>
<p>Описанный процесс – это «разработка через тестирование». Его суть заключается в том, чтобы с помощью заранее написанных тестов определить требования к будущему проекту.</p>
<p>Разработку через тестирование можно разделить на несколько этапов:</p>
<ol>
<li>Формирование и добавление теста. Операция осуществляется перед внедрением каждой новой функции в исходный код приложения. Запускаться проверка не будет из-за того, что проверяемый блок (фрагмент) еще не написан. Если тестирование сработало, значит проект имеет схожую или аналогичную функцию. Второй вариант – тест написан некорректно.</li>
<li>Написание программного кода. Опираясь на то, как должно вести себя тестирование в «идеальных» условиях, разработчик пишет код того или иного модуля. Необязательно делать это с высокой точностью – на следующем этапе разработки предстоит внести корректировки в исходный код. Сейчас все, что от него требуется – это прохождение теста. Как только та или иная часть приложения написана, она прогоняется через тест-программу, а затем анализируется.</li>
<li>Рефакторинг. Как только программист убедится в том, что написанный модуль успешно тестируется, соответствующий элемент должен быть проверен на наличие мусора, дублирования, неточностей. На этом этапе предстоит максимально очистить блок кода, чтобы сделать его максимально понятным, простым и прозрачным.</li>
</ol>
<p>Основы работы с unit test изучены. Чтобы научиться тестировать таким способом приложения, а также создавать тест-программы, рекомендуется пройти дистанционные компьютерные курсы. Они рассчитаны на срок от нескольких месяцев до года и позволяют сформировать первое портфолио, а также получить документ, подтверждающий знания и навыки в выбранном направлении.</p>
<p><em>Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в <a href="https://otus.ru/?utm_source=oj" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">Otus<span class="wpel-icon wpel-image wpel-icon-6"></span></a>!</em> </p>
</div><!-- .post-content -->
<div class="the-post-foot cf">
<div class="tag-share cf">
<div class="post-tags"><a href="https://otus.ru/journal/tag/programmirovanie/" rel="tag" data-wpel-link="internal">программирование</a><a href="https://otus.ru/journal/tag/junit-testy/" rel="tag" data-wpel-link="internal">юнит-тесты</a></div>
<div class="post-share">
<div class="post-share-icons cf">
<span class="counters">
</span>
<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fotus.ru%2Fjournal%2Fvse-chto-nuzhno-znat-o-modulnom-testirovanii%2F" class="link facebook wpel-icon-right" target="_blank" title="Share on Facebook" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-facebook"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fvse-chto-nuzhno-znat-o-modulnom-testirovanii%2F&text=%D0%92%D1%81%D0%B5%2C%20%D1%87%D1%82%D0%BE%20%D0%BD%D1%83%D0%B6%D0%BD%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%82%D1%8C%20%D0%BE%20%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC%20%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8" class="link twitter wpel-icon-right" target="_blank" title="Share on Twitter" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-twitter"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fotus.ru%2Fjournal%2Fvse-chto-nuzhno-znat-o-modulnom-testirovanii%2F" class="link linkedin wpel-icon-right" target="_blank" title="LinkedIn" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-linkedin"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fotus.ru%2Fjournal%2Fvse-chto-nuzhno-znat-o-modulnom-testirovanii%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2024%2F05%2Foj-1080x720-2024-05-14T001112.521.jpg&description=%D0%92%D1%81%D0%B5%2C%20%D1%87%D1%82%D0%BE%20%D0%BD%D1%83%D0%B6%D0%BD%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%82%D1%8C%20%D0%BE%20%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC%20%D1%82%D0%B5%D1%81%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8" class="link pinterest wpel-icon-right" target="_blank" title="Pinterest" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-pinterest-p"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
</div>
</div>
</div>
<div class="post-nav">
<div class="post previous cf">
<a href="https://otus.ru/journal/technical-director-opisanie-i-osobennosti-dolzhnosti/" title="Prev Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-left"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/technical-director-opisanie-i-osobennosti-dolzhnosti/" class="image-link" rel="previous" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Technical director: описание и особенности должности" decoding="async" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-13T234434.720-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-13T234434.720-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-13T234434.720-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-13T234434.720-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-13T234434.720-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-13T234434.720-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="Technical director: описание и особенности должности" /> </a>
<div class="post-meta">
<span class="label">Prev Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/technical-director-opisanie-i-osobennosti-dolzhnosti/" data-wpel-link="internal">Technical director: описание и особенности должности</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/technical-director-opisanie-i-osobennosti-dolzhnosti/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2024-05-13T20:44:55+00:00">13 мая, 2024</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">6 Mins Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/veb-razrabotchik-opisanie-professii-sposoby-obucheniya/" title="Next Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-right"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/veb-razrabotchik-opisanie-professii-sposoby-obucheniya/" class="image-link" rel="next" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Веб-разработчик: описание профессии, способы обучения" decoding="async" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-14T002228.214-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-14T002228.214-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-14T002228.214-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-14T002228.214-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-14T002228.214-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2024/05/oj-1080x720-2024-05-14T002228.214-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="Веб-разработчик: описание профессии, способы обучения" /> </a>
<div class="post-meta">
<span class="label">Next Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/veb-razrabotchik-opisanie-professii-sposoby-obucheniya/" data-wpel-link="internal">Веб-разработчик: описание профессии, способы обучения</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/veb-razrabotchik-opisanie-professii-sposoby-obucheniya/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2024-05-13T21:22:43+00:00">13 мая, 2024</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">7 Mins Read</span>
</div>
</div> </div>
</span>
</div>
</div>
<section class="related-posts grid-3">
<h4 class="section-head"><span class="title">Читать ещё</span></h4>
<div class="ts-row posts cf">
<article class="post col-4">
<a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" title="Уровень готовности CTO к 2026" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Уровень готовности CTO к 2026" title="Уровень готовности CTO к 2026" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" class="post-link" data-wpel-link="internal">Уровень готовности CTO к 2026</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-16T19:50:59+00:00">16 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" title="Новые уроки ноября: только топ-темы по программированию" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Новые уроки ноября: только топ-темы по программированию" title="Новые уроки ноября: только топ-темы по программированию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" class="post-link" data-wpel-link="internal">Новые уроки ноября: только топ-темы по программированию</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-09T23:24:11+00:00">9 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/schjot-idjot-na-chasy/" title="Счёт идёт на часы" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Счёт идёт на часы" title="Счёт идёт на часы" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-370x245.png 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/schjot-idjot-na-chasy/" class="post-link" data-wpel-link="internal">Счёт идёт на часы</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-10-30T15:04:59+00:00">30 октября, 2025</time>
</div>
</div>
</article >
</div>
</section>
</article> <!-- .the-post -->
</div>
<aside class="col-4 sidebar">
<div class="inner">
<ul>
<li id="search-2" class="widget widget_search"><h5 class="widget-title"><span>Поиск по блогу</span></h5>
<form method="get" class="search-form" action="https://otus.ru/journal/">
<label>
<span class="screen-reader-text">Search for:</span>
<input type="search" class="search-field" placeholder="Введите запрос и нажмите Enter" value="" name="s" title="Search for:" />
</label>
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</form>
</li>
<li id="tag_cloud-5" class="widget widget_tag_cloud"><h5 class="widget-title"><span>Метки</span></h5><div class="tagcloud"><a href="https://otus.ru/journal/tag/android-2/" class="tag-cloud-link tag-link-74 tag-link-position-1" style="font-size: 12.472222222222pt;" aria-label="Android (34 элемента)" data-wpel-link="internal">Android</a>
<a href="https://otus.ru/journal/tag/c-3/" class="tag-cloud-link tag-link-91 tag-link-position-2" style="font-size: 10.916666666667pt;" aria-label="C (23 элемента)" data-wpel-link="internal">C</a>
<a href="https://otus.ru/journal/tag/c-2/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 12.666666666667pt;" aria-label="C# (35 элементов)" data-wpel-link="internal">C#</a>
<a href="https://otus.ru/journal/tag/c/" class="tag-cloud-link tag-link-20 tag-link-position-4" style="font-size: 12.472222222222pt;" aria-label="c++ (34 элемента)" data-wpel-link="internal">c++</a>
<a href="https://otus.ru/journal/tag/computer-science/" class="tag-cloud-link tag-link-209 tag-link-position-5" style="font-size: 15.972222222222pt;" aria-label="computer science (78 элементов)" data-wpel-link="internal">computer science</a>
<a href="https://otus.ru/journal/tag/css/" class="tag-cloud-link tag-link-288 tag-link-position-6" style="font-size: 8.6805555555556pt;" aria-label="CSS (13 элементов)" data-wpel-link="internal">CSS</a>
<a href="https://otus.ru/journal/tag/data-science/" class="tag-cloud-link tag-link-151 tag-link-position-7" style="font-size: 8pt;" aria-label="Data Science (11 элементов)" data-wpel-link="internal">Data Science</a>
<a href="https://otus.ru/journal/tag/devops/" class="tag-cloud-link tag-link-98 tag-link-position-8" style="font-size: 10.138888888889pt;" aria-label="devops (19 элементов)" data-wpel-link="internal">devops</a>
<a href="https://otus.ru/journal/tag/docker/" class="tag-cloud-link tag-link-143 tag-link-position-9" style="font-size: 8.2916666666667pt;" aria-label="Docker (12 элементов)" data-wpel-link="internal">Docker</a>
<a href="https://otus.ru/journal/tag/gamedev/" class="tag-cloud-link tag-link-25 tag-link-position-10" style="font-size: 11.694444444444pt;" aria-label="gamedev (28 элементов)" data-wpel-link="internal">gamedev</a>
<a href="https://otus.ru/journal/tag/hr/" class="tag-cloud-link tag-link-103 tag-link-position-11" style="font-size: 8pt;" aria-label="hr (11 элементов)" data-wpel-link="internal">hr</a>
<a href="https://otus.ru/journal/tag/html/" class="tag-cloud-link tag-link-217 tag-link-position-12" style="font-size: 11.208333333333pt;" aria-label="HTML (25 элементов)" data-wpel-link="internal">HTML</a>
<a href="https://otus.ru/journal/tag/ios/" class="tag-cloud-link tag-link-101 tag-link-position-13" style="font-size: 8.9722222222222pt;" aria-label="iOS (14 элементов)" data-wpel-link="internal">iOS</a>
<a href="https://otus.ru/journal/tag/it/" class="tag-cloud-link tag-link-50 tag-link-position-14" style="font-size: 10.527777777778pt;" aria-label="IT (21 элемент)" data-wpel-link="internal">IT</a>
<a href="https://otus.ru/journal/tag/java/" class="tag-cloud-link tag-link-75 tag-link-position-15" style="font-size: 15.680555555556pt;" aria-label="Java (73 элемента)" data-wpel-link="internal">Java</a>
<a href="https://otus.ru/journal/tag/javascript/" class="tag-cloud-link tag-link-83 tag-link-position-16" style="font-size: 14.319444444444pt;" aria-label="JavaScript (53 элемента)" data-wpel-link="internal">JavaScript</a>
<a href="https://otus.ru/journal/tag/linux/" class="tag-cloud-link tag-link-141 tag-link-position-17" style="font-size: 11.888888888889pt;" aria-label="Linux (29 элементов)" data-wpel-link="internal">Linux</a>
<a href="https://otus.ru/journal/tag/machine-learning/" class="tag-cloud-link tag-link-167 tag-link-position-18" style="font-size: 8.6805555555556pt;" aria-label="Machine Learning (13 элементов)" data-wpel-link="internal">Machine Learning</a>
<a href="https://otus.ru/journal/tag/otus-book/" class="tag-cloud-link tag-link-261 tag-link-position-19" style="font-size: 9.9444444444444pt;" aria-label="otus book (18 элементов)" data-wpel-link="internal">otus book</a>
<a href="https://otus.ru/journal/tag/php/" class="tag-cloud-link tag-link-45 tag-link-position-20" style="font-size: 10.527777777778pt;" aria-label="PHP (21 элемент)" data-wpel-link="internal">PHP</a>
<a href="https://otus.ru/journal/tag/python/" class="tag-cloud-link tag-link-27 tag-link-position-21" style="font-size: 16.944444444444pt;" aria-label="Python (99 элементов)" data-wpel-link="internal">Python</a>
<a href="https://otus.ru/journal/tag/qa/" class="tag-cloud-link tag-link-155 tag-link-position-22" style="font-size: 11.402777777778pt;" aria-label="qa (26 элементов)" data-wpel-link="internal">qa</a>
<a href="https://otus.ru/journal/tag/sql/" class="tag-cloud-link tag-link-38 tag-link-position-23" style="font-size: 12.861111111111pt;" aria-label="SQL (37 элементов)" data-wpel-link="internal">SQL</a>
<a href="https://otus.ru/journal/tag/team-lead/" class="tag-cloud-link tag-link-364 tag-link-position-24" style="font-size: 9.9444444444444pt;" aria-label="team lead (18 элементов)" data-wpel-link="internal">team lead</a>
<a href="https://otus.ru/journal/tag/unity/" class="tag-cloud-link tag-link-24 tag-link-position-25" style="font-size: 8pt;" aria-label="unity (11 элементов)" data-wpel-link="internal">unity</a>
<a href="https://otus.ru/journal/tag/algoritmy/" class="tag-cloud-link tag-link-30 tag-link-position-26" style="font-size: 9.9444444444444pt;" aria-label="Алгоритмы (18 элементов)" data-wpel-link="internal">Алгоритмы</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh/" class="tag-cloud-link tag-link-40 tag-link-position-27" style="font-size: 10.138888888889pt;" aria-label="Базы данных (19 элементов)" data-wpel-link="internal">Базы данных</a>
<a href="https://otus.ru/journal/tag/matematika/" class="tag-cloud-link tag-link-44 tag-link-position-28" style="font-size: 10.916666666667pt;" aria-label="Математика (23 элемента)" data-wpel-link="internal">Математика</a>
<a href="https://otus.ru/journal/tag/arhitektura-po/" class="tag-cloud-link tag-link-10 tag-link-position-29" style="font-size: 9.4583333333333pt;" aria-label="архитектура ПО (16 элементов)" data-wpel-link="internal">архитектура ПО</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh-2/" class="tag-cloud-link tag-link-251 tag-link-position-30" style="font-size: 10.138888888889pt;" aria-label="базы данных (19 элементов)" data-wpel-link="internal">базы данных</a>
<a href="https://otus.ru/journal/tag/vebinar/" class="tag-cloud-link tag-link-201 tag-link-position-31" style="font-size: 13.930555555556pt;" aria-label="вебинар (48 элементов)" data-wpel-link="internal">вебинар</a>
<a href="https://otus.ru/journal/tag/dajdzhest/" class="tag-cloud-link tag-link-308 tag-link-position-32" style="font-size: 10.722222222222pt;" aria-label="дайджест (22 элемента)" data-wpel-link="internal">дайджест</a>
<a href="https://otus.ru/journal/tag/zapis-vebinara/" class="tag-cloud-link tag-link-226 tag-link-position-33" style="font-size: 14.902777777778pt;" aria-label="запись вебинара (61 элемент)" data-wpel-link="internal">запись вебинара</a>
<a href="https://otus.ru/journal/tag/zapis-uroka/" class="tag-cloud-link tag-link-272 tag-link-position-34" style="font-size: 16.069444444444pt;" aria-label="запись урока (80 элементов)" data-wpel-link="internal">запись урока</a>
<a href="https://otus.ru/journal/tag/informacionnaya-bezopasnost/" class="tag-cloud-link tag-link-232 tag-link-position-35" style="font-size: 10.138888888889pt;" aria-label="информационная безопасность (19 элементов)" data-wpel-link="internal">информационная безопасность</a>
<a href="https://otus.ru/journal/tag/karera-v-it/" class="tag-cloud-link tag-link-292 tag-link-position-36" style="font-size: 9.9444444444444pt;" aria-label="карьера в IT (18 элементов)" data-wpel-link="internal">карьера в IT</a>
<a href="https://otus.ru/journal/tag/podborka/" class="tag-cloud-link tag-link-7 tag-link-position-37" style="font-size: 12.666666666667pt;" aria-label="подборка (35 элементов)" data-wpel-link="internal">подборка</a>
<a href="https://otus.ru/journal/tag/podborka-statej/" class="tag-cloud-link tag-link-219 tag-link-position-38" style="font-size: 15.777777777778pt;" aria-label="подборка статей (75 элементов)" data-wpel-link="internal">подборка статей</a>
<a href="https://otus.ru/journal/tag/programmirovanie/" class="tag-cloud-link tag-link-65 tag-link-position-39" style="font-size: 22pt;" aria-label="программирование (332 элемента)" data-wpel-link="internal">программирование</a>
<a href="https://otus.ru/journal/tag/proekt/" class="tag-cloud-link tag-link-321 tag-link-position-40" style="font-size: 11.888888888889pt;" aria-label="проект (29 элементов)" data-wpel-link="internal">проект</a>
<a href="https://otus.ru/journal/tag/proektnaya-rabota/" class="tag-cloud-link tag-link-310 tag-link-position-41" style="font-size: 11.597222222222pt;" aria-label="проектная работа (27 элементов)" data-wpel-link="internal">проектная работа</a>
<a href="https://otus.ru/journal/tag/seti/" class="tag-cloud-link tag-link-181 tag-link-position-42" style="font-size: 12.958333333333pt;" aria-label="сети (38 элементов)" data-wpel-link="internal">сети</a>
<a href="https://otus.ru/journal/tag/testirovanie/" class="tag-cloud-link tag-link-69 tag-link-position-43" style="font-size: 13.930555555556pt;" aria-label="тестирование (48 элементов)" data-wpel-link="internal">тестирование</a>
<a href="https://otus.ru/journal/tag/upravlenie-komandoj/" class="tag-cloud-link tag-link-63 tag-link-position-44" style="font-size: 11.694444444444pt;" aria-label="управление командой (28 элементов)" data-wpel-link="internal">управление командой</a>
<a href="https://otus.ru/journal/tag/habr-2/" class="tag-cloud-link tag-link-203 tag-link-position-45" style="font-size: 13.930555555556pt;" aria-label="хабр (48 элементов)" data-wpel-link="internal">хабр</a></div>
</li>
</ul>
</div>
</aside>
</div> <!-- .ts-row -->
</div> <!-- .main -->
<footer class="main-footer dark bold">
<section class="lower-footer cf">
<div class="wrap">
<div class="links">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
<p class="copyright"> © 2015-2026 OTUS </p>
<div class="to-top">
<a href="#" class="back-to-top"><i class="fa fa-angle-up"></i> Top</a>
</div>
</div>
</section>
</footer>
</div> <!-- .main-wrap -->
<div class="mobile-menu-container off-canvas" id="mobile-menu">
<a href="#" class="close"><i class="fa fa-times"></i></a>
<div class="logo">
</div>
<ul class="mobile-menu"></ul>
</div>
<div class="search-modal-wrap">
<div class="search-modal-box" role="dialog" aria-modal="true">
<form method="get" class="search-form" action="https://otus.ru/journal/">
<input type="search" class="search-field" name="s" placeholder="Search..." value="" required />
<button type="submit" class="search-submit visuallyhidden">Submit</button>
<p class="message">
Type above and press <em>Enter</em> to search. Press <em>Esc</em> to cancel. </p>
</form>
</div>
</div>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/js/url-span.js" id="wbcr-comments-plus-url-span-js"></script>
<script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js" id="ez-toc-js-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/custom-script.js" id="custom-script-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/magnific-popup.js" id="magnific-popup-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.fitvids.js" id="jquery-fitvids-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/imagesloaded.min.js" id="imagesloaded-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/object-fit-images.js" id="object-fit-images-js"></script>
<script type="text/javascript" id="contentberg-theme-js-extra">
/* <![CDATA[ */
var Bunyad = {"custom_ajax_url":"\/journal\/vse-chto-nuzhno-znat-o-modulnom-testirovanii\/"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theme.js" id="contentberg-theme-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theia-sticky-sidebar.js" id="theia-sticky-sidebar-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.slick.js" id="jquery-slick-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jarallax.js" id="jarallax-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/masonry.min.js" id="masonry-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.masonry.min.js" id="jquery-masonry-js"></script>
</body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Tue, 10 Mar 2026 15:40:49 GMT -->