Сейчас совсем короткий пост о BDD.
Что подрузомевает под собой эти 3 буквы)))
Всё просто, как всегда -- это техника разработки программ, буквально разработка программ по их поведению.
Другая техника -- это TDD, вот как можно описать TDD:
С чем это можно сравнить, это можно сравнить с тем, как идёшь в темноте в незнакомом
месте. Ударился -- это плохо (тесты не прошли), повторно, здесь уже не ударишься (рефакторинг).
Снова повторно проходим, так до тех пор пока не выйдем (тесты все зелёные).
BDD же -- это
- установка целей, то есть, что будем делать.
- начинаем писать
- пишем примеры к коду, к каждому методу, буквально к каждой строчке -- это и будет
поведение
- автоматизация примеров.
Другими словами, если использовать ту же аналогию тёмной комнаты.
- цель -- выйти
- начинаем идти, тут есть за что зацепиться и упасть
- падаем\не_падаем, показывая, где упадём, а где нет.
Время для примера, после стольких слов.
Что подрузомевает под собой эти 3 буквы)))
Всё просто, как всегда -- это техника разработки программ, буквально разработка программ по их поведению.
Другая техника -- это TDD, вот как можно описать TDD:
С чем это можно сравнить, это можно сравнить с тем, как идёшь в темноте в незнакомом
месте. Ударился -- это плохо (тесты не прошли), повторно, здесь уже не ударишься (рефакторинг).
Снова повторно проходим, так до тех пор пока не выйдем (тесты все зелёные).
BDD же -- это
- установка целей, то есть, что будем делать.
- начинаем писать
- пишем примеры к коду, к каждому методу, буквально к каждой строчке -- это и будет
поведение
- автоматизация примеров.
Другими словами, если использовать ту же аналогию тёмной комнаты.
- цель -- выйти
- начинаем идти, тут есть за что зацепиться и упасть
- падаем\не_падаем, показывая, где упадём, а где нет.
Время для примера, после стольких слов.
Но сначала, замечание. Сейчас я напишу класс, который в зависимости от количества переданых сторон будет показывать -- это треугольник, квадрат, или пятиугольник. Если количество переданых сторон меньше 3 или больше 5, то будет бросаться исключение. Здесь я не буду рассматривать такие зависимости, что, например в треугольнике сумма двух сторон должна быть больше третье, или что у стороны не может быть нулевой длины, или что у квадрата все стороны равны.
#example.rb #включаем в файл необходимую нам библиотеку (RSpec) require 'rspec' #сначала класс исключений: class ShapeExeption < Exception end #сам класс для фигур class Shape attr_reader :iam TRIANGLE = "Triangle" QUADRATE = "Quardate" PENTAGON = "Pentagon" def initialize(*args) @iam = case args.size when 3 TRIANGLE when 4 QUADRATE when 5 PENTAGON end raise ShapeExeption.new "What is this shape?" if @iam.nil? end end
----------------------------------------------------------------------------
Сейчас поговрим про этот класс.
Вначале я определил, что переменная @iam будем только читаться, но пеопределить её нельзя.
Затем определил констатны, для треугольника\квадрата\пятиугольника.
Потом метод инициализации, который принимает какое-то количество аргументов, это показывается *.
Потом в блоке case...end определяем, длину полученых аргументов. Ну и для каждой длины своя констатнта, которая укажет, какая фигура.
В конце метода, есть вызов исключения ShapeException, это когда @iam не получена, в принципе, это же можно было бы и включить в блок case, но я не стал.
А теперь проверим поведение всего этого кода.
describe "Shape" do it "should be Triangle with three arguments" do shape = Shape.new(1, 2, 3) shape.should be_an_instance_of(Shape) shape.iam.should eq(Shape::TRIANGLE) end it "should be Quardate with four arguments" do shape = Shape.new(1, 2, 3, 4) shape.should be_an_instance_of(Shape) shape.iam.should eq(Shape::QUADRATE) end it "should be Pentagon with five arguments" do shape = Shape.new(1, 2, 3, 4, 5) shape.should be_an_instance_of(Shape) shape.iam.should eq(Shape::PENTAGON) end context "Exeption" do it "should raise ShapeExeption if arguments not equal [3,4,5]" do expect { Shape.new }.to raise_error(ShapeExeption) expect { Shape.new(1,2,3,4,5,6) }.to raise_error(ShapeExeption) end
it "should raise NoMethodError when write @iam" do shape = Shape.new(1, 2, 3) expect { shape.iam = "abc" }.to raise_error(NoMethodError) end end end
Первой строчкой describe Shape, показывается, что будем проверено поведие класса.
Затем идут три метода it(), в каждом проверяется, что наша переменная shape инициализирована от класса Shape, и проверяем, что возвратит метод iam.
Потом в контектсе (context) проверяем исключения.
У нас их две, когда значений передано меньше или больше, и когда пытаемся перезаписать @iam.
Это проверяется в блоках expect{}.to raise_error().
Запускаем:
rspec example.rb --color
.....
Finished in 0.00201 seconds
5 examples, 0 failures
Finished in 0.00201 seconds
5 examples, 0 failures
Вот таким несложным образом было проверяно поведение.
Да это программа немного надумана, но отражает действительную суть. Этот класс может быть использован для возврата соответвенно объектов Треугольник\Квадра\Пятиугольник\N-угольник.
Комментариев нет:
Отправить комментарий