Что такое Разработка тест-драйва? 👀
- Это процесс, позволяющий тестам руководить нашей разработкой.
- Напишите неудачный тест, а затем напишите производственный код, который позволит ему пройти.
Как назвать Тест? 🧠
- Мне нравится следовать формату Given_When_Then.
- Мы указываем три вещи – Условия, предопределенные для теста ( Задано ) – Действие, которое будет проверено ( Когда ) – Результат, которого мы ждем ( Тогда )
Правила TDD ⚖️
По словам дяди Боба, у ТОДДА есть три правила
Вам не разрешается:
- Напишите любой производственный код, если только он не предназначен для неудачного прохождения теста.
- Напишите больше производственного кода, чем достаточно для прохождения единственного неудачного теста.
- Напишите больше кода модульного теста, чем этого достаточно для сбоя.
- Сбои компиляции считаются сбоями.
Исповедь 🤭
- Я не следую этим правилам в 100% случаев.
- Иногда я пишу больше производственного кода, чем того, что позволяет пройти тест, иногда я пишу код без тестов.
- Я думаю, такова человеческая природа, мы не можем все время следовать правилам.
Пример кода Для калькулятора 🧮
Давайте посмотрим на требования
- Метод может принимать 0, 1 или 2 числа в виде строки и возвращать их сумму (для пустой строки он вернет 0)
👉 Прежде всего, давайте напишем код для обработки регистра пустой строки
@Test
public void givenEmptyString_Return0(){
CalculatorService calculatorService = new CalculatorService();
int result = calculatorService.getSum("");
assertEquals(0, result);
}
Когда вы напишете этот код, он выдаст вам ошибку компиляции потому что Сервис калькулятора и его getSum метода не существует. Итак, мы создаем сервис и его метод и пишем простую логику для возврата 0 в пустых строках
public class CalculatorService {
public int getSum(String s) {
if (s.isEmpty())
return 0;
else
return 1;
}
}
Обратите внимание, что 1 в операторе else является произвольным значением, используемым, чтобы избежать ошибки компилятора, так как мы должны возвращать значение из метода.
👉 Теперь давайте напишем тест для обработки строк с 1 номером
@Test
public void givenAStringWith1Number_ReturnIt_WhenCalculateSum(){
CalculatorService calculatorService = new CalculatorService();
int result = calculatorService.getSum("5");
assertEquals(5, result);
}
Когда мы впервые запустим этот тест, он завершится неудачей, так как возвращаемое значение равно 1. Так что давайте сделаем так, чтобы это сработало
public int getSum(String s) {
if (s.isEmpty())
return 0;
else if (s.length() == 1)
return Integer.parseInt(s);
else
return 1;
}
👉 Далее давайте напишем тест для обработки строк с 2 числами
@Test
public void givenAStringWith2Numbers_WhenCalculateSum_ThenReturnSum(){
CalculatorService calculatorService = new CalculatorService();
int result = calculatorService.getSum("69");
assertEquals(15, result);
}
Этот тест провалится, потому что 1 не равно 15. да! Давайте сделаем так, чтобы это сработало
public int getSum(String s) {
if (s.isEmpty())
return 0;
else if (s.length() == 1)
return Integer.parseInt(s);
else
return getSumForMultipleNumbers(s);
}
private int getSumForMultipleNumbers(String s) {
return Arrays.
stream(s.split("")).
mapToInt(Integer::parseInt).
sum();
}
Праздник 🥳
Мы только что применили TDD для программирования действительно простого калькулятора.
Дальнейшие Чтения 👨 🏫
✅ Как Выполнить Модульный Тест , Например профессионал
≈ 5 TDD Самые распространенные Ошибки
Код На GitHub 👩 💻
Оригинал: “https://dev.to/jarjanazy/how-to-tdd-for-dummies-419k”