Hashable
🟢 lvl: jun+
Продолжаем идти по базе. Любой уважающий себя джун должен знать отличия словаря от сета. А еще, что только типы данных с протоколом Hashable мы можем пихать в множество или в ключ словаря.
ℹ️ Хэширование: что и зачем
Хэширование — это процесс применения алгоритма для преобразования элемента данных в значение. Элемент данных может быть простым целым числом, строкой или сложным объектом с несколькими свойствами.
Алгоритм называется хеш-функцией или хэшером. Преобразованное значение называется хэш-значением, хэш-кодом или просто хэшем.
Хэширование должно соблюдать правила:
🟪 Хэш-значения должны быть уникальными
🟦 Хэш-значения должны быть случайными
🟥 Хэш-значения не обязательно должны быть положительными целыми числами
Хэширование широко используется в нашей жизни:
◾Работа с базой данных: поиск
Почти все веб-сайты и мобильные приложения имеют функцию поиска где-то в своих приложениях. Реализация функции поиска предполагает использование хеширования.
◾ Криптография: пароль
Чтобы защитить наш пароль нужно его захэшировать. Мало ли его перехватят
◾️Структуры данных в программировании: Словарь
Почти все современные языки программирования имеют тип данных Dictionary, хотя они могут использовать другое имя, такое как ассоциативный массив, карта, хэш-карта, хэш или объект.
Поняв общее представление о хэшировании опустимся к тому, что предоставляет Apple.
Hashable — тип, который можно хешировать в хешере для получения целочисленного хеш-значения
Подробнее можно почитать в этой статье, лучше о хэше не найдешь
🟢 lvl: jun+
Продолжаем идти по базе. Любой уважающий себя джун должен знать отличия словаря от сета. А еще, что только типы данных с протоколом Hashable мы можем пихать в множество или в ключ словаря.
ℹ️ Хэширование: что и зачем
Хэширование — это процесс применения алгоритма для преобразования элемента данных в значение. Элемент данных может быть простым целым числом, строкой или сложным объектом с несколькими свойствами.
Алгоритм называется хеш-функцией или хэшером. Преобразованное значение называется хэш-значением, хэш-кодом или просто хэшем.
Хэширование должно соблюдать правила:
🟪 Хэш-значения должны быть уникальными
🟦 Хэш-значения должны быть случайными
🟥 Хэш-значения не обязательно должны быть положительными целыми числами
Хэширование широко используется в нашей жизни:
◾Работа с базой данных: поиск
Почти все веб-сайты и мобильные приложения имеют функцию поиска где-то в своих приложениях. Реализация функции поиска предполагает использование хеширования.
◾ Криптография: пароль
Чтобы защитить наш пароль нужно его захэшировать. Мало ли его перехватят
◾️Структуры данных в программировании: Словарь
Почти все современные языки программирования имеют тип данных Dictionary, хотя они могут использовать другое имя, такое как ассоциативный массив, карта, хэш-карта, хэш или объект.
Поняв общее представление о хэшировании опустимся к тому, что предоставляет Apple.
Hashable — тип, который можно хешировать в хешере для получения целочисленного хеш-значения
Подробнее можно почитать в этой статье, лучше о хэше не найдешь
🔥10❤2
Помните я говорил про вачдоги?
Я хз зачем, но это могут спросить на скрининге в какую-нибудь кор команду. Хотя проект может быть в большой жопе и хаосе, но интервьюеры могут потешить свое чсв задав такой вопрос
В ватчдоге нет ничего сложного, но главное не пугаться и не теряться, если попросят что-то подобное сделать
вот еще одна статейка
Я хз зачем, но это могут спросить на скрининге в какую-нибудь кор команду. Хотя проект может быть в большой жопе и хаосе, но интервьюеры могут потешить свое чсв задав такой вопрос
В ватчдоге нет ничего сложного, но главное не пугаться и не теряться, если попросят что-то подобное сделать
вот еще одна статейка
Jesse Squires
Implementing a main thread watchdog on iOS
On iOS the operating system employs a watchdog that monitors for and terminates unresponsive apps. If your app is blocking the main thread for too long, the ...
🔥1
Fail Fast
Совсем недавно я познакомился на практике с концепцией Fail Fast. Она гласит, что любая разработка, пусть техническая или продуктовая, должна как-можно быстрее светить ошибку. Вырубая наглухо доступ к уже ошибочному сценарию. Такая обратная связь — самая ценная. Ведь она помогает решить проблему на раннем этапе, как болезнь на ранних симптомах, которую невозможно вылечить на поздней стадии
Например в динамических языках программирования как JS очень сложно дебажить код, находить ошибки, ведь программа продолжала работу даже с нелогичным и губительным поведением. Этим же и страдал obj-c. В таких технологиях разрабы относятся к ошибочному поведению лояльней.
С приходом свифта же чуть что-то поменялось, но несовсем...
В этой статье есть интересные мысли, как концепция быстрого поиска ошибок помогает улучшать свой продукт. Покрывая тестами и задумываясь о ее стабильности намного больше
https://paulpeelen.com/FailingSafely
Совсем недавно я познакомился на практике с концепцией Fail Fast. Она гласит, что любая разработка, пусть техническая или продуктовая, должна как-можно быстрее светить ошибку. Вырубая наглухо доступ к уже ошибочному сценарию. Такая обратная связь — самая ценная. Ведь она помогает решить проблему на раннем этапе, как болезнь на ранних симптомах, которую невозможно вылечить на поздней стадии
Например в динамических языках программирования как JS очень сложно дебажить код, находить ошибки, ведь программа продолжала работу даже с нелогичным и губительным поведением. Этим же и страдал obj-c. В таких технологиях разрабы относятся к ошибочному поведению лояльней.
С приходом свифта же чуть что-то поменялось, но несовсем...
В этой статье есть интересные мысли, как концепция быстрого поиска ошибок помогает улучшать свой продукт. Покрывая тестами и задумываясь о ее стабильности намного больше
https://paulpeelen.com/FailingSafely
Paulpeelen
Failing safely in iOS Development – Paul Peelen
Anybody who has written more than one line of code will tell you that every systems has bugs. Sometimes these bugs result in crashes and sometimes they result in unwanted behavior. This, however, is not a reason to fail fast.
👍6❤🔥1
Сейчас смотрю всякие видое с болями, трудностями джунов. Они допом помогают с бэклогом фич. Основная задача — принести ценность продуктом.
Основная проблема при поиске работы — это падающая в бесконечную пустоту самооценка. В симуляторе иосника хочется сделать также симулятор собеса. И пока непонятно, делать его максимально легким, настраивать под стрессовую ситуацию или делать с выбором сложности
А пока поделюсь прикольным видео. Тут мужик, будто за бокалом виски из нуарных депрессивных детективах, рассказывает про боли и унижения всех нас в начале пути
https://www.youtube.com/watch?v=WUpPg6JcBWc
Основная проблема при поиске работы — это падающая в бесконечную пустоту самооценка. В симуляторе иосника хочется сделать также симулятор собеса. И пока непонятно, делать его максимально легким, настраивать под стрессовую ситуацию или делать с выбором сложности
А пока поделюсь прикольным видео. Тут мужик, будто за бокалом виски из нуарных депрессивных детективах, рассказывает про боли и унижения всех нас в начале пути
https://www.youtube.com/watch?v=WUpPg6JcBWc
YouTube
Отказы на отклики, провалы на собесах и высоченная конкуренция — как это пережить — Доктор Кот
Смотреть вакансии в финтех компании Точка Банк https://tchk.me/ygomzF
МойСклад — облачный сервис для бизнеса. Основная задача компании - это помощь в развитии малого и среднего предпринимательства в РФ. Перед МоимСкладом стоят сложные задачи по расширению…
МойСклад — облачный сервис для бизнеса. Основная задача компании - это помощь в развитии малого и среднего предпринимательства в РФ. Перед МоимСкладом стоят сложные задачи по расширению…
👍3🔥3🏆1
Частый вопрос на собесах в тинек — как массив хранит ссылки? Сильно или слабо?
Правильный ответ — сильно.
А как сделать слабо? Использовать NSPointerArray
Подробнее тут
Правильный ответ — сильно.
А как сделать слабо? Использовать NSPointerArray
Подробнее тут
Marcosantadev
Swift Arrays Holding Elements With Weak References
In iOS development there are moments where you ask yourself: “To weak, or not to weak, that is the question”. Let’s see how “to weak” with the arrays.
👍14
Какой ответ выведется в консоли?
Anonymous Quiz
11%
Все крашнится
20%
"It's pronounced /dʒɪf/" -> "It's pronounced /ɡɪf/"
55%
"It's pronounced /dʒɪf/" -> "It's pronounced /dʒɪf/"
11%
"It's pronounced /ɡɪf/" -> "It's pronounced /ɡɪf/"
2%
null
👍1
Короче, пока разрывает от того, что не хватает времени на интересные посты, симулятор иосника, дрочку литкода (да да снова начал) и сторонних зависимостей.
Поэтому я использую функцию "звонок другу". Нужен друг, или друзья, которые будут кидать классные статьи, видосы или книги по разным темам: архитектуры, покраска кнопок, многопоточка и тп
Этот материал также пойдет в основу симулятора иосника
контакт тот же. Ну или в чат кидайте https://t.iss.one/+rNag9KqMoo1kNzli
Поэтому я использую функцию "звонок другу". Нужен друг, или друзья, которые будут кидать классные статьи, видосы или книги по разным темам: архитектуры, покраска кнопок, многопоточка и тп
Этот материал также пойдет в основу симулятора иосника
контакт тот же. Ну или в чат кидайте https://t.iss.one/+rNag9KqMoo1kNzli
👍1
iOS Makes Me Hate pinned «Короче, пока разрывает от того, что не хватает времени на интересные посты, симулятор иосника, дрочку литкода (да да снова начал) и сторонних зависимостей. Поэтому я использую функцию "звонок другу". Нужен друг, или друзья, которые будут кидать классные…»
Defer
🟢 lvl: mid-
defer — это ключевое слово, которое позволяет выполнить код при выходе из текущей области видимости.
Не самый редкий и не самый частый гость в разных проектах. Часто юзается, чтобы сделать потокобезопасный код, если вы блочите объект, перед его выполнением внутри функции.
Или же, когда вы заалокейтили какую-то инфу в память, но после выполнения нужно все почистить.
Копания в кишки через дизассемблер
Хорошее объяснение с разными практическими примерами
🟢 lvl: mid-
defer — это ключевое слово, которое позволяет выполнить код при выходе из текущей области видимости.
Не самый редкий и не самый частый гость в разных проектах. Часто юзается, чтобы сделать потокобезопасный код, если вы блочите объект, перед его выполнением внутри функции.
Или же, когда вы заалокейтили какую-то инфу в память, но после выполнения нужно все почистить.
Копания в кишки через дизассемблер
Хорошее объяснение с разными практическими примерами
👍6🔥1
Что произойдет?
Anonymous Quiz
22%
Произойдет креш из-за форс-анпрапа
16%
Функция вернет nil
56%
“Hello world”
6%
Проект не соберется
🤔12👍5🎉2
Вообще у меня уже пару лет стоит пунктик покопать в сторону реверс инжениринга иос. Хочется обвалиться парой книг в будущем и пописать сюда выжимки, но пока читаем статью и думаем, как сделать свой ответ Appstore
https://habr.com/ru/company/dsec/blog/676094/
https://habr.com/ru/company/dsec/blog/676094/
Хабр
Обход средств защиты в iOS-приложениях
В прошлой статье мы рассмотрели базовые уязвимости и способы их обнаружения. Но что делать, если в приложении используются дополнительные средства защиты (например, Jailbreak Detection или...
⚡5💯1
Коллизия хэш-мапы
🟠 lvl: mid+
👆 В предыдущих сериях мы узнали о Hashable и для чего он нужен. Сейчас же поговорим о коллизиях хэша.
Напомню, хэш-функция - это математический алгоритм, который отображает данные произвольного размера в битовый массив фиксированного размера. В иос за это отвечает Hasher
До этого стандарта разработчики страдали частой коллизией, особенно работая с цветами.
ℹ️ Коллизия происходит, когда разные входные данные производят одинаковый хэш, но значения не равны
Хэш-функция считается устойчивой к коллизиям до того момента, пока не будет обнаружена пара сообщений, дающая одинаковый выход. Стоит отметить, что коллизии всегда будут существовать для любой хэш-функции по той причине, что возможные входы бесконечны, а количество выходов конечно
С хорошей хэш-функцией простые поиски, вставки и удаления занимают в среднем постоянное время. Однако если хеш-функция выбрана недостаточно точно для соответствия данным, ожидаемое время таких операций может стать пропорциональным количеству элементов, хранящихся в таблице.
Детальнее можно познакомиться отличном материале SE-0206
✅ Итого: По умолчанию Swift использует универсальную хэш-функцию, которая сводит последовательность байтов к одному целому числу.
Однако мы можем улучшить её, адаптировав хэш-функцию к своему домену.
- Почитать о производительности Hasher в треде с сеньором-помидором из яблока
- Мощненькое чтиво про приемы хэширования
🟠 lvl: mid+
Напомню, хэш-функция - это математический алгоритм, который отображает данные произвольного размера в битовый массив фиксированного размера. В иос за это отвечает Hasher
До этого стандарта разработчики страдали частой коллизией, особенно работая с цветами.
ℹ️ Коллизия происходит, когда разные входные данные производят одинаковый хэш, но значения не равны
Хэш-функция считается устойчивой к коллизиям до того момента, пока не будет обнаружена пара сообщений, дающая одинаковый выход. Стоит отметить, что коллизии всегда будут существовать для любой хэш-функции по той причине, что возможные входы бесконечны, а количество выходов конечно
С хорошей хэш-функцией простые поиски, вставки и удаления занимают в среднем постоянное время. Однако если хеш-функция выбрана недостаточно точно для соответствия данным, ожидаемое время таких операций может стать пропорциональным количеству элементов, хранящихся в таблице.
Детальнее можно познакомиться отличном материале SE-0206
✅ Итого: По умолчанию Swift использует универсальную хэш-функцию, которая сводит последовательность байтов к одному целому числу.
Однако мы можем улучшить её, адаптировав хэш-функцию к своему домену.
- Почитать о производительности Hasher в треде с сеньором-помидором из яблока
- Мощненькое чтиво про приемы хэширования
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3
Чем отличается настоящий программист от кодера?
В снг (а может не только) почему-то считатается, что настоящий программист — это не только кодер, но и чел, кому можно доверить фичу.
Но что такое "доверить"? Хорошо координировать процесс разработки или быть уверенным в качестве продукта, в дедлайнах? Развиваться по менеджерской ветки или инженерной?
И то, и другое. Только вот в снг по инженерной у нас малый уровень. На мой взгляд эта проблема и приводит к быстрому упору потолка по инженерной ветки и бегством в менеджерскую.
В книге сразу дается ответ на вопрос "Кто такой настоящий программист?"
💬 Если программирование — это искусство написания кода, то разработка программного обеспечения — это искусство обеспечения того, чтобы этот код продолжал работать в будущем.
Это сразу же подчеркивает, что окружает программирование в повседневной жизни инженера-программиста. Как и в более «традиционных» инженерных областях, когда вы строите что-то на века, вы хотите планировать заранее. Именно здесь в игру вступают встречи, проектная документация, интеграционные тесты и т. д.
А вы программируете или разрабатываете?
P.S. второй раз пришел к книге. Буду иногда вбрасывать вижимки
В снг (а может не только) почему-то считатается, что настоящий программист — это не только кодер, но и чел, кому можно доверить фичу.
Но что такое "доверить"? Хорошо координировать процесс разработки или быть уверенным в качестве продукта, в дедлайнах? Развиваться по менеджерской ветки или инженерной?
И то, и другое. Только вот в снг по инженерной у нас малый уровень. На мой взгляд эта проблема и приводит к быстрому упору потолка по инженерной ветки и бегством в менеджерскую.
В книге сразу дается ответ на вопрос "Кто такой настоящий программист?"
💬 Если программирование — это искусство написания кода, то разработка программного обеспечения — это искусство обеспечения того, чтобы этот код продолжал работать в будущем.
Это сразу же подчеркивает, что окружает программирование в повседневной жизни инженера-программиста. Как и в более «традиционных» инженерных областях, когда вы строите что-то на века, вы хотите планировать заранее. Именно здесь в игру вступают встречи, проектная документация, интеграционные тесты и т. д.
А вы программируете или разрабатываете?
P.S. второй раз пришел к книге. Буду иногда вбрасывать вижимки
👍10😐4👎3
Закон Хайрама по сути это не про обесценивание интерфейса, а про то, что не стоит расчитывать только на него.
Только не стоит прикрывать нежелание написания доки, интерфейса и других вспомогательных штук — большими масштабами команды из 2,5 человека
Кстати, гуглил про закон и наткнулся на прикольный репо
https://solarrust.github.io/hacker-laws/
Только не стоит прикрывать нежелание написания доки, интерфейса и других вспомогательных штук — большими масштабами команды из 2,5 человека
Кстати, гуглил про закон и наткнулся на прикольный репо
https://solarrust.github.io/hacker-laws/
❤4👍3
Символьный брекпоинт
🟢 lvl: jun+
Символьный брекпоинт — это одна из прикольных фич, которую я сам долго не знал. Вам не нужно протыкивать самим точку остановки в коде, а достаточно написать условия и программа сама остановится при их выполнении
https://medium.com/swlh/symbolic-breakpoint-xcode-in-2-minutes-5ca86f257b51
🟢 lvl: jun+
Символьный брекпоинт — это одна из прикольных фич, которую я сам долго не знал. Вам не нужно протыкивать самим точку остановки в коде, а достаточно написать условия и программа сама остановится при их выполнении
https://medium.com/swlh/symbolic-breakpoint-xcode-in-2-minutes-5ca86f257b51
Medium
Symbolic Breakpoint Xcode in 2 Minutes
Once upon a time, while I was debugging my code, I found out an annoying warning comes up like below
❤🔥7🥱3
Рубрика "офигенные подгоны".
Смотрите че нашел, целая куча книг просто так бесплатно в гите
Спасибо бэтмену за чистый Готэм🤡
https://github.com/wuzhouhui/misc
Смотрите че нашел, целая куча книг просто так бесплатно в гите
Спасибо бэтмену за чистый Готэм
https://github.com/wuzhouhui/misc
Please open Telegram to view this post
VIEW IN TELEGRAM
❤🔥8👍2
Зачем нужны юнит-тесты?
Частое заблуждение, что на мобилке юнит-тесты не нужны. Достаточно лишь е2е и UI.
На практике же е2е покрывает только пару успешных кейсов, забывая про остальные состояния флоу или функциональности. Он не выходит за границы UI и не погружается на уровни бизнес-логики. Его выполнение дорогое и долгое. Например, часто он не смотрит подгрузилась ли модель, закэширована ли сессия, правильны ли входящие/исходящие данные. Но он идеально подходит для проверки нескольких модулей.
Обычно е2е проходят по самому простому пути:
1. Выполняю флоу
2. Смотрю, есть ли текст, кнопка, вьюха в иерархии вьюх, которые видит пользователь.
А что там под копотом никто не хочет тестировать.
Любые тесты экономят вам время, документируют код, удешевляют разработку, помогают стабильно расти продукту. Все это ощущается на долгосрочной дистанции, когда вы устали протыкивать сложнейшие кейсы в тысячный раз. И самые дешевые — это юнит
Какова же цель юнит-тестирования?❓
Его цель — обеспечение стабильного роста программного проекта. Ключевым словом здесь является «стабильный». В начале жизни проекта развивать его довольно просто. Намного сложнее поддерживать это
развитие с прошествием времени.
❓Чем же хороши юнит тесты?
Документация тест-кейсов
Когда вся команда уходит и вместо нее приходит новая, или мы возвращаемся к коду, забытому несколько тысяч лет насад, тесты отлично помогают максимально точно описать поведение. Не выкапывая из памяти или тысяч устаревших документаций
Удешевление разработки
Стандартная тема, что после нескольких месяцев, лет разработки всех кейсов уже никто не помнит, часть людей меняется, требования противоречат коду. Ручных проверок слишком много. Тест позволяет найти баги на этапе разработки. Зафиксировать поведение и гарантировать, что этот кейс был проверен.
Ускорение разработки
Ну и понятно, что ручной кейс намного медленней, чем пару сотен миников
Но различия между хорошими и плохими тестами не ограничиваются вкусами. Далее разберемся в отличиях хорошего и плохого теста.
Частое заблуждение, что на мобилке юнит-тесты не нужны. Достаточно лишь е2е и UI.
На практике же е2е покрывает только пару успешных кейсов, забывая про остальные состояния флоу или функциональности. Он не выходит за границы UI и не погружается на уровни бизнес-логики. Его выполнение дорогое и долгое. Например, часто он не смотрит подгрузилась ли модель, закэширована ли сессия, правильны ли входящие/исходящие данные. Но он идеально подходит для проверки нескольких модулей.
Обычно е2е проходят по самому простому пути:
1. Выполняю флоу
2. Смотрю, есть ли текст, кнопка, вьюха в иерархии вьюх, которые видит пользователь.
А что там под копотом никто не хочет тестировать.
Любые тесты экономят вам время, документируют код, удешевляют разработку, помогают стабильно расти продукту. Все это ощущается на долгосрочной дистанции, когда вы устали протыкивать сложнейшие кейсы в тысячный раз. И самые дешевые — это юнит
Какова же цель юнит-тестирования?
Его цель — обеспечение стабильного роста программного проекта. Ключевым словом здесь является «стабильный». В начале жизни проекта развивать его довольно просто. Намного сложнее поддерживать это
развитие с прошествием времени.
❓Чем же хороши юнит тесты?
Документация тест-кейсов
Когда вся команда уходит и вместо нее приходит новая, или мы возвращаемся к коду, забытому несколько тысяч лет насад, тесты отлично помогают максимально точно описать поведение. Не выкапывая из памяти или тысяч устаревших документаций
Удешевление разработки
Стандартная тема, что после нескольких месяцев, лет разработки всех кейсов уже никто не помнит, часть людей меняется, требования противоречат коду. Ручных проверок слишком много. Тест позволяет найти баги на этапе разработки. Зафиксировать поведение и гарантировать, что этот кейс был проверен.
Ускорение разработки
Ну и понятно, что ручной кейс намного медленней, чем пару сотен миников
Но различия между хорошими и плохими тестами не ограничиваются вкусами. Далее разберемся в отличиях хорошего и плохого теста.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Оценки качества тестов
Существует несколько проверок качества юнит тестов. Первая и самая распространенная — code coverage
⚪️Code Coverage: наиболее часто используемая метрика покрытия, также известная как test coverage. Эта метрика равна отношению количества строк кода, выполняемых по крайней мере одним тестом, к общему количеству строк в основном коде проекта.
🕹Code coverage (test coverage) = Количество выполненных строк кода / Общее количество строк кода
Покрытие в примере (см скрин 1) вычисляется легко. Общее количество строк в методе равно 5. Количество строк, выполняемых в тесте, равно 4 — тест проходит все строки кода, кроме команды return true. Таким образом, покрытие равно 4/5 = 0,8 = 80 %.
Что будет, если отрефакторить этот метод и убрать избыточную команду if? Посмотрим скрин 2
Изменился ли процент покрытия? Да, изменился. Покрытие кода увеличилось до 100 %. Но улучшилось ли качество тестов с таким рефакторингом? Конечно же, нет. Тест по-прежнему проверяет то же количество ветвлений в коде. Этот простой пример показывает, как легко подтасовать процент покрытия.
⚠️Процент покрытия служит хорошим негативным признаком, но плохим позитивным.
➡️🔀Branch coverage:
Другая метрика покрытия называется branch coverage (покрытием ветвей).
Branch coverage показывает более точные результаты, чем code coverage. Вместо того чтобы использовать количество строк кода, эта метрика смотрит на if и switch.
Branch coverage = Количество покрытых ветвей / Общее количество ветвей
Чтобы вычислить метрику branch coverage, необходимо подсчитать все возможные ветви (branches) в коде и посмотреть, сколько из них выполняются тестами. Вернемся к предыдущему примеру со строкой.
ℹ️ Метод IsStringLong содержит две ветви: одна для ситуации, в которой длина строкового аргумента превышает пять символов, и другая для строк, длина которых менее или равна 5 символам. Тест покрывает только одну из этих ветвей, поэтому метрика покрытия составляет 1/2 = 0,5 = 50 %.
Существует несколько проверок качества юнит тестов. Первая и самая распространенная — code coverage
⚪️Code Coverage: наиболее часто используемая метрика покрытия, также известная как test coverage. Эта метрика равна отношению количества строк кода, выполняемых по крайней мере одним тестом, к общему количеству строк в основном коде проекта.
🕹Code coverage (test coverage) = Количество выполненных строк кода / Общее количество строк кода
Покрытие в примере (см скрин 1) вычисляется легко. Общее количество строк в методе равно 5. Количество строк, выполняемых в тесте, равно 4 — тест проходит все строки кода, кроме команды return true. Таким образом, покрытие равно 4/5 = 0,8 = 80 %.
Что будет, если отрефакторить этот метод и убрать избыточную команду if? Посмотрим скрин 2
Изменился ли процент покрытия? Да, изменился. Покрытие кода увеличилось до 100 %. Но улучшилось ли качество тестов с таким рефакторингом? Конечно же, нет. Тест по-прежнему проверяет то же количество ветвлений в коде. Этот простой пример показывает, как легко подтасовать процент покрытия.
⚠️Процент покрытия служит хорошим негативным признаком, но плохим позитивным.
➡️🔀Branch coverage:
Другая метрика покрытия называется branch coverage (покрытием ветвей).
Branch coverage показывает более точные результаты, чем code coverage. Вместо того чтобы использовать количество строк кода, эта метрика смотрит на if и switch.
Branch coverage = Количество покрытых ветвей / Общее количество ветвей
Чтобы вычислить метрику branch coverage, необходимо подсчитать все возможные ветви (branches) в коде и посмотреть, сколько из них выполняются тестами. Вернемся к предыдущему примеру со строкой.
ℹ️ Метод IsStringLong содержит две ветви: одна для ситуации, в которой длина строкового аргумента превышает пять символов, и другая для строк, длина которых менее или равна 5 символам. Тест покрывает только одну из этих ветвей, поэтому метрика покрытия составляет 1/2 = 0,5 = 50 %.
⚡4❤1