0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>14 янв 2021</li>
2
<ul><li>14 янв 2021</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><h2>Как лучше тестировать приложения</h2>
4
</ul><h2>Как лучше тестировать приложения</h2>
5
<p>Приложений с багами слишком много. Возможно, вы тоже увеличиваете их количество. Рассказываем, как находить и исправлять больше ошибок.</p>
5
<p>Приложений с багами слишком много. Возможно, вы тоже увеличиваете их количество. Рассказываем, как находить и исправлять больше ошибок.</p>
6
<p> vlada_maestro / shutterstock</p>
6
<p> vlada_maestro / shutterstock</p>
7
<p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
7
<p>Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.</p>
8
<p>Недавно я прочитал рассылку Skillbox о простом способе стать профи, в которой<a>Андрей Коновалов</a> - наш главред - рассказывает о талантливом программисте, который придумывает хорошие решения, но никак не может сдать их с первого раза, потому что не проверяет их. Это мешает ему стать профессионалом.</p>
8
<p>Недавно я прочитал рассылку Skillbox о простом способе стать профи, в которой<a>Андрей Коновалов</a> - наш главред - рассказывает о талантливом программисте, который придумывает хорошие решения, но никак не может сдать их с первого раза, потому что не проверяет их. Это мешает ему стать профессионалом.</p>
9
<p>Я хочу дополнить эту тему несколькими советами из личного опыта о том, как разработчику тестировать свои приложения.</p>
9
<p>Я хочу дополнить эту тему несколькими советами из личного опыта о том, как разработчику тестировать свои приложения.</p>
10
<p>Критический баг может затаиться в любом фрагменте кода. Если вы думаете, что какой-то кусочек вашей программы слишком прост, чтобы в нём была ошибка, то вы ошибаетесь. Яркий пример -<a>уязвимость в программе "Блокнот" для</a><a>Windows</a>, которая позволяет получить доступ к компьютеру жертвы.</p>
10
<p>Критический баг может затаиться в любом фрагменте кода. Если вы думаете, что какой-то кусочек вашей программы слишком прост, чтобы в нём была ошибка, то вы ошибаетесь. Яркий пример -<a>уязвимость в программе "Блокнот" для</a><a>Windows</a>, которая позволяет получить доступ к компьютеру жертвы.</p>
11
<p>Даже если с безопасностью приложения всё в порядке, в нём могут затаиться мелкие ошибки или даже фатальные баги. Они либо ухудшат опыт пользователей, либо вовсе сделают ваш проект бесполезным.</p>
11
<p>Даже если с безопасностью приложения всё в порядке, в нём могут затаиться мелкие ошибки или даже фатальные баги. Они либо ухудшат опыт пользователей, либо вовсе сделают ваш проект бесполезным.</p>
12
<p>Допустим, у вас есть функция загрузки аватара, которая идеально сработала во время тестирования. Вы можете забыть о ней и так и не узнаете, что если пользователь захочет поменять фотографию, то получит ошибку: приложение не сможет загрузить новый файл, потому что вы не удалили старый.</p>
12
<p>Допустим, у вас есть функция загрузки аватара, которая идеально сработала во время тестирования. Вы можете забыть о ней и так и не узнаете, что если пользователь захочет поменять фотографию, то получит ошибку: приложение не сможет загрузить новый файл, потому что вы не удалили старый.</p>
13
<p>Чтобы избежать таких ситуаций, нужно несколько раз тестировать каждую функцию. Причём стоит использовать как разные данные, так и одинаковые, чтобы убедиться, что всё работает как часы.</p>
13
<p>Чтобы избежать таких ситуаций, нужно несколько раз тестировать каждую функцию. Причём стоит использовать как разные данные, так и одинаковые, чтобы убедиться, что всё работает как часы.</p>
14
<p>Бывает и так, что фичи работают отлично по отдельности, но ломаются, если комбинировать их. Допустим, вы написали систему комментариев, в которой можно форматировать текст: выделять его жирным или курсивом, добавлять ссылки и так далее.</p>
14
<p>Бывает и так, что фичи работают отлично по отдельности, но ломаются, если комбинировать их. Допустим, вы написали систему комментариев, в которой можно форматировать текст: выделять его жирным или курсивом, добавлять ссылки и так далее.</p>
15
<p>Логично, что, написав функцию выделения жирным, нужно проверять именно её. То же самое касается и остальных функций. Но когда система будет готова, нужно протестировать сразу всё. Иначе вы вдруг узнаете, что если добавить ссылку на курсивный текст, а потом сделать всё это жирным, то можно получить доступ к панели администратора.</p>
15
<p>Логично, что, написав функцию выделения жирным, нужно проверять именно её. То же самое касается и остальных функций. Но когда система будет готова, нужно протестировать сразу всё. Иначе вы вдруг узнаете, что если добавить ссылку на курсивный текст, а потом сделать всё это жирным, то можно получить доступ к панели администратора.</p>
16
<p>Вот только тогда будет уже поздно.</p>
16
<p>Вот только тогда будет уже поздно.</p>
17
<p>Чаще всего я наступал на такие грабли:</p>
17
<p>Чаще всего я наступал на такие грабли:</p>
18
<ul><li>фича отлично работает при тестировании;</li>
18
<ul><li>фича отлично работает при тестировании;</li>
19
<li>добавляешь что-нибудь и тестируешь обновление;</li>
19
<li>добавляешь что-нибудь и тестируешь обновление;</li>
20
<li>через некоторое время узнаёшь, что теперь не работает ничего, кроме самого обновления.</li>
20
<li>через некоторое время узнаёшь, что теперь не работает ничего, кроме самого обновления.</li>
21
</ul><p>Такое может происходить, если вы сначала реализовали возможность добавления записи в базу данных, а потом добавили новое поле в таблицу. Например, вы создали функцию публикации постов, а позже вспомнили, что забыли добавить поле с количеством просмотров.</p>
21
</ul><p>Такое может происходить, если вы сначала реализовали возможность добавления записи в базу данных, а потом добавили новое поле в таблицу. Например, вы создали функцию публикации постов, а позже вспомнили, что забыли добавить поле с количеством просмотров.</p>
22
<p>Теперь при добавлении поста будет выдаваться ошибка, потому что для нового поля не указано значение по умолчанию. Поэтому перед сдачей проекта нужно проверять все фичи, исправлять баги и проверять всё ещё раз.</p>
22
<p>Теперь при добавлении поста будет выдаваться ошибка, потому что для нового поля не указано значение по умолчанию. Поэтому перед сдачей проекта нужно проверять все фичи, исправлять баги и проверять всё ещё раз.</p>
23
<p>После того как реализуешь возможность регистрации и авторизации, всегда заходишь с одного и того же аккаунта. Из-за этой привычки я чуть не пропустил очень серьёзный баг - сломавшуюся регистрацию.</p>
23
<p>После того как реализуешь возможность регистрации и авторизации, всегда заходишь с одного и того же аккаунта. Из-за этой привычки я чуть не пропустил очень серьёзный баг - сломавшуюся регистрацию.</p>
24
<p>Поэтому во время каждого тестирования нужно проходить тот путь, который прошёл бы новый пользователь. Именно отсюда растут ноги отговорки "У меня всё работает".</p>
24
<p>Поэтому во время каждого тестирования нужно проходить тот путь, который прошёл бы новый пользователь. Именно отсюда растут ноги отговорки "У меня всё работает".</p>
25
<p>По-хорошему, с этого нужно начинать. Но давайте будем честны сами с собой: мы прекрасно знаем этот совет, но всё равно каждый раз начинаем писать код, ничего не продумав как следует.</p>
25
<p>По-хорошему, с этого нужно начинать. Но давайте будем честны сами с собой: мы прекрасно знаем этот совет, но всё равно каждый раз начинаем писать код, ничего не продумав как следует.</p>
26
<p>Именно из-за этого появляется куча несовместимого или повторяющегося кода. Особенно печально, если код повторяется, но в нём есть небольшие отличия.</p>
26
<p>Именно из-за этого появляется куча несовместимого или повторяющегося кода. Особенно печально, если код повторяется, но в нём есть небольшие отличия.</p>
27
<p>Например, вы могли написать метод<em>UploadProfileImage ()</em>, а потом вспомнить, что нужно ещё добавить метод<em>UploadMessageAttachment ()</em>. Скорее всего, отличаться в этих методах будут только запросы к базе данных, пути и допустимые форматы.</p>
27
<p>Например, вы могли написать метод<em>UploadProfileImage ()</em>, а потом вспомнить, что нужно ещё добавить метод<em>UploadMessageAttachment ()</em>. Скорее всего, отличаться в этих методах будут только запросы к базе данных, пути и допустимые форматы.</p>
28
<p>Поэтому лучше создать универсальный метод<em>UploadFile ()</em>и передавать в него путь для сохранения и файл, который прошёл все проверки. Метод может возвращать булево значение, чтобы можно было определить логику для удачной и неудачной загрузки - те же самые запросы к базе данных.</p>
28
<p>Поэтому лучше создать универсальный метод<em>UploadFile ()</em>и передавать в него путь для сохранения и файл, который прошёл все проверки. Метод может возвращать булево значение, чтобы можно было определить логику для удачной и неудачной загрузки - те же самые запросы к базе данных.</p>
29
<p>Чаще всего проблемы с приложениями возникают именно из-за плохого тестирования. Не зря говорят, что только 10% времени уходит на написание кода, а остальное - на отладку. Поэтому чем тщательнее вы будете подходить к тестированию, тем меньше ошибок будет оставаться.</p>
29
<p>Чаще всего проблемы с приложениями возникают именно из-за плохого тестирования. Не зря говорят, что только 10% времени уходит на написание кода, а остальное - на отладку. Поэтому чем тщательнее вы будете подходить к тестированию, тем меньше ошибок будет оставаться.</p>
30
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>
30
<a><b>Бесплатный курс по Python ➞</b>Мини-курс для новичков и для опытных кодеров. 4 крутых проекта в портфолио, живое общение со спикером. Кликните и узнайте, чему можно научиться на курсе. Смотреть программу</a>