SlideShare ist ein Scribd-Unternehmen logo
1 von 51
Downloaden Sie, um offline zu lesen
Тестирование
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

Weitere ähnliche Inhalte

Ähnlich wie Tdd and BDD

Tarifer corporate 2
Tarifer corporate 2Tarifer corporate 2
Tarifer corporate 2
Tarifer LLC
 
От заказной разработки к рыбоперерабатывающему цеху
От заказной разработки к рыбоперерабатывающему цехуОт заказной разработки к рыбоперерабатывающему цеху
От заказной разработки к рыбоперерабатывающему цеху
Burt and Co LLC
 
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Moscow Python Conf 2016. Почему 100% покрытие это плохо?
Ivan Tsyganov
 
Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.
ScrumTrek
 
Микита Семенов “Вартість створення сайту і його обслуговування?”
Микита Семенов “Вартість створення сайту і його обслуговування?”Микита Семенов “Вартість створення сайту і його обслуговування?”
Микита Семенов “Вартість створення сайту і його обслуговування?”
Lviv Startup Club
 
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары SoftengiРазработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Разработка Web-приложений на Angular JS. Архитектурные семинары Softengi
Softengi
 

Ähnlich wie 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
 
Автоматизация учета кузовных ремонтов с помощью решений Альфа-Авто и Аудатекс
Автоматизация учета кузовных ремонтов с помощью решений Альфа-Авто и АудатексАвтоматизация учета кузовных ремонтов с помощью решений Альфа-Авто и Аудатекс
Автоматизация учета кузовных ремонтов с помощью решений Альфа-Авто и Аудатекс
 

Kürzlich hochgeladen

2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
Хроники кибер-безопасника
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Ирония безопасности
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
Хроники кибер-безопасника
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
Ирония безопасности
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
Хроники кибер-безопасника
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
Хроники кибер-безопасника
 

Kürzlich hochgeladen (9)

2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf2023 Q4. The Ransomware report. [RU].pdf
2023 Q4. The Ransomware report. [RU].pdf
 
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
Cyber Defense Doctrine Managing the Risk Full Applied Guide to Organizational...
 
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdfСИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
СИСТЕМА ОЦЕНКИ УЯЗВИМОСТЕЙ CVSS 4.0 / CVSS v4.0 [RU].pdf
 
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdfMalware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
Malware. DCRAT (DARK CRYSTAL RAT) [RU].pdf
 
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
ИСТОЧНИКИ ИННОВАЦИОННОСТИ КИТАЯ (ПО ВЕРСИИ DGAP) | The Sources of China’s Inn...
 
Cyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdfCyberprint. Dark Pink Apt Group [RU].pdf
Cyberprint. Dark Pink Apt Group [RU].pdf
 
CVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdfCVE. The Fortra's GoAnywhere MFT [RU].pdf
CVE. The Fortra's GoAnywhere MFT [RU].pdf
 
Ransomware_Q3 2023. The report [RU].pdf
Ransomware_Q3 2023.  The report [RU].pdfRansomware_Q3 2023.  The report [RU].pdf
Ransomware_Q3 2023. The report [RU].pdf
 
MS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdfMS Navigating Incident Response [RU].pdf
MS Navigating Incident Response [RU].pdf
 

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