Skip to content

Latest commit

 

History

12 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

UnitTestingIntroHW

Домашние задания по курсу "Unit-тесты" на GeekBrains.

Урок 1. Цели и смысл тестирования

Задача

Задание 1. ** В классе Calculator создайте метод calculateDiscount, который принимает сумму покупки и процент скидки и возвращает сумму с учетом скидки. Ваша задача - проверить этот метод с использованием библиотеки AssertJ. Если метод calculateDiscount получает недопустимые аргументы, он должен выбрасывать исключение ArithmeticException. Не забудьте написать тесты для проверки этого поведения.

*Задание 2. (необязательное) * Мы хотим улучшить функциональность нашего интернет-магазина. Ваша задача - добавить два новых метода в класс Shop: Метод sortProductsByPrice(), который сортирует список продуктов по стоимости. Метод getMostExpensiveProduct(), который возвращает самый дорогой продукт. Напишите тесты, чтобы проверить, что магазин хранит верный список продуктов (правильное количество продуктов, верное содержимое корзины). Напишите тесты для проверки корректности работы метода getMostExpensiveProduct. Напишите тесты для проверки корректности работы метода sortProductsByPrice (проверьте правильность сортировки). Используйте класс Product для создания экземпляров продуктов и класс Shop для написания методов сортировки и тестов.

Решение

Домашнее задание размещено в папках "Lesson1" в каталогах /srs/main/java и /srs/test/java.

В файле Calculator.java реализован метод calculatingDiscount(double,int), тесты для которого размещены в файле CalculatorTest.java.

В файле Shop.java реализованы методы sortProductsByPrice() и getMostExpensiveProduct(), тесты для которых размещены в файле ShopTest.java.

Урок 2. Знакомство с тестовыми фреймворками

Задача

Проект Vehicle. Написать следующие тесты с использованием JUnit5:

  • Проверить, что экземпляр объекта Car также является экземпляром транспортного средства (используя оператор instanceof).

  • Проверить, что объект Car создается с 4-мя колесами.

  • Проверить, что объект Motorcycle создается с 2-мя колесами.

  • Проверить, что объект Car развивает скорость 60 в режиме тестового вождения (используя метод testDrive()).

  • Проверить, что объект Motorcycle развивает скорость 75 в режиме тестового вождения (используя метод testDrive()).

  • Проверить, что в режиме парковки (сначала testDrive, потом park, т.е. эмуляция движения транспорта) машина останавливается (speed = 0).

  • Проверить, что в режиме парковки (сначала testDrive, потом park, т.е. эмуляция движения транспорта) мотоцикл останавливается (speed = 0).

В этом проекте, вы будете работать с проектом "Vehicle", который представляет собой иерархию классов, включающую абстрактный базовый класс "Vehicle" и два его подкласса "Car" и "Motorcycle".

Базовый класс "Vehicle" содержит абстрактные методы "testDrive()" и "park()", а также поля "company", "model", "yearRelease", "numWheels" и "speed".

Класс "Car" расширяет "Vehicle" и реализует его абстрактные методы. При создании объекта "Car", число колес устанавливается в 4, а скорость в 0. В методе "testDrive()" скорость устанавливается на 60, а в методе "park()" - обратно в 0.

Класс "Motorcycle" также расширяет "Vehicle" и реализует его абстрактные методы. При создании объекта "Motorcycle", число колес устанавливается в 2, а скорость в 0. В методе "testDrive()" скорость устанавливается на 75, а в методе "park()" - обратно в 0.

Решение

Решение реализовано в папках "Lesson2" внутри каталогов /src/main/java/ и /srs/test/java.

Урок 3. Качество тестов

Задание 1.

Напишите тесты, покрывающие на 100% метод evenOddNumber, который проверяет, является ли переданное число четным или нечетным. (код приложен в презентации)

Задание 2.

Разработайте и протестируйте метод numberInInterval, который проверяет, попадает ли переданное число в интервал (25;100). (код приложен в презентации)

Задание 3. (необязательное, не выполнено)

Добавьте функцию в класс UserRepository, которая разлогинивает всех пользователей, кроме администраторов. Для этого, вам потребуется расширить класс User новым свойством, указывающим, обладает ли пользователь админскими правами. Протестируйте данную функцию.

Решение

Решение реализовано в классах SomeClass и SomeClassTest в папках "Lesson3" в каталогах /src/main/java/ и /srs/test/java.

Урок 4. Зависимости в тестах

Задание 1. Ответьте письменно на вопросы:

  1. Почему использование тестовых заглушек может быть полезным при написании модульных тестов?
  2. Какой тип тестовой заглушки следует использовать, если вам нужно проверить, что метод был вызван с определенными аргументами?
  3. Какой тип тестовой заглушки следует использовать, если вам просто нужно вернуть определенное значение или исключение в ответ на вызов метода?
  4. Какой тип тестовой заглушки вы бы использовали для имитации взаимодействия с внешним API или базой данных?

Ответы:

  1. Использование тестовых заглушек позволяет изолировать тестируемую систему от зависимостей и выявить ошибки, связанные с работой только тестируемой Unit-единицы, при этом ошибки в работе прочих единиц не приведут к ошибкам в работе тестируемой.
  2. Следует использовать mock-заглушку или spy-заглушку в зависимости от того, хотим ли мы сохранить функциональность класса. Если функциональность класса не интересует, мы ставим вместо него mock-заглушку, а если функциональность нужно сохранить, но отследить вызовы методов, мы ставим вместо него spy-заглушку. В том и другом случае мы отслеживаем вызовы методов и передаваемые аргументы, проверяемые методом verify.
  3. Следует использовать stub-заглушку.
  4. Это зависит от того, какая зависимость установлена в тестируемом классе с базой данных или внешним API: если тестируемый класс получает данные, я бы использовал stub-заглушку, чтобы взамен обращения к базе данных/внешнему API вернуть нужные значения; если тестируемый класс передает данные, я бы использовал mock-заглушку и отследил, что для базы данных/внешнего API вызываются правильные методы с правильными аргументами.

Задание 2.

У вас есть класс BookService, который использует интерфейс BookRepository для получения информации о книгах из базы данных. Ваша задача написать unit-тесты для BookService, используя Mockito для создания мок-объекта BookRepository.

Решение

Решение реализовано в классе BookServiceTest в папке /src/test/java/Lesson4/.

Урок 6. Юнит тестирование в других языках

Задание 1.

Создайте программу на Python или Java, которая принимает два списка чисел и выполняет следующие действия:

a. Рассчитывает среднее значение каждого списка.

b. Сравнивает эти средние значения и выводит соответствующее сообщение:

  • "Первый список имеет большее среднее значение", если среднее значение первого списка больше.
  • "Второй список имеет большее среднее значение", если среднее значение второго списка больше.
  • "Средние значения равны", если средние значения списков равны.

Важно:

Приложение должно быть написано в соответствии с принципами объектно-ориентированного программирования. Используйте Pytest (для Python) или JUnit (для Java) для написания тестов, которые проверяют правильность работы программы.

Тесты должны учитывать различные сценарии использования вашего приложения. Используйте pylint (для Python) или Checkstyle (для Java) для проверки качества кода. Сгенерируйте отчет о покрытии кода тестами. Ваша цель - достичь минимум 90% покрытия.

Формат и требования к сдаче: Отчет о выполнении этого задания должен включать в себя следующие элементы:

  • Код программы
  • Код тестов
  • Отчет pylint/Checkstyle
  • Отчет о покрытии тестами
  • Объяснение того, какие сценарии покрыты тестами и почему вы выбрали именно эти сценарии.

Решение

Тестами не покрыта единственная строка в методе getBiggerListMessage(), где выбрасывается исключение ArithmeticException в случае, если метод getBiggerListIndex() возвращает значение, отличное от 0, 1 или 2, что не предусмотрено его реализацией. В случае, если метод будет изменен, такое исключение позволит выявить ошибку расчета.

Для покрытия этой строки тестами необходимо сделать Spy-заглушку, но Spy-заглушки имеют ограничения: они не могут работать с final-классами, к которым относятся записи (records), а именно с помощью записи реализован основной функционал программы.

Передача невалидных данных (пустые списки или null-значения) в конструктор записи ListComparator вызывает исключения, для каждого из которого написан тест.

В случае, если инициализация объекта прошла без вызова исключений, ошибка может возникнуть только в случае порчи данных (например, внешний объект удаляет все элементы из исходного списка (или списков)), для чего выполняется дополнительная проверка на случай пустого (или пустых) списков, для которой также предусмотрен тест.

About

Домашние задания по курсу "Unit-тесты" на GeekBrains.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages