HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Тесты, как и любой другой код, можно писать по-разному, в том числе очень плохо. Помимо каких-то общих практик и стандартов кодирования у тестов есть свои особенности, о которых надо знать. В этом уроке мы пройдёмся по некоторым из них.</p>
1 <p>Тесты, как и любой другой код, можно писать по-разному, в том числе очень плохо. Помимо каких-то общих практик и стандартов кодирования у тестов есть свои особенности, о которых надо знать. В этом уроке мы пройдёмся по некоторым из них.</p>
2 <h2>Взаимное влияние тестов</h2>
2 <h2>Взаимное влияние тестов</h2>
3 <p>Одно из ключевых правил: тесты не должны влиять друг на друга. Это значит, что любой тест выполняется так, как будто других тестов не существует в природе.</p>
3 <p>Одно из ключевых правил: тесты не должны влиять друг на друга. Это значит, что любой тест выполняется так, как будто других тестов не существует в природе.</p>
4 <p>Нарушить это правило очень просто. Один тест может создать файл, изменить переменную или записать что-то в базу. Если остальные тесты наткнутся на эти изменения, то они могут упасть там, где не должны падать, или наоборот - успешно пройти там, где не должны проходить. Кроме этого, в такой ситуации вводится неопределённость. Такие тесты могут падать эпизодически без видимых на то причин. Например, когда тест запускают изолированно, то он работает, а когда вместе с остальными - падает:</p>
4 <p>Нарушить это правило очень просто. Один тест может создать файл, изменить переменную или записать что-то в базу. Если остальные тесты наткнутся на эти изменения, то они могут упасть там, где не должны падать, или наоборот - успешно пройти там, где не должны проходить. Кроме этого, в такой ситуации вводится неопределённость. Такие тесты могут падать эпизодически без видимых на то причин. Например, когда тест запускают изолированно, то он работает, а когда вместе с остальными - падает:</p>
5 <p>Особенно часто такая ситуация возникает в тестах, активно взаимодействующих с внешней средой: базой данных или файловой системой. Тестирование побочных эффектов имеет свои хитрости и рассматривается в<a>курсе по продвинутому тестированию</a>.</p>
5 <p>Особенно часто такая ситуация возникает в тестах, активно взаимодействующих с внешней средой: базой данных или файловой системой. Тестирование побочных эффектов имеет свои хитрости и рассматривается в<a>курсе по продвинутому тестированию</a>.</p>
6 <h2>Условные конструкции в тесте</h2>
6 <h2>Условные конструкции в тесте</h2>
7 <p>Любое ветвление внутри тестов это фактически несколько тестов в рамках одного теста. От этого надо избавляться и никогда так не писать.</p>
7 <p>Любое ветвление внутри тестов это фактически несколько тестов в рамках одного теста. От этого надо избавляться и никогда так не писать.</p>
8 <h2>Тест вне тестов</h2>
8 <h2>Тест вне тестов</h2>
9 <p>Задача beforeEach - готовить данные и среду для тестирования, а задача test - вызывать код, который тестируется, и проводить проверки. Но иногда разработчики переусердствуют:</p>
9 <p>Задача beforeEach - готовить данные и среду для тестирования, а задача test - вызывать код, который тестируется, и проводить проверки. Но иногда разработчики переусердствуют:</p>
10 <p>В этом примере тестируемый код вызывается в beforeEach. Такой подход усложняет анализ тестов, так как переворачивает всё с ног на голову.</p>
10 <p>В этом примере тестируемый код вызывается в beforeEach. Такой подход усложняет анализ тестов, так как переворачивает всё с ног на голову.</p>
11 <h2>Слишком сильная детализация</h2>
11 <h2>Слишком сильная детализация</h2>
12 <p>Программисты под влиянием голосов из интернета стремятся максимально разносить код по файлам, модулям и функциям. То же самое наблюдается и в тестах. Вместо одного теста содержащего все необходимые проверки, программист создаёт 5 тестов, в каждом из которых ровно одна проверка:</p>
12 <p>Программисты под влиянием голосов из интернета стремятся максимально разносить код по файлам, модулям и функциям. То же самое наблюдается и в тестах. Вместо одного теста содержащего все необходимые проверки, программист создаёт 5 тестов, в каждом из которых ровно одна проверка:</p>
13 <p>Чаще всего, единственным результатом такого разделения будет большее количество кода и усложнение рефакторинга в будущем, когда кода станет по-настоящему много.</p>
13 <p>Чаще всего, единственным результатом такого разделения будет большее количество кода и усложнение рефакторинга в будущем, когда кода станет по-настоящему много.</p>
14 <h2>Глубокая вложенность</h2>
14 <h2>Глубокая вложенность</h2>
15 <p>Jest позволяет группировать тесты в блоки describe:</p>
15 <p>Jest позволяет группировать тесты в блоки describe:</p>
16 <p>Они помогают структурировать сложные тесты и задать для каждого блока describe свой собственный beforeEach. Хотя такая возможность бывает полезна, но очень легко начать использовать её во вред:</p>
16 <p>Они помогают структурировать сложные тесты и задать для каждого блока describe свой собственный beforeEach. Хотя такая возможность бывает полезна, но очень легко начать использовать её во вред:</p>
17 <p>Глубокая иерархия тестов очень тяжело поддаётся анализу и фиксирует структуру. Из-за этого возникают сложности при добавлении новых проверок. Становится непонятно, к чему она относится. Это проблема любых иерархий, которые рассматривают систему только с одной точки зрения.</p>
17 <p>Глубокая иерархия тестов очень тяжело поддаётся анализу и фиксирует структуру. Из-за этого возникают сложности при добавлении новых проверок. Становится непонятно, к чему она относится. Это проблема любых иерархий, которые рассматривают систему только с одной точки зрения.</p>
18 <h2>Код с тестами писать дольше, чем код без тестов</h2>
18 <h2>Код с тестами писать дольше, чем код без тестов</h2>
19 <p>Это очень интересный вопрос, по которому можно понять, насколько хорошо программист умеет писать тесты. Несмотря на то, что некоторые виды тестирования действительно сложны и требуют дополнительного времени, ежедневные тесты, которые пишутся вместе с кодом, должны приводить к ускорению разработки. И на это есть пять причин:</p>
19 <p>Это очень интересный вопрос, по которому можно понять, насколько хорошо программист умеет писать тесты. Несмотря на то, что некоторые виды тестирования действительно сложны и требуют дополнительного времени, ежедневные тесты, которые пишутся вместе с кодом, должны приводить к ускорению разработки. И на это есть пять причин:</p>
20 <ul><li>Тесты влияют на дизайн кода. Они помогают выявить неудачные решения намного раньше.</li>
20 <ul><li>Тесты влияют на дизайн кода. Они помогают выявить неудачные решения намного раньше.</li>
21 <li>Подготовка входных данных может занимать значительное время. С тестами это нужно сделать один раз.</li>
21 <li>Подготовка входных данных может занимать значительное время. С тестами это нужно сделать один раз.</li>
22 <li>Проверка результата работы кода может быть сложной и разнообразной. Тесты позволяют об этом не думать, они сами проверяют, что всё хорошо, включая пограничные случаи.</li>
22 <li>Проверка результата работы кода может быть сложной и разнообразной. Тесты позволяют об этом не думать, они сами проверяют, что всё хорошо, включая пограничные случаи.</li>
23 <li>Если в проекте тесты пишутся регулярно, то проще и быстрее делать рефакторинг, так как не придётся проверять вручную другие части кода.</li>
23 <li>Если в проекте тесты пишутся регулярно, то проще и быстрее делать рефакторинг, так как не придётся проверять вручную другие части кода.</li>
24 <li>Тесты снижают уровень стресса.</li>
24 <li>Тесты снижают уровень стресса.</li>
25 </ul>
25 </ul>