TDD (разработка через тестирование) УДИВИТЕЛЬНЫЙ. TDD a.k.a red-green-refactor - это подход к разработке программного обеспечения, при котором вы сначала пишете свой тест (спецификацию) для своей программы. Тест должен определять все поведение, которое вы ожидаете от своего компонента, класса или программы. Запустите тест и не паникуйте. Как следует из названия, он КРАСНЫЙ, что означает много ошибок.
Теперь во второй фазе - ЗЕЛЕНОЙ фазе вы превращаете все свои красные (ошибка) в зеленые (безошибочный код). Фактически на этом этапе вы пишете поведение своей программы. ПОМНИТЕ, что вы не можете напрямую запускать свою программу, вам нужно проверить поведение вашей программы только с помощью теста. Поэтому для каждой модификации вашей программы вы запускаете свой тестовый файл. Это гарантирует, что вы выполните свои тестовые случаи.
Теперь последний шаг - РЕФАКТОР, где вы управляете своим спагетти-кодом. Это ВАЖНЫЙ этап, на котором вы получаете шанс улучшить читаемость и удобство сопровождения кодовой базы. Мотивация здесь в том, что требования к вашей программе могут измениться позже, поэтому, если вы не проведете рефакторинг, УДАЧИ, исправляя код ПОЗЖЕ. Некоторые компании также внедрили строгие правила в отношении этого.
Насколько я знаю, я обнаружил, что основные преимущества TDD:
- Вы добавляете тесты, тем самым внося непосредственный вклад в качество программного обеспечения / программ.
- Вы в некоторой степени предоставляете документацию для своей программы.
- Вы улучшаете кодовую базу.
- Вы можете легко автоматизировать процесс тестирования для более быстрой разработки.
- Ваша программа могла повлиять на другую программу, поэтому это можно будет отследить как можно быстрее.
- Вы постепенно преодолеваете ошибку PHOBIA. У вас появляется привычка читать сообщения об ошибках.
ИСПОЛЬЗОВАНИЕ TDD
Хватит разговоров о TDD, давайте реализуем это. (ПРЕДУПРЕЖДЕНИЕ О СПОЙЛЕРЕ: ниже приведены коды)
Для демонстрации я использовал язык программирования Ruby. Я буду использовать Rspec для тестирования моей программы на Ruby. Если вы новичок в Ruby или RSpec, НЕ БОЙТЕСЬ, вы найдете их очень похожими на английский язык. Для установки
Учитывайте требование
Write a class for a Jukebox with attribute songs. Embed methods to play current song, next song, shuffle song, add songs. songs = [“song1.mp3”, “song2.mp3”,”song3.mp3”] jukebox = Jukebox.new(songs) jukebox.play #=> “song1.mp3” jukebox.next #=> “song2.mp3” jukebox.previous #=> “song1.mp3” jukebox.shuffle #=> “song2.mp3” jukebox.add_song(“songs4.mp3”) #=> [“song1.mp3”, “song2.mp3”,”song3.mp3”, “song4.mp3”]
Итак, теперь давайте начнем с тестового файла, в котором описывается все поведение заданных требований. Соглашение об именовании тестового файла для файла ruby ruby_file
is ruby_file
+ _spec.rb
. Итак, я подготовил spec
file для этой программы как
#juke_box_spec.rb require 'juke_box' describe JukeBox do let(:songs) {['song1.mp3','song2.mp3','song3.mp3']} describe '.play' do subject {JukeBox.new(songs).play} it 'should return current song' do expect(subject).to eq('song1.mp3') end end describe '.next' do subject {JukeBox.new(songs).next} it 'should return next song' do expect(subject).to eq('song2.mp3') end end describe '.previous' do subject {JukeBox.new(songs).previous} it 'should return previous song' do expect(subject).to eq('song3.mp3') end end describe '.add_song' do subject {JukeBox.new(songs).add_song(new_song)} let(:new_song) {'song4.mp3'} it 'should return new songs list' do expect(subject).to match_array(songs.push(new_song)) end end describe '.shuffle' do subject {JukeBox.new(songs).shuffle} let(:previous_first_song){'song1.mp3'} it 'should not return previous songs order list' do expect(subject).not_to eq(previous_first_song) end end end
Теперь мы запускаем этот тестовый файл с помощью команды rspec juke_box_spec.rb
`. Первое сообщение об ошибке, которое мы получаем, это файл juke_box.rb not found
, поэтому давайте создадим файл с именем juke_box.rb
, запустим тест еще раз, мы получим сообщение об ошибке NoMethodError
`, поэтому укажите методы в вашей программе. Снова запустите тест, вы получите еще одну ошибку, исправьте ее и продолжайте этот процесс, пока не создадите свой программный файл, похожий на мой. А также НЕ ЗАБЫВАЙТЕ РЕФАКТОР!
#juke_box.rb class JukeBox #define constructor def initialize(songs_list) #create instance variable songs and current_song @songs=songs_list @current_song=0 end def play #Last line is returned by default in ruby function @songs[@current_song] end def next @current_song=(@current_song+1)% @songs.length play end def previous @current_song<=0 ? @[email protected] : @current_song-=1 play end def shuffle @songs.shuffle! #Optional to set current song to first song @current_song=0 play end def add_song(new_song) #Push new song to songs array @songs << new_song end end