Итак, вы хотите сделать некоторые тесты, верно?
Некоторое время назад, когда я начал свою карьеру в качестве программиста, я слышал, как другие программисты говорят о двух вещах: тесты рефакторинга и единиц. Если честно, они просто говорят о рефакторинге, чтобы объяснить, почему эта практика следует избегать (и насколько они напугали это) и о модульных тестах сказать, что они слишком дороги, чтобы начать с того, что они проводят много времени, и т. Д. Отказ Установка тестов звучит как утопический сон.
Как новичок, я не знал, что думать. Несколько лет спустя, несмотря на то, что всегда чувствую себя новичком, я хотел бы дать вам нежное введение 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”