Рубрики
Без рубрики

Очень простое Руководство по разработке на основе тестирования

Несколько небольших советов для тех, кто хочет начать с TDD. С тегом testing, java, test, tdd.

Теперь я увлекаюсь разработкой, основанной на тестировании, но… Где-то в прошлом я думал, что это плохая идея. Теперь я не могу разработать ни одного кода без этой техники.

В этом посте я представлю несколько шагов, чтобы начать использовать TDD в вашей повседневной работе.

Совет 1: Знайте, какие инструменты вы должны использовать

Какой язык вы используете? Я работаю в основном с использованием Java, и в течение многих лет я никогда не слышал о Maven и о том, как интегрировать Maven с JUnit. Так что JUnit без Maven, Gradle или любого другого строительного инструмента – ничто! Никто в компании, с которой я работал, не использовал kwen Maven или какой-либо строительный инструмент… Это было какое-то программное обеспечение для любительского мастерства .

Когда я познакомился с Maven, после нескольких лет самостоятельного использования Gradle, я только спросил: “Хорошо. Это делает сборку, запускает тесты и делает приложение доступным для развертывания? “. Это было то, что я искал! 😀

Когда начинаете новый проект, составьте дорожную карту:

  1. Инструмент построения настройки: Maven или Gradle для Java
  2. Настройте инструмент тестирования: Почему не использовать JUnit 5
  3. Создайте свой первый тест с помощью assert и проверьте, работает ли он!

Совет 2: Знайте циклы TDD

Красный, Зеленый, Рефакторинг! В этом есть смысл? Нет, так что читайте об этом! Именно так вы будете развиваться, используя TDD. Напишите неудачный тест, напишите код для того, чтобы заставить тест работать, и выполните его рефакторинг.

Пока тест не сработает, не беспокойтесь о реплицируемом коде, или о неприятных запахах, или о том, хорош ли ваш код и красив ли он! Просто решите проблему. Сейчас не время для этого.

Делайте маленькие шаги. Не беспокойтесь о том, чтобы написать полную функцию перед тестированием. Протестируйте каждый шаг вашего кода. Если вы должны сохранить объект в своей базе данных, сначала сохраните его, затем протестируйте все виды входных данных для этого объекта, а затем напишите все бизнес-правила. Это пустая трата времени на написание полной функции, а затем на тестирование. Делая небольшие шаги, вы можете исправить ошибку до того, как она станет больше, и вы убедитесь, что код, который вы написали час назад, работает хорошо.

Совет 3: Проверьте свой код

Что значит пройти тест? Для команды разработчиков, с которой вы работаете, это означает предоставление отчета о покрытии не менее чем на 80%! Это правильно? Нет! Вы должны подтвердить то, что вы сделали.

User user = givenUser();
userService.createUser(user); // here I have 100% of Code Coverage

List users = 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 AtomicReference ref = 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)

List allUsers = 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”