Здравствуйте. Меня зовут Илья Шишков, и мы поговорим с вами о тестировании и отладке решений заданий по программированию на нашем курсе. В первом курсе, «Белый пояс по C++», мы уже обсуждали эту тему. Сейчас мы чуть больше в нее углубимся. Давайте вспомним, о чем мы говорили в курсе «Белый пояс по C++». Если ваше решение не принимается тестирующей системой, то в первую очередь нужно внимательно перечитать условия задачи, чтобы убедиться, что вы не упустили никаких деталей. Дальше нужно убедиться, что ваше решение корректно работает на примерах, которые даны в условии, и если это так, то нужно переходить к следующему этапу — это тестировать, протестировать свое решение в соответствии с планом. Как мы составляем план тестирования? Мы анализируем классы входных данных, которые могут быть в нашей конкретной задаче, и добавляем по одному тесту на каждый класс. А потом тестируем программу на всех этих тестах и убеждаемся, что она корректно работает на них на всех. Ну потому что если она хоть на каком-то работает некорректно, то мы нашли ошибку, и ее надо исправить. Сейчас давайте рассмотрим, а что же делать в ситуации, когда у вас кончились идеи для тестов для вашего решения, но оно все равно не принимается тестирующей системой. Что делать в этом случае? И в такой ситуации мы рекомендуем вам выполнить декомпозицию программы на отдельные блоки и покрыть каждый из этих блоков юнит-тестами. Подробнее мы поговорим об этом сейчас и в следующих видео. Сейчас мы в теории обсудим, какую пользу дают нам юнит-тесты, что это такое, и как их делать. Ну а в последующих видео мы на конкретном примере разберем, как этими тестами пользоваться. Итак, почему предлагаемый подход — декомпозиция и покрытие юнит-тестами — полезен? Потому что когда мы выполнили декомпозицию, то есть разбили наше решение на отдельные логические блоки, мы можем протестировать каждый из них отдельно, изолированно от всей остальной задачи. И такие тесты, тесты для каждого отдельного компонента, их проще придумать, потому что мы для нашей большой задачи уже не можем придумать какие-то тесты, а это лишь компонент нашей программы. Значит, он меньше, этот компонент меньше, он проще, и значит, для него проще придумать различные наборы входных данных. Более того, когда мы каждый компонент покроем юнит-тестами и запустим их все, то по упавшим тестам мы сможем понять, в каком именно компоненте нашей программы есть ошибка, потому что если тесты упали, то гарантированно в этом месте есть ошибка. Если же они отработали корректно, то вероятность того, что там есть ошибка, ниже, но не значит, что ее там нет, мы могли просто придумать слабые тесты. Итак, сейчас мы в общем виде поговорили о том, что такое юнит-тесты, и какая от них польза. В следующем видео мы разберем их применение на конкретной задаче из нашего курса.