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

В тестах Мы доверяем

Нежное введение о тестированном развитии с Python!. Помечено Python, TDD, тестирование.

Итак, вы хотите сделать некоторые тесты, верно?

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

Как новичок, я не знал, что думать. Несколько лет спустя, несмотря на то, что всегда чувствую себя новичком, я хотел бы дать вам нежное введение TDD с Python и как делать тесты подразделения и как безопасно рефакторировать.

Установка тестов и TDD?

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

Устройства тесты – это несколько кусков кода для осуществления ввода, вывода и поведение вашего кода. Вы можете написать им в любое время, когда вы хотите.

Но Тестовое развитие Это стратегия думать (и писать!) Испытания первые Отказ

Позвольте мне объяснить это лучше – с примером (наконец-то код!).

Фрила

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

Они наняли вас, чтобы определить пол человека, основанный на его/ее имени. К счастью, есть удивительная API под названием Генденс.io Это идентифицирует возможные положители. И вы быстро разработали ваше соединение API:

requests.get('https://api.genderize.io/?name=ana')

Однако клиент требует вас писать модульные тесты, и вам интересно TDD. Вот наше путешествие начинается!

Шаги малыша

API довольно прост, и ваша работа была почти Готово. Но с TDD нам нужно сначала подумать о тестах. И быть в порядке с возможностью начала иногда трудолюбиться – и это совершенно нормально. Действительно.

Возвращаться в код и думать с Детские шаги Что такое меньший тест, который мы можем сделать против функции (метод/класс), которые вернут пол?

Время тебе подумать

Просто отключайте: у нас есть имя в качестве ввода, и нам нужно вернуть пол в качестве вывода. Итак, меньший тест: Учитывая имя, верните пол.

Вход : Ана [Имя] Вывод : женский пол]

-Хун … мы собираемся написать тест, чтобы проверить, если дано Ана должен вернуться женский ?

-Точно!

У нас нет ни одного кода!

-Мы не!

-😵

Важные аспекты об установке

Давайте напишем наш первый тест!

def test_should_return_female_when_the_name_is_from_female_gender():
    detector = GenderDetector()
    expected_gender = detector.run('Ana')

    assert expected_gender == 'female'

Есть некоторые детали, чтобы обратить внимание. Первый – это Имя теста Отказ Тесты могут рассматриваться как ваша живая документация. Нам нужно быть описательным об этом и сказать, что ожидается и то, что мы тестируем. В этом случае мы явно сказали: должен вернуть женщину, когда имя от женщины Отказ

Имя тестового файла должно соответствовать тому же названию имени модуля. Например, если наш модуль это Gender.py Наше имя теста должно быть test_gender.py Отказ Он идеально подходит для разделения папки тестов из производственного кода (реализация) и иметь что-то подобное:

mymodule/
-- module.py
-- another_folder/
---- another_module.py
tests/
-- test_module.py
-- another_folder/
---- test_another_module.py

Другое дело, чтобы заботиться о том, это структура. Широко используемая конвенция – AAA: Организовать, действовать и утверждать Отказ

  • Организовать : Вам необходимо организовать данные, необходимые для выполнения этого куска кода (вход);
  • Акт : Здесь вы будете выполнять тестирование кода (осуществлять поведение);
  • Утверждать : После выполнения кода вы проверите, является ли результатом (вывод) таким же, как вы ожидаете.

Теперь вы можете выполнить тесты. Я предлагаю библиотеку pteest сделать это. Но вы можете выбрать все, что вам нравится.

Ура! У нас есть первый тест. Это красиво, но это терпит неудачу. И это потрясающе!

Цикл

На этот раз я надеюсь, что вы не отказались от этого текста, потому что это пример важной вещью о TDD: цикл.

Цикл производится на три шага:

  • 🆘 Напишите тест подразделения и сделайте его потерпеть неудачу (ему нужно потерпеть неудачу, потому что функция не там, верна? Если этот тест проходит, назовите призрак, правда)
  • ✅ Напишите функцию и сделайте тестовый пропуск! (Вы можете танцевать после этого)
  • Refactor код – Первая версия не должна быть красивой (не стесняйся)

Используя детские шаги, вы можете пройти этот цикл каждый раз, когда вы добавляете или измените новую функцию в своем коде.

И говорить о функции … Давайте сделаем цикл!

Мы сделали наш тест сбой. Потрясающий! Теперь пришло время реализовать функцию. Мышление с детскими шагами, наша реализация должна следовать тому же правилу, хорошо? Итак, Что нужно, чтобы сделать этот тест Pass ? Не думайте об всей черте, а только те, о тесте.

Время тебе подумать

Нам просто нужно написать метод, который возвращает правильный ответ: женщина!

def run(self, name):
    return 'female'

Запустите тесты снова. Это зеленый!!! 🍀

ОК, хорошо, это кажется странным и, вероятно, вы думаете, что я сумасшедший. Но просто подумайте о детских шагах … Теперь нам нужно написать каждую часть на тесте.

TDD не о денежных испытаниях

Больше, чем любая проверка, нам нужно подумать о наших Программный дизайн первым Отказ

Одна из вещей, которые удивляет меня о TDD, так это то, что мы можем вырастить наш дизайн программного обеспечения сознательно и хорошо, просто строить то, что нужно для пропуска тестового прохода. Когда мы пишем тесты, мы вынуждены сначала подумать о дизайне и то, как мы можем сломать его на мелкие кусочки.

Давайте напишем еще один тест. Помимо женских имен, нам нужно также определить мужские названия.

def test_should_return_male_when_the_name_is_from_male_gender():
    detector = GenderDetector()
    expected_gender = detector.run('Pedro')

    assert expected_gender == 'male'

Но когда мы бежим, потерпят неудачу, потому что мы просто вернемся Женщина , правильно? Давайте починить это, используя наши реальный код.

import requests


def run(self, name):
    result = requests.get('https://api.genderize.io/?name={}'.format(name))
    return result['gender']

Теперь наши испытания проходят! Ура!

У нас есть другие сценарии для покрытия как пустое имя, исключения API и т. Д. Но это будет домашняя работа для вас.

Вынос

Я надеюсь, что это было весело для вас! Помнить:

  • Наибольшее преимущество в отношении TDD состоит в том, чтобы создать Первый дизайн программного обеспечения
  • Ваш код будет больше надежный : После изменения вы можете запустить свои тесты и быть в мире
  • Начало может быть тяжело – и это нормально. Вам просто надо упражняться !

Пример, используемый в этом посте, с большим количеством тестов, доступен на Этот репозиторий в Github.

Две книги, чтобы погрузиться в TDD:

Повеселись!

У нас проблема с этим кодом. Каждый раз, когда мы запускаем его, код выполняет реальные запросы на API, и это занимает много времени. Мы узнаем, как бороться с этой проблемой в следующем посте о Макеты Отказ

Оригинал: “https://dev.to/anapaulagomes/in-tests-we-trust-2nbf”