Разработка
Что такое Разработка через тестирование (Test Driven Development, TDD)
Test Driven Development- это процесс, который использует тесты для проектирования и разработки вашего приложения.
Зачем тестировать? Цель написания тестов — убедиться, что код, который вы пишете, работает должным образом, и вы ничего не сломали при добавлении новых функций или рефакторинге кода. Автоматизация является неотъемлемой частью разработки программного обеспечения, тогда почему мы должны продолжать проводить ручные тесты снова и снова, имея шанс пропустить некоторые важные сценарии тестирования? Вместо этого позвольте роботам делать скучные задания за вас.
Если вы написали комплект тестов, и он отработал, вы можете быть уверены, что все ваше приложение ведет себя так, как ожидалось.
Что такое Разработка через тестирование (Test Driven Development, TDD)
Тесты, вероятно, лучший способ добиться надежности растущей кодовой базы. Чтобы сэкономить время и добиться чистого кода, мы рекомендуем писать код с использованием Test Driven Development.
TDD — это процесс, который использует тесты для проектирования и разработки вашего приложения. Циклы разработки в нем называются Красный, Зеленый, Рефакторинг (Red, Green, Refactor).
Красный, Зеленый, Рефакторинг
Давайте рассмотрим на примере этот поток красный, зеленый и рефакторинг.
Например, представьте, что вы хотите создать функцию sort_array (), которая может сортировать массив в порядке возрастания.
Красный
Подумайте о том, что вы хотите сделать.
На этом этапе вам не нужно знать, как будет выглядеть ваш код, вы должны знать, что он будет делать. Напишите тест, который проверяет вашу функциональность, которую вы хотите реализовать, вы должны увидеть ситуацию, когда он не работает.
ВХОД: [34, 3, 12, 2] ВЫХОД: [2, 3, 12, 34]
require 'rails_helper' | |
RSpec.describe 'Sample' do | |
describe 'TDD Example' do | |
it 'should return sorted array in ascending order' do | |
input = [34, 3, 12, 2] | |
expect(sort_array(input)).to eq [2, 3, 12, 34] | |
end | |
end | |
end |
Когда вы запустите тест, вы увидите такую ошибку.
Зеленый
Подумайте, как пройти тесты.
Пришло время разрешить неудачный тест, прочитать сообщение об ошибке неудачного теста и написать код, который исправит текущую ошибку.
require 'rails_helper' | |
RSpec.describe 'Sample', type: :request do | |
describe 'TDD Example' do | |
it 'should return sorted array in ascending order' do | |
input = [34, 3, 12, 2] | |
expect(sort_array(input)).to eq [2, 3, 12, 34] | |
end | |
end | |
end | |
def sort_array(array) | |
[2, 3, 12, 34] | |
end |
После реализации функции sort_array () мы должны увидеть сообщение о прохождении теста, которое выглядит следующим образом.
Рефакторинг
Подумайте, как улучшить вашу существующую реализацию.
require 'rails_helper' | |
RSpec.describe 'Sample', type: :request do | |
describe 'TDD Example' do | |
it 'should return sorted array in ascending order' do | |
input = [34, 3, 12, 2] | |
expect(sort_array(input)).to eq [2, 3, 12, 34] | |
end | |
it 'should return sorted array in ascending order' do | |
input = [8, 21, 3, 99] | |
expect(sort_array(input)).to eq [3, 8, 21, 99] | |
end | |
end | |
end | |
def sort_array(array) | |
[2, 3, 12, 34] | |
end |
Если мы напишем еще один тестовый пример для сортировки массива, мы должны увидеть неудачное второе тестовое сообщение, которое выглядит следующим образом.
Снова Красный.
Ожидаемый результат не соответствует фактическому результату, который мы получаем…
Ожидаем: [3, 8, 21, 99] Получаем: [2, 3, 12, 34]
Это потому, что мы возвращаем первый отсортированный массив! Не заботясь о других примерах (не реализован какой-либо алгоритм сортировки). Найдите минутку, чтобы подумать, как подойти к рефакторингу функции sort_array () и написать код для сортировки массива в порядке возрастания.
require 'rails_helper' | |
RSpec.describe 'Sample' do | |
describe 'TDD Example' do | |
it 'should return sorted array in ascending order' do | |
input = [34, 3, 12, 2] | |
expect(sort_array(input)).to eq [2, 3, 12, 34] | |
end | |
it 'should return sorted array in ascending order' do | |
input = [8, 21, 3, 99] | |
expect(sort_array(input)).to eq [3, 8, 21, 99] | |
end | |
end | |
end | |
def sort_array(array) | |
n = array.length | |
swapped = true | |
while swapped do | |
swapped = false | |
(n - 1).times do |i| | |
if array[i] > array[i + 1] | |
array[i], array[i + 1] = array[i + 1], array[i] | |
swapped = true | |
end | |
end | |
end | |
array | |
end |
Теперь, если вы снова запустите rspec, вы увидите, что оба тестовых примера проходят.
По мере рефакторинга sort_array (), когда мы завершаим процесс рефакторинга и снова запустим наш набор тестов, мы должны получить следующий вывод:
На этом этапе стоит очищать свой код, уменьшая любое дублирование, которое вы могли внести. Сделайте свой код модульным и эффективным. Вы должны чувствовать себя достаточно уверенно в написанном вами тесте, чтобы вносить изменения, ничего не нарушая.
3 закона Разработки через тестирование (Test Driven Development)
Вот они:
- Вы не можете писать код, пока сначала не напишете неудачный юнит-тест.
- Вы не можете писать больше в юнит-тесте, чем достаточно для ошибки, а отказ от компиляции — это ошибка.
- Вы не можете писать больше кода, чем достаточно для прохождения теста, который в настоящее время не работает.
Трудно сказать, как они работают, просто прочитав их. Попробуйте сами, почувствуйте разницу.
Что еще почитать про Test Driven Development
- Подкаст Podlodka №11: Test Driven Development
- 40 советов, которые навсегда изменят ваше программирование
- TDD: методология разработки, которая изменила мою жизнь
- Деконструкция TDD
- Почему Test Driven Development (TDD) лучше всего подходит для надежного программирования
- Почему я люблю TDD
- TDD в Android
- Да, TDD вас замедляет
- Создание чистого приложения «Game of Life» на Flutter с использованием гексагональной архитектуры и TDD
- Почему Test Driven Development (TDD) лучше всего подходит для надежного программирования
-
Новости1 неделя назад
Видео и подкасты о мобильной разработке 2025.14
-
Видео и подкасты для разработчиков3 недели назад
Javascript для бэкенда – отличная идея: Node.js, NPM, Typescript
-
Новости3 недели назад
Видео и подкасты о мобильной разработке 2025.12
-
Разработка3 недели назад
«Давайте просто…»: системные идеи, которые звучат хорошо, но почти никогда не работают