SlideShare une entreprise Scribd logo
1  sur  51
Télécharger pour lire hors ligne
Тестирование
Alex Slynko
UkrGermanEnterprise
GmbH
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
TDD
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
TDD
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
● Что это такое?
● Test driven development
● Вначале тесты – потом код
Виды тестов
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Виды тестов
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
● Юнит-тесты
● Интеграционные
● Системные
● Интеграции систем
Юнит-тесты
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
● Одна часть метода
● К внешним сервисам нет реальных обращений
● Желательно только одна проверка в тесте
● Очень быстро работает
Тестирование без других частей
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
● Dummy – параметры, которые передаются внутрь, но
не используются в тесте. Пустые объекты
● Stub – объекты, которые отвечают на запросы с
заданным ответом
● Mock = Stub + проверка, что методы будут вызваны
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Юнит-тесты
context "bonus_data" do
context “percent” do
should "be taken from trader if absent in model" do
@bonus_data_hash = { :percent => 2, :amount => 200 }
@trader = OpenStruct.new(:cars_data => {:bonus_data =>
@bonus_data_hash, :federal_state => "Sachsen" })
@available_car = Car.make_unsaved(:trader => @trader)
assert_equal @bonus_data_hash[:percent], @available_car.
bonus_data.first[:percent]
end
end
end
Юнит-тесты
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
● Упрощает рефакторинг – видно где падает
● Самодокументация
● Минимизирует зависимости
● Упрощает интеграцию
Интеграционные
● Взаимодействие нескольких систем
● Внешние сервисы могут быть разблокированы
● Медленные
● Может быть несколько проверок
● В случае изменения старой системы могут работать
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Интеграционные
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
context "the Body overview" do
setup do
@model = Car::Model.make_with_discount({}, :bonus_data => [
base_bonus(50) ])
end
should "show disabled models without link to configure the car" do
@model.update_attribute(:enabled, false)
visit body_url( @model.brand_slug, @model.line_slug, @model.
body_slug )
assert_contain "#{@model.brand_name} #{@model.line_name} #
{@model.body_name}"
assert_contain I18n.t("show_available_models")
assert_have_no_selector "a[href='#{body_models_url( @model.
brand_slug, @model.line_slug, @model.body_slug )}']"
end
Как TDD работает?
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Как это работает на самом деле?
Продаем TDD
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Работать с TDD?
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Плюсы Минусы
● Легче создавать
● Легче рефакторить
● Документация
● Код больше не
страшно трогать
● Я не тестировщик
● Не понятно зачем
● Надо поддерживать
еще и тесты
● Слишком сложная
система
TDD
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
● Легко
● Интересно
● Сложно
● Скучно
Не совсем TDD
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
● Тесты должны идти в коммите с кодом
● Не весь код должен иметь тесты
● Не совсем помогает
Примеры
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Hotel
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Добавить флажок для гостя, что он ребенок
Autoleasing
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
● Ежедневно получаем список доступных машин от
компании. Добавить checksum и не обновлять машину,
если ее checksum такой же как был.
should "update car with changes" do
AvailableCarsImporter.import
car = Car::Available.first
car.update_attribute(:trim_level, nil)
car.update_attributes({:checksum => 'Changed checksum'})
Car::Available.expects(:save).once
AvailableCarsImporter.import
assert car.reload.trim_level
end
TDD. Примеры
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
● Нужны ли эти тесты?
● Помогли ли они нам?
● Пригодятся ли в будущем?
Пример
def calculate_leasing_data
leasing_info = self.leasing_data
options = { :vehicle_id => self.vehicle_id, :ld => leasing_info[:runtime].to_i, :jkm => leasing_info[:
mileage].to_i, :sozp => leasing_info[:downpayment_percent].to_d.round, :sfan => self.brand_name }
becos = options_data.map {|option| option[:option_code] } if options_data
options[:becos] = becos if becos.present?
output_data = LeasingDataCalculator.get_leasing_data(options)
if output_data and !(output_data == [] or output_data.try(:[], "err").present? or (records =
output_data.try(:[], "rec")).blank?) and month_rate = records.try(:[], "FL").try(:[], "mrat")
delivery_costs_leasing = records.try(:[], "LP").try(:[], "mrat") || 0.0
LeasingData.create(
:rate => month_rate.to_d, :offer_id => self.id, :downpayment_percent => leasing_info[:
downpayment_percent].to_d.round, :mileage => leasing_info[:mileage],
:downpayment_amount => leasing_info[:downpayment_amount].to_d, :runtime => leasing_info
[:runtime], :delivery_costs_leasing => delivery_costs_leasing, :additional_info => records.to_json
)
else
error_message = I18n.t("leasing_data_not_saved", :leasing_offer_id => self.id)
Airbrake.notify(:error_class => "CreateLeasingDataError", :error_message => error_message, :
parameters => options)
end
end
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Пример
if output_data and !(output_data == [] or output_data.try(:[], "err").present?
or (records = output_data.try(:[], "rec")).blank?) and month_rate = records.
try(:[], "FL").try(:[], "mrat")
delivery_costs_leasing = records.try(:[], "LP").try(:[], "mrat") || 0.0
...
else
error_message = I18n.t("leasing_data_not_saved", :leasing_offer_id
=> self.id)
Airbrake.notify(:error_class => "CreateLeasingDataError", :
error_message => error_message, :parameters => options)
end
end
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Пример
..
output_data = LeasingDataCalculator.get_leasing_data(options)
…
Class LeasingDataCalculator
def self.get_leasing_data(options)
return {} if option[:some].blank?
#И еще несколько подобных проверок
options = prepare_options(options)
WebServices.get_leasing_data(options)
end
end
Пример
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
output_data = { "rec" => { "FL" => { "mrat" => "123.45" }, "LP" => { "mrat" =>
"234.56" } } }
WebServices.stubs(:get_leasing_data).returns(output_data)
assert_difference("LeasingData.count") { @offer.calculate_leasing_data }
leasing_data = LeasingData.last
assert_equal @offer, leasing_data.offer
assert_equal 123.45, leasing_data.rate
assert_equal 20, leasing_data.downpayment_percent
assert_equal 10000, leasing_data.mileage
assert_equal 1234, leasing_data.downpayment_amount
assert_equal 12, leasing_data.runtime
assert_equal 234.56, leasing_data.delivery_costs_leasing
assert_equal output_data["rec"].to_json, leasing_data.additional_info
Пример
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
should "notify airbrake about not updated leasing data" do
WebServices.stubs(:get_leasing_data).returns({"err" => "some error"})
error_message = I18n.translate("leasing_data_not_saved", :leasing_offer_id
=> @offer.id)
Airbrake.expects(:notify).with(:error_class => "CreateLeasingDataError", :
error_message => error_message)
@offer.calculate_leasing_data
end
Пример
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
def calculate_leasing_data
output_data = LeasingDataCalculator.get_leasing_data(self)
if output_data[:error].blank?
LeasingData.create(output_data)
else
error_message = I18n.t(“create_offer_errors.
leasing_data_not_saved", :leasing_offer_id => self.id)
Airbrake.notify(:error_class => "CreateLeasingDataError", :
error_message => error_message)
end
end
Продаем дальше
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Позволить работать с TDD?
Плюсы
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Минусы
● Довольные
программисты
● Уменьшение
количества регрессий
● Проще обновлять
библиотеки
● Больше времени на
задание
● Тяжело роверить
● Отдельный тестовый
сервер
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Последний довод
Тесты позволяют писать код не приходя в сознание
Надо думать
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Приемочные тесты
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
● Требования выполнены
● Не знает ничего о внутренней структуре (черный
ящик)
● Объясняется в терминах заказчика (возможно, даже
заказчиком)
Приемочные
● Given Jira Issue with several bugs
● When all that bugs are fixed
● Then Issue is closed
Взято с Хабра ©
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Приемочные
● Given Jira Issue with 1 bug
● And I am on issue overview page
● When I fix it
● Then Issue is closed
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
BDD
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
● Что это такое?
● Behaviour driven development
● Вначале приемочные тесты – потом код
Как это работает?
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Позволить работать с BDD?
Плюсы
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Минусы
● Уменьшение количества
регрессий
● Можно проверить что
делают
● Улучшается понимание
● Еще больше
времени на задание
● Отдельный
тестовый сервер
Примеры
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Примеры
- В комнате должен быть хотя бы один
дееспособный человек
Given a kid client “John”
And an adult client “Jake”
Then I can not reserve room for “John”
But I can reserve room for “Jake”
And I can reserve room for “Jake” and “John”
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Leasing
Given car which is imported
And I changed it
When I approved it
And run import again
Then car should be still approved
When run import again with different data
Then car should be unapproved
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Как это может не работать?
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Тесты не чиняться
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Неправильные тесты
После работы метода берем результат с которым потом и
сравниваем.
order = Order.build(VAT: 19, discount: 5)
order.items << (line_item = LineItem.build(price: 100.5))
assert 134.595, order.total_amount
●
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Долгие тесты
URL: www.acceptic.com
Software programming services
and dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Сохраняет данные в базу данных, когда это не нужно
order = Order.make(VAT: 19, discount: 5)
order.items << (line_item = LineItem.make(price:
100.5))
assert 133.65, order.total_amount
Сложнотестируемый код
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Взаимодествие одного метода с большим количеством
объектов
public XlsFile GenerateReport() {
int period;
if (DateTime.Today.DayOfWeek == DayOfWeek.Sunday) {
period = 7
} else {
period = SomeServiceClient().GetPeriod();
}
…
Код написанный для тестов
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
# app/use_cases/post_comment.rb
# Called from the "create" action in a controller
class PostComment
def initialize(user, entry, attributes)
@user, @entry, @attributes = user, entry, attributes
end
def post
@comment = @user.comments.new
@comment.assign_attributes(@attributes)
@comment.entry = @entry
@comment.save!
LanguageDetector.new(@comment).set_language
SpamChecker.new(@comment).check_spam
CommentMailer.new(@comment).send_mail
post_to_twitter if @comment.share_on_twitter?
post_to_facebook if @comment.share_on_facebook?
@comment
end
private
def post_to_twitter
PostToTwitter.new(@user, @comment).post
end
def post_to_facebook
PostToFacebook.new(@user, @comment).action(:comment)
end
end
Взаимозависимые тесты
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
● Изменение конфигурации перед тестом (и не
изменение после)
● Сохранение специального конфига в базе данных
APP_CONFIG[:available_cars][:traders] = { "TRADER_ID"
=> @trader.id }
Вера во время
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Запись, которая создается позже имеет timestamp
больше
bmw = Car.make(:brand_name => ‘bmw’)
audi = Car.make(:brand_name => ‘audi’)
assert _equal [bwm, audi], Car.order(:created_at).all
Порядок
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370
Порядок не обязан сохраняться, если только он не
прописан явно
record1 = Car.make(:brand => ‘Audi’)
record2 = Car.make(:brand => ‘Audi’)
assert_equal [record1, record2], Car.by_brand(‘Audi’)
Вопросы?
URL: www.acceptic.com
Software programming services and
Dedicated developers teams
E-mail: info@acceptic.com
Tel.: +1 800 990 4370

Contenu connexe

Similaire à Tdd and BDD

Стабильны ли ваши приложения в облаках?
Стабильны ли ваши приложения в облаках?Стабильны ли ваши приложения в облаках?
Стабильны ли ваши приложения в облаках?Yandex
 
Tarifer corporate 2
Tarifer corporate 2Tarifer corporate 2
Tarifer corporate 2Tarifer LLC
 
От заказной разработки к рыбоперерабатывающему цеху
От заказной разработки к рыбоперерабатывающему цехуОт заказной разработки к рыбоперерабатывающему цеху
От заказной разработки к рыбоперерабатывающему цехуBurt and Co LLC
 
Парсим и кодогенерируем для С++ с использованием clang
Парсим и кодогенерируем для С++ с использованием clangПарсим и кодогенерируем для С++ с использованием clang
Парсим и кодогенерируем для С++ с использованием clangcorehard_by
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Ivan Tsyganov
 
ReTag - Презентация
ReTag - ПрезентацияReTag - Презентация
ReTag - ПрезентацияAlexander Bachmann
 
Изоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, HuntflowИзоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, Huntflowit-people
 
МИКОЛА БОБОШКО «Тестування вебсервісів — основи» Lviv QA Day 2019
МИКОЛА БОБОШКО «Тестування вебсервісів — основи» Lviv QA Day 2019МИКОЛА БОБОШКО «Тестування вебсервісів — основи» Lviv QA Day 2019
МИКОЛА БОБОШКО «Тестування вебсервісів — основи» Lviv QA Day 2019GoQA
 
Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.ScrumTrek
 
Микита Семенов “Вартість створення сайту і його обслуговування?”
Микита Семенов “Вартість створення сайту і його обслуговування?”Микита Семенов “Вартість створення сайту і його обслуговування?”
Микита Семенов “Вартість створення сайту і його обслуговування?”Lviv Startup Club
 
Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web AppsProvectus
 
Практические возможности работы с Google Tag Manager
Практические возможности работы с Google Tag ManagerПрактические возможности работы с Google Tag Manager
Практические возможности работы с Google Tag ManagerNetpeak
 
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIPОмские ИТ-субботники
 
Что еще можно делать в Google Tag Manager кроме установки кода google analytics.
Что еще можно делать в Google Tag Manager кроме установки кода google analytics.Что еще можно делать в Google Tag Manager кроме установки кода google analytics.
Что еще можно делать в Google Tag Manager кроме установки кода google analytics.Netpeak
 
Что необходимо для успешного старта онлайн-бизнеса
Что необходимо для успешного старта онлайн-бизнесаЧто необходимо для успешного старта онлайн-бизнеса
Что необходимо для успешного старта онлайн-бизнесаГлавное интернет-бюро
 
Презентация компании Ареон 2016
Презентация компании Ареон 2016Презентация компании Ареон 2016
Презентация компании Ареон 2016atrix3
 
Обеспечение бесперебойной работы корпоративных приложений в больших гетероген...
Обеспечение бесперебойной работы корпоративных приложений в больших гетероген...Обеспечение бесперебойной работы корпоративных приложений в больших гетероген...
Обеспечение бесперебойной работы корпоративных приложений в больших гетероген...Cisco Russia
 
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары SoftengiРазработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары SoftengiSoftengi
 
Автоматизация учета кузовных ремонтов с помощью решений Альфа-Авто и Аудатекс
Автоматизация учета кузовных ремонтов с помощью решений Альфа-Авто и АудатексАвтоматизация учета кузовных ремонтов с помощью решений Альфа-Авто и Аудатекс
Автоматизация учета кузовных ремонтов с помощью решений Альфа-Авто и Аудатексalfa_rarus_ru
 

Similaire à Tdd and BDD (20)

Стабильны ли ваши приложения в облаках?
Стабильны ли ваши приложения в облаках?Стабильны ли ваши приложения в облаках?
Стабильны ли ваши приложения в облаках?
 
Tarifer corporate 2
Tarifer corporate 2Tarifer corporate 2
Tarifer corporate 2
 
От заказной разработки к рыбоперерабатывающему цеху
От заказной разработки к рыбоперерабатывающему цехуОт заказной разработки к рыбоперерабатывающему цеху
От заказной разработки к рыбоперерабатывающему цеху
 
Парсим и кодогенерируем для С++ с использованием clang
Парсим и кодогенерируем для С++ с использованием clangПарсим и кодогенерируем для С++ с использованием clang
Парсим и кодогенерируем для С++ с использованием clang
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
 
ReTag - Презентация
ReTag - ПрезентацияReTag - Презентация
ReTag - Презентация
 
Изоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, HuntflowИзоморфные приложения и Python - Виталий Глибин, Huntflow
Изоморфные приложения и Python - Виталий Глибин, Huntflow
 
МИКОЛА БОБОШКО «Тестування вебсервісів — основи» Lviv QA Day 2019
МИКОЛА БОБОШКО «Тестування вебсервісів — основи» Lviv QA Day 2019МИКОЛА БОБОШКО «Тестування вебсервісів — основи» Lviv QA Day 2019
МИКОЛА БОБОШКО «Тестування вебсервісів — основи» Lviv QA Day 2019
 
Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.
 
Микита Семенов “Вартість створення сайту і його обслуговування?”
Микита Семенов “Вартість створення сайту і його обслуговування?”Микита Семенов “Вартість створення сайту і його обслуговування?”
Микита Семенов “Вартість створення сайту і його обслуговування?”
 
AGIMA
AGIMAAGIMA
AGIMA
 
Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web Apps
 
Практические возможности работы с Google Tag Manager
Практические возможности работы с Google Tag ManagerПрактические возможности работы с Google Tag Manager
Практические возможности работы с Google Tag Manager
 
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
2016-09-17 02 Игорь Гончаровский. Техническая и программная сторона VoIP
 
Что еще можно делать в Google Tag Manager кроме установки кода google analytics.
Что еще можно делать в Google Tag Manager кроме установки кода google analytics.Что еще можно делать в Google Tag Manager кроме установки кода google analytics.
Что еще можно делать в Google Tag Manager кроме установки кода google analytics.
 
Что необходимо для успешного старта онлайн-бизнеса
Что необходимо для успешного старта онлайн-бизнесаЧто необходимо для успешного старта онлайн-бизнеса
Что необходимо для успешного старта онлайн-бизнеса
 
Презентация компании Ареон 2016
Презентация компании Ареон 2016Презентация компании Ареон 2016
Презентация компании Ареон 2016
 
Обеспечение бесперебойной работы корпоративных приложений в больших гетероген...
Обеспечение бесперебойной работы корпоративных приложений в больших гетероген...Обеспечение бесперебойной работы корпоративных приложений в больших гетероген...
Обеспечение бесперебойной работы корпоративных приложений в больших гетероген...
 
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары SoftengiРазработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
 
Автоматизация учета кузовных ремонтов с помощью решений Альфа-Авто и Аудатекс
Автоматизация учета кузовных ремонтов с помощью решений Альфа-Авто и АудатексАвтоматизация учета кузовных ремонтов с помощью решений Альфа-Авто и Аудатекс
Автоматизация учета кузовных ремонтов с помощью решений Альфа-Авто и Аудатекс
 

Tdd and BDD

  • 1. Тестирование Alex Slynko UkrGermanEnterprise GmbH URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 2. TDD URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 3. TDD URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 ● Что это такое? ● Test driven development ● Вначале тесты – потом код
  • 4. Виды тестов URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 5. Виды тестов URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 ● Юнит-тесты ● Интеграционные ● Системные ● Интеграции систем
  • 6. Юнит-тесты URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 ● Одна часть метода ● К внешним сервисам нет реальных обращений ● Желательно только одна проверка в тесте ● Очень быстро работает
  • 7. Тестирование без других частей URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 ● Dummy – параметры, которые передаются внутрь, но не используются в тесте. Пустые объекты ● Stub – объекты, которые отвечают на запросы с заданным ответом ● Mock = Stub + проверка, что методы будут вызваны
  • 8. URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 Юнит-тесты context "bonus_data" do context “percent” do should "be taken from trader if absent in model" do @bonus_data_hash = { :percent => 2, :amount => 200 } @trader = OpenStruct.new(:cars_data => {:bonus_data => @bonus_data_hash, :federal_state => "Sachsen" }) @available_car = Car.make_unsaved(:trader => @trader) assert_equal @bonus_data_hash[:percent], @available_car. bonus_data.first[:percent] end end end
  • 9. Юнит-тесты URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 ● Упрощает рефакторинг – видно где падает ● Самодокументация ● Минимизирует зависимости ● Упрощает интеграцию
  • 10. Интеграционные ● Взаимодействие нескольких систем ● Внешние сервисы могут быть разблокированы ● Медленные ● Может быть несколько проверок ● В случае изменения старой системы могут работать URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 11. Интеграционные URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 context "the Body overview" do setup do @model = Car::Model.make_with_discount({}, :bonus_data => [ base_bonus(50) ]) end should "show disabled models without link to configure the car" do @model.update_attribute(:enabled, false) visit body_url( @model.brand_slug, @model.line_slug, @model. body_slug ) assert_contain "#{@model.brand_name} #{@model.line_name} # {@model.body_name}" assert_contain I18n.t("show_available_models") assert_have_no_selector "a[href='#{body_models_url( @model. brand_slug, @model.line_slug, @model.body_slug )}']" end
  • 12. Как TDD работает? URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 13. URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 14. URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 Как это работает на самом деле?
  • 15. Продаем TDD URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 16. Работать с TDD? URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 Плюсы Минусы ● Легче создавать ● Легче рефакторить ● Документация ● Код больше не страшно трогать ● Я не тестировщик ● Не понятно зачем ● Надо поддерживать еще и тесты ● Слишком сложная система
  • 17. TDD URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 ● Легко ● Интересно ● Сложно ● Скучно
  • 18. Не совсем TDD URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 ● Тесты должны идти в коммите с кодом ● Не весь код должен иметь тесты ● Не совсем помогает
  • 19. Примеры URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 20. Hotel URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 Добавить флажок для гостя, что он ребенок
  • 21. Autoleasing URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 ● Ежедневно получаем список доступных машин от компании. Добавить checksum и не обновлять машину, если ее checksum такой же как был. should "update car with changes" do AvailableCarsImporter.import car = Car::Available.first car.update_attribute(:trim_level, nil) car.update_attributes({:checksum => 'Changed checksum'}) Car::Available.expects(:save).once AvailableCarsImporter.import assert car.reload.trim_level end
  • 22. TDD. Примеры URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 ● Нужны ли эти тесты? ● Помогли ли они нам? ● Пригодятся ли в будущем?
  • 23. Пример def calculate_leasing_data leasing_info = self.leasing_data options = { :vehicle_id => self.vehicle_id, :ld => leasing_info[:runtime].to_i, :jkm => leasing_info[: mileage].to_i, :sozp => leasing_info[:downpayment_percent].to_d.round, :sfan => self.brand_name } becos = options_data.map {|option| option[:option_code] } if options_data options[:becos] = becos if becos.present? output_data = LeasingDataCalculator.get_leasing_data(options) if output_data and !(output_data == [] or output_data.try(:[], "err").present? or (records = output_data.try(:[], "rec")).blank?) and month_rate = records.try(:[], "FL").try(:[], "mrat") delivery_costs_leasing = records.try(:[], "LP").try(:[], "mrat") || 0.0 LeasingData.create( :rate => month_rate.to_d, :offer_id => self.id, :downpayment_percent => leasing_info[: downpayment_percent].to_d.round, :mileage => leasing_info[:mileage], :downpayment_amount => leasing_info[:downpayment_amount].to_d, :runtime => leasing_info [:runtime], :delivery_costs_leasing => delivery_costs_leasing, :additional_info => records.to_json ) else error_message = I18n.t("leasing_data_not_saved", :leasing_offer_id => self.id) Airbrake.notify(:error_class => "CreateLeasingDataError", :error_message => error_message, : parameters => options) end end URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 24. Пример if output_data and !(output_data == [] or output_data.try(:[], "err").present? or (records = output_data.try(:[], "rec")).blank?) and month_rate = records. try(:[], "FL").try(:[], "mrat") delivery_costs_leasing = records.try(:[], "LP").try(:[], "mrat") || 0.0 ... else error_message = I18n.t("leasing_data_not_saved", :leasing_offer_id => self.id) Airbrake.notify(:error_class => "CreateLeasingDataError", : error_message => error_message, :parameters => options) end end URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 25. URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 Пример .. output_data = LeasingDataCalculator.get_leasing_data(options) … Class LeasingDataCalculator def self.get_leasing_data(options) return {} if option[:some].blank? #И еще несколько подобных проверок options = prepare_options(options) WebServices.get_leasing_data(options) end end
  • 26. Пример URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 output_data = { "rec" => { "FL" => { "mrat" => "123.45" }, "LP" => { "mrat" => "234.56" } } } WebServices.stubs(:get_leasing_data).returns(output_data) assert_difference("LeasingData.count") { @offer.calculate_leasing_data } leasing_data = LeasingData.last assert_equal @offer, leasing_data.offer assert_equal 123.45, leasing_data.rate assert_equal 20, leasing_data.downpayment_percent assert_equal 10000, leasing_data.mileage assert_equal 1234, leasing_data.downpayment_amount assert_equal 12, leasing_data.runtime assert_equal 234.56, leasing_data.delivery_costs_leasing assert_equal output_data["rec"].to_json, leasing_data.additional_info
  • 27. Пример URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 should "notify airbrake about not updated leasing data" do WebServices.stubs(:get_leasing_data).returns({"err" => "some error"}) error_message = I18n.translate("leasing_data_not_saved", :leasing_offer_id => @offer.id) Airbrake.expects(:notify).with(:error_class => "CreateLeasingDataError", : error_message => error_message) @offer.calculate_leasing_data end
  • 28. Пример URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 def calculate_leasing_data output_data = LeasingDataCalculator.get_leasing_data(self) if output_data[:error].blank? LeasingData.create(output_data) else error_message = I18n.t(“create_offer_errors. leasing_data_not_saved", :leasing_offer_id => self.id) Airbrake.notify(:error_class => "CreateLeasingDataError", : error_message => error_message) end end
  • 29. Продаем дальше URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 30. Позволить работать с TDD? Плюсы URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 Минусы ● Довольные программисты ● Уменьшение количества регрессий ● Проще обновлять библиотеки ● Больше времени на задание ● Тяжело роверить ● Отдельный тестовый сервер
  • 31. URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 Последний довод Тесты позволяют писать код не приходя в сознание
  • 32. Надо думать URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 33. Приемочные тесты URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 ● Требования выполнены ● Не знает ничего о внутренней структуре (черный ящик) ● Объясняется в терминах заказчика (возможно, даже заказчиком)
  • 34. Приемочные ● Given Jira Issue with several bugs ● When all that bugs are fixed ● Then Issue is closed Взято с Хабра © URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 35. Приемочные ● Given Jira Issue with 1 bug ● And I am on issue overview page ● When I fix it ● Then Issue is closed URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 36. BDD URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 ● Что это такое? ● Behaviour driven development ● Вначале приемочные тесты – потом код
  • 37. Как это работает? URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 38. Позволить работать с BDD? Плюсы URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 Минусы ● Уменьшение количества регрессий ● Можно проверить что делают ● Улучшается понимание ● Еще больше времени на задание ● Отдельный тестовый сервер
  • 39. Примеры URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 40. Примеры - В комнате должен быть хотя бы один дееспособный человек Given a kid client “John” And an adult client “Jake” Then I can not reserve room for “John” But I can reserve room for “Jake” And I can reserve room for “Jake” and “John” URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 41. Leasing Given car which is imported And I changed it When I approved it And run import again Then car should be still approved When run import again with different data Then car should be unapproved URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 42. Как это может не работать? URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 43. Тесты не чиняться URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 44. Неправильные тесты После работы метода берем результат с которым потом и сравниваем. order = Order.build(VAT: 19, discount: 5) order.items << (line_item = LineItem.build(price: 100.5)) assert 134.595, order.total_amount ● URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370
  • 45. Долгие тесты URL: www.acceptic.com Software programming services and dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 Сохраняет данные в базу данных, когда это не нужно order = Order.make(VAT: 19, discount: 5) order.items << (line_item = LineItem.make(price: 100.5)) assert 133.65, order.total_amount
  • 46. Сложнотестируемый код URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 Взаимодествие одного метода с большим количеством объектов public XlsFile GenerateReport() { int period; if (DateTime.Today.DayOfWeek == DayOfWeek.Sunday) { period = 7 } else { period = SomeServiceClient().GetPeriod(); } …
  • 47. Код написанный для тестов URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 # app/use_cases/post_comment.rb # Called from the "create" action in a controller class PostComment def initialize(user, entry, attributes) @user, @entry, @attributes = user, entry, attributes end def post @comment = @user.comments.new @comment.assign_attributes(@attributes) @comment.entry = @entry @comment.save! LanguageDetector.new(@comment).set_language SpamChecker.new(@comment).check_spam CommentMailer.new(@comment).send_mail post_to_twitter if @comment.share_on_twitter? post_to_facebook if @comment.share_on_facebook? @comment end private def post_to_twitter PostToTwitter.new(@user, @comment).post end def post_to_facebook PostToFacebook.new(@user, @comment).action(:comment) end end
  • 48. Взаимозависимые тесты URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 ● Изменение конфигурации перед тестом (и не изменение после) ● Сохранение специального конфига в базе данных APP_CONFIG[:available_cars][:traders] = { "TRADER_ID" => @trader.id }
  • 49. Вера во время URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 Запись, которая создается позже имеет timestamp больше bmw = Car.make(:brand_name => ‘bmw’) audi = Car.make(:brand_name => ‘audi’) assert _equal [bwm, audi], Car.order(:created_at).all
  • 50. Порядок URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370 Порядок не обязан сохраняться, если только он не прописан явно record1 = Car.make(:brand => ‘Audi’) record2 = Car.make(:brand => ‘Audi’) assert_equal [record1, record2], Car.by_brand(‘Audi’)
  • 51. Вопросы? URL: www.acceptic.com Software programming services and Dedicated developers teams E-mail: info@acceptic.com Tel.: +1 800 990 4370