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_fileis 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