Теперь я увлекаюсь разработкой, основанной на тестировании, но… Где-то в прошлом я думал, что это плохая идея. Теперь я не могу разработать ни одного кода без этой техники.
В этом посте я представлю несколько шагов, чтобы начать использовать TDD в вашей повседневной работе.
Совет 1: Знайте, какие инструменты вы должны использовать
Какой язык вы используете? Я работаю в основном с использованием Java, и в течение многих лет я никогда не слышал о Maven и о том, как интегрировать Maven с JUnit. Так что JUnit без Maven, Gradle или любого другого строительного инструмента – ничто! Никто в компании, с которой я работал, не использовал kwen Maven или какой-либо строительный инструмент… Это было какое-то программное обеспечение для любительского мастерства .
Когда я познакомился с Maven, после нескольких лет самостоятельного использования Gradle, я только спросил: “Хорошо. Это делает сборку, запускает тесты и делает приложение доступным для развертывания? “. Это было то, что я искал! 😀
Когда начинаете новый проект, составьте дорожную карту:
- Инструмент построения настройки: Maven или Gradle для Java
- Настройте инструмент тестирования: Почему не использовать JUnit 5
- Создайте свой первый тест с помощью assert и проверьте, работает ли он!
Совет 2: Знайте циклы TDD
Красный, Зеленый, Рефакторинг! В этом есть смысл? Нет, так что читайте об этом! Именно так вы будете развиваться, используя TDD. Напишите неудачный тест, напишите код для того, чтобы заставить тест работать, и выполните его рефакторинг.
Пока тест не сработает, не беспокойтесь о реплицируемом коде, или о неприятных запахах, или о том, хорош ли ваш код и красив ли он! Просто решите проблему. Сейчас не время для этого.
Делайте маленькие шаги. Не беспокойтесь о том, чтобы написать полную функцию перед тестированием. Протестируйте каждый шаг вашего кода. Если вы должны сохранить объект в своей базе данных, сначала сохраните его, затем протестируйте все виды входных данных для этого объекта, а затем напишите все бизнес-правила. Это пустая трата времени на написание полной функции, а затем на тестирование. Делая небольшие шаги, вы можете исправить ошибку до того, как она станет больше, и вы убедитесь, что код, который вы написали час назад, работает хорошо.
Совет 3: Проверьте свой код
Что значит пройти тест? Для команды разработчиков, с которой вы работаете, это означает предоставление отчета о покрытии не менее чем на 80%! Это правильно? Нет! Вы должны подтвердить то, что вы сделали.
User user = givenUser(); userService.createUser(user); // here I have 100% of Code Coverage Listusers = userService.list(); assertThat(users).hasSize(1) // But I do not know if it was save .allMatch(this::passwordIsEncrypted); // And if the password is correctly encrypted
Совет 4: Знайте Хорошие Тестовые Библиотеки
Mockito, AssertJ, Для проверки строк и т.д… Это поможет вам. Верь в меня! Не изобретайте библиотеку заново, используйте ее повторно. Существует много хороших библиотек для тестов.
Совет 5: Организуйте свой код для тестирования
Напишите свой производственный код, думая, кто может его протестировать.
Представьте, что у вас есть код с множеством потребителей и поставщиков услуг (Kafka, MQ, Aws , Google * и т.д.). Каждый раз, когда вы создаете нового производителя или потребителя, он должен создаваться одним и тем же фрагментом кода! Когда вы это сделаете, легко создать макет для этого класса. Если у вас есть клиентская фабрика Kafka, вам действительно нужно беспокоиться о новом KafkaProducer, просто используйте Mockito для издевательства над KafkaClientFactory и будьте счастливы
Как построить синглтон?
public class SomeSingleton { private static final instance AtomicReferenceref = new AtomicReference<>(); public static SomeSingleton get() { return instance.updateAndGet(e -> { return isNull(e) ? new SomeSingleton() : e; }); } }
Хороша ли эта реализация? Нет! Почему? Если я хочу очистить этот синглтон и воссоздать заново? Как я могу получить доступ к полю ref
? Ты не можешь! У вас есть опции, или вы оставляете поле ref
как пакет приватным
или вы создаете метод очистки как частный пакет и создаете помощник SomeSingleton в том же пакете, что и тест кода, для сброса всех значений.
Намерение состоит в том, чтобы подумать, как я могу протестировать свой код, когда вы пишете код.
Совет 6: Знайте входные и выходные данные
При создании тестов вы должны знать, какой тип ввода будет получен вашим кодом, и какой тип вывода должен быть предоставлен. Используйте известные входные данные, а не только автоматически сгенерированные. Это поможет вам убедиться его рабочая
Совет 7: Используйте реальные входные данные
Используйте реальные входные данные, а не только сгенерированные/фиктивные входные данные. Нашли производственную ошибку? Получите, какие входные данные приводят к ошибке, создайте с их помощью тест!
Совет 8: Тестирование языка
Создайте тестовый DSL для вашего кода.
User user = new User(); user.setName(randomString()); user.setPassword(randomString()); userService.create(user) ListallUsers = userService.list(); assertThat(allUsers).hasSize(1);
Сравните приведенный выше код с приведенным ниже кодом
userService.create(givenRandonUser()) assertThat(thenAllUsers()).hasSize(1);
Постройте высокий уровень Given-When-Then библиотека для вашего кода
Тестирование – это не пустая трата времени! Если вы никогда не занимались TDD, вы будете так думать, но с TDD вы лучше используете свое время.
Оригинал: “https://dev.to/vepo/a-very-simple-test-driven-development-tutorial-3309”