SlideShare a Scribd company logo
Test Driven
Development
● когда надо
● когда не надо
Павел Калашников, SimbirSoft
● 5 лет опыта коммерческой
разработки
● все 5 лет использую TDD
● применял (или не применял) TDD к
примерно 30 проектам
TL;DR
too long; didn't read
TDD-обещания
● ускорение скорости разработки
● показ тестов заказчику до реализации
● высокое покрытие функционала тестами
● меньше отладки
● проработанная архитектура приложения
TDD-разочарование
● только продуктовым компаниям
● не в нашем стеке технологий
● вообще не работает
● только на backend
● не в этой предметной области
TDD нужен НЕ всегда
Применять или не применять TDD зависит от:
● человека, который ставит и принимает задачи (“заказчика”)
● ценностей команды разработчиков
● ответственности менеджмента
Критерии использования TDD
Многие тестовые фреймворки поддерживают возможность создания схемы,
которая будет актуальна для всех интерфейсов
it "returns valid json matching the candidate types schema" do
get candidates_path, :params => {}, :headers => headers
expect(response).to match_response_schema("candidates", :strict => true)
end
Описанная структура интерфейсов
Один подход к реализации интерфейсов
def show
candidate = Candidate.find(params[:id])
render(
:json => candidate,
:serializer => CandidateSerializer,
:status => :ok
)
end
Один подход к реализации интерфейсов
def show
user = User.find(params[:id])
render(
:json => user,
:serializer => UserSerializer,
:status => :ok
)
end
В задаче описана реализация
● GET /bandings -> Lists the bandings for the current account
● POST /bandings -> Creates a banding for the current account
● GET /bandings/:id -> Gets a banding for the current account
● PATCH /bandings/:id -> Updates a banding for the current account
Критерии
● в проекте чётко описана структура интерфейсов (JSON-API, REST-API и
т.д.)
● в проекте однотипный подход к реализации интерфейсов
● “заказчик” ставит задачу, описывая в ней интерфейс взаимодействия
● задачи ставятся в стиле: одна подзадача - один тест
● в стеке технологий есть высокоуровневный тестовый фреймворк
(необязательное условие)
● нет отдельной команды QA
TDD & QA
Методология предполагает,
что тесты пишут
программисты
Когда TDD не нужен
Задачи без должной проработки
● Написание тестов
● Реализация функционала
● Рефакторинг
● Переписывание тестов
● Переделывание функционала
● Снова рефакторинг
Простой пример:
форма регистрации
Сложные вычисления
Сложные вычисления
-> Сложно предсказать результат
-> Сложно написать тест до реализации
-> Много времени на написание теста
Простой пример:
BI
Безопасность
Обеспечение безопасности сегодня требует участия человека
-> Автоматическое тестирование не очень полезно
-> Тесты до реализации ещё менее полезно
TDD не нужен!
● “заказчик” ставит задачи без должной проработки
● реализуется назаурядный функционал
● реализуется функционал, связанный со сложными вычислениями
● реализуется функционал, связанный с большими нагрузками
● реализуется функционал, связанный с безопасностью
Copy Paste Driven Development + TDD
Условия: описанные интерфейсы + описанные принципы
реализации интерфейсов
Порядок действий:
● Копируем тесты
● Переименовываем endpoints и названия сущностей (2
команды в VIM)
● Прогоняем тесты
● Копируем реализацию
● Переименовываем названия сущностей (2
команды в VIM)
● Прогоняем тесты
● “Работаем напильником”
UsersController
class UsersController < ApplicationController
def show
@user = User.find(params[:id])
end
def create
@user = User.new(params[:user])
if @user.save
redirect_to user_path
else
render :new
end
end
end
UsersControllerTest
test "should get show" do
@user = User.find_by_email(“test@email.com”)
get user_path(@user)
assert_response :success
end
test "should post create" do
attributes = attributes_for(:user)
post :create, user: attribute
assert_response :success
end
CandidateController
class CandidatesController < ApplicationController
def show
@candidate = Candidate.find(params[:id])
end
def create
@candidate = Candidate.new(params[:candidate])
if @candidate.save
redirect_to candidate_path
else
render :new
end
end
end
CandidateControllerTest
test "should get show" do
@candidate = Candidate.find_by_email(“test@email.com”)
get candidate_path(@candidate)
assert_response :success
end
test "should post create" do
attributes = attributes_for(:candidate)
post :create, candidate: attribute
assert_response :success
end
RSpec or Minitest + FactoryGirl + webdriver
Фреймворки для интеграционного тестирования с
декларативно-императивным синтаксисоМ
● RSpec or Minitest or Cucumber
● FactoryGirl or another
● Selenium or Poltergeist or PhantomJS
RSpec
it "returns a candidate with the correct ID" do
candidate = create :candidate
get candidate_path candidate
expect(response.body).to include_json(
"data" => {
"id" => candidate.id.to_s,
"type" => "candidates"
}
)
end
RSpec
it "returns a user with the correct ID" do
user = create :user
get user_path user
expect(response.body).to include_json(
"data" => {
"id" => user.id.to_s,
"type" => "users"
}
)
end
RSpec
[ :user, :candidate ] do |model_name|
it "returns a #{model_name} with the correct ID" do
object = create model_name
get send "#{model_name}_path", object
expect(response.body).to include_json(
"data" => {
"id" => object.id.to_s,
"type" => model_name.pluralize(:en)
}
)
end
end
scenario 'Create new open opportunity and add teachers to it' do
visit opportunities_path
click_on "New opportunity"
fill_in "Name", with: "New opportunity"
fill_in "Amount in $", with: 100
click_on 'Create Opportunity'
fill_in "opportunity_teacher[email]", with: "test@example.com"
click_on "Add teacher"
expect(page).to have_content("test@example.com")
end
RSpec + Capybara
@kalashnikovisme
http://pavelkalashnikov.tumblr.com

More Related Content

What's hot

Grail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестовGrail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестов
CodeFest
 
Архитектура автоматизированных тестов: представление предметной области
Архитектура автоматизированных тестов: представление предметной областиАрхитектура автоматизированных тестов: представление предметной области
Архитектура автоматизированных тестов: представление предметной области
SQALab
 
GUI-автоматизация в Telerik Test Studio
GUI-автоматизация в Telerik Test StudioGUI-автоматизация в Telerik Test Studio
GUI-автоматизация в Telerik Test Studio
SQALab
 
Подход к тестированию хранилища данных на базе MS SQL Server
Подход к тестированию хранилища данных на базе MS SQL ServerПодход к тестированию хранилища данных на базе MS SQL Server
Подход к тестированию хранилища данных на базе MS SQL Server
SQALab
 
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в DevopsQA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QAFest
 
Денис Чистяков: Workflow. Работа над проектом в Яндексе
Денис Чистяков: Workflow. Работа над проектом в ЯндексеДенис Чистяков: Workflow. Работа над проектом в Яндексе
Денис Чистяков: Workflow. Работа над проектом в ЯндексеYandex
 
Testing in Scrum - Yuriy Malyi
Testing in Scrum - Yuriy Malyi Testing in Scrum - Yuriy Malyi
Testing in Scrum - Yuriy Malyi
Agile Base Camp
 
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
IT61
 
QA Fest 2015. Юлия Завертайло. Практическая визуализация пользы тестирования...
QA Fest 2015. Юлия Завертайло. Практическая визуализация пользы тестирования...QA Fest 2015. Юлия Завертайло. Практическая визуализация пользы тестирования...
QA Fest 2015. Юлия Завертайло. Практическая визуализация пользы тестирования...
QAFest
 
Дефицит ресурсов тестирования... или нет?
Дефицит ресурсов тестирования... или нет?Дефицит ресурсов тестирования... или нет?
Дефицит ресурсов тестирования... или нет?
SQALab
 
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Javakranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в JavaKrivoy Rog IT Community
 
Организация процесса ручного тестирования
Организация процесса ручного тестированияОрганизация процесса ручного тестирования
Организация процесса ручного тестирования
IT61
 
Тестирование осень 2013 лекция 3
Тестирование осень 2013 лекция 3Тестирование осень 2013 лекция 3
Тестирование осень 2013 лекция 3Technopark
 
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
Alexei Lupan
 
«Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС
«Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС  «Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС
«Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС DevDay
 
C&C for coffee'n'code
C&C for coffee'n'codeC&C for coffee'n'code
C&C for coffee'n'codeIvan Mosiev
 
Метод No-Test-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Test-Cases: избавьтесь от тест-кейсов в тестированииМетод No-Test-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Test-Cases: избавьтесь от тест-кейсов в тестировании
SQALab
 
Управляя автоматизацией тестирования
Управляя автоматизацией тестированияУправляя автоматизацией тестирования
Управляя автоматизацией тестирования
Paul Stashevsky
 

What's hot (20)

Grail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестовGrail: шаги для ваших Python-тестов
Grail: шаги для ваших Python-тестов
 
Архитектура автоматизированных тестов: представление предметной области
Архитектура автоматизированных тестов: представление предметной областиАрхитектура автоматизированных тестов: представление предметной области
Архитектура автоматизированных тестов: представление предметной области
 
GUI-автоматизация в Telerik Test Studio
GUI-автоматизация в Telerik Test StudioGUI-автоматизация в Telerik Test Studio
GUI-автоматизация в Telerik Test Studio
 
презентация планов
презентация плановпрезентация планов
презентация планов
 
презентация планов
презентация плановпрезентация планов
презентация планов
 
Подход к тестированию хранилища данных на базе MS SQL Server
Подход к тестированию хранилища данных на базе MS SQL ServerПодход к тестированию хранилища данных на базе MS SQL Server
Подход к тестированию хранилища данных на базе MS SQL Server
 
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в DevopsQA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
QA Fes 2016. Анастасия Асеева. Роль тестирования в Devops
 
Денис Чистяков: Workflow. Работа над проектом в Яндексе
Денис Чистяков: Workflow. Работа над проектом в ЯндексеДенис Чистяков: Workflow. Работа над проектом в Яндексе
Денис Чистяков: Workflow. Работа над проектом в Яндексе
 
Testing in Scrum - Yuriy Malyi
Testing in Scrum - Yuriy Malyi Testing in Scrum - Yuriy Malyi
Testing in Scrum - Yuriy Malyi
 
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNgДело тестера боится: как в опытных руках могут заиграть Java и TestNg
Дело тестера боится: как в опытных руках могут заиграть Java и TestNg
 
QA Fest 2015. Юлия Завертайло. Практическая визуализация пользы тестирования...
QA Fest 2015. Юлия Завертайло. Практическая визуализация пользы тестирования...QA Fest 2015. Юлия Завертайло. Практическая визуализация пользы тестирования...
QA Fest 2015. Юлия Завертайло. Практическая визуализация пользы тестирования...
 
Дефицит ресурсов тестирования... или нет?
Дефицит ресурсов тестирования... или нет?Дефицит ресурсов тестирования... или нет?
Дефицит ресурсов тестирования... или нет?
 
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Javakranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
kranonit S11E01 Андрей Пономарёв: Тренинг по TDD в Java
 
Организация процесса ручного тестирования
Организация процесса ручного тестированияОрганизация процесса ручного тестирования
Организация процесса ручного тестирования
 
Тестирование осень 2013 лекция 3
Тестирование осень 2013 лекция 3Тестирование осень 2013 лекция 3
Тестирование осень 2013 лекция 3
 
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
(Seleniumcamp) Selenium IDE как артефакт пикника на обочине
 
«Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС
«Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС  «Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС
«Автоматизация тестирования» — 2ГИС Павел Сташевский, 2ГИС
 
C&C for coffee'n'code
C&C for coffee'n'codeC&C for coffee'n'code
C&C for coffee'n'code
 
Метод No-Test-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Test-Cases: избавьтесь от тест-кейсов в тестированииМетод No-Test-Cases: избавьтесь от тест-кейсов в тестировании
Метод No-Test-Cases: избавьтесь от тест-кейсов в тестировании
 
Управляя автоматизацией тестирования
Управляя автоматизацией тестированияУправляя автоматизацией тестирования
Управляя автоматизацией тестирования
 

Similar to TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirSoft)

Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.
ScrumTrek
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
GoSharp
 
Сергей Ревко
Сергей РевкоСергей Ревко
Сергей Ревко
SQALab
 
Статический анализ кода в DDD
Статический анализ кода в DDDСтатический анализ кода в DDD
Статический анализ кода в DDD
Aleksei Alekseev
 
Вадим Зубович - Test Link
Вадим Зубович - Test LinkВадим Зубович - Test Link
Вадим Зубович - Test Link
QA Club Minsk
 
TestLink
TestLinkTestLink
TestLinkISsoft
 
Оценка проектов тестирования
Оценка проектов тестированияОценка проектов тестирования
Оценка проектов тестирования
Rina Uzhevko
 
Solit 2014, Централизованное управление тестами с помощью TestLink, Зубович В...
Solit 2014, Централизованное управление тестами с помощью TestLink, Зубович В...Solit 2014, Централизованное управление тестами с помощью TestLink, Зубович В...
Solit 2014, Централизованное управление тестами с помощью TestLink, Зубович В...
solit
 
Оценка трудозатрат на тестирование в проектах сопровождения
Оценка трудозатрат на тестирование в проектах сопровожденияОценка трудозатрат на тестирование в проектах сопровождения
Оценка трудозатрат на тестирование в проектах сопровождения
SQALab
 
Роман Кокин «Организация тестирования в больших командах»
Роман Кокин «Организация тестирования в больших командах»Роман Кокин «Организация тестирования в больших командах»
Роман Кокин «Организация тестирования в больших командах»DataArt
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
Igor Shkulipa
 
QAFest. Роль тестирования в Devops
QAFest. Роль тестирования в DevopsQAFest. Роль тестирования в Devops
QAFest. Роль тестирования в Devops
Анастасия Асеева
 
Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"
Fwdays
 
SCRUMopen Developer Max Kolodezniy
SCRUMopen Developer Max KolodezniySCRUMopen Developer Max Kolodezniy
SCRUMopen Developer Max Kolodezniy
Alexey Krivitsky
 
Open Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practicesOpen Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practices
Aliaksandr Ikhelis
 
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментовРеализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
SQALab
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
corehard_by
 
Андрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзеАндрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзе
Elias Fofanov
 

Similar to TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirSoft) (20)

Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.Юлия Викторова; Александр Тарасов. DevOps без булшита.
Юлия Викторова; Александр Тарасов. DevOps без булшита.
 
Tdd php
Tdd phpTdd php
Tdd php
 
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NETОпыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
Опыт разработки сложных клиент-серверных приложений на TypeScript и ASP.NET
 
Сергей Ревко
Сергей РевкоСергей Ревко
Сергей Ревко
 
Статический анализ кода в DDD
Статический анализ кода в DDDСтатический анализ кода в DDD
Статический анализ кода в DDD
 
Вадим Зубович - Test Link
Вадим Зубович - Test LinkВадим Зубович - Test Link
Вадим Зубович - Test Link
 
TestLink
TestLinkTestLink
TestLink
 
Оценка проектов тестирования
Оценка проектов тестированияОценка проектов тестирования
Оценка проектов тестирования
 
Solit 2014, Централизованное управление тестами с помощью TestLink, Зубович В...
Solit 2014, Централизованное управление тестами с помощью TestLink, Зубович В...Solit 2014, Централизованное управление тестами с помощью TestLink, Зубович В...
Solit 2014, Централизованное управление тестами с помощью TestLink, Зубович В...
 
Оценка трудозатрат на тестирование в проектах сопровождения
Оценка трудозатрат на тестирование в проектах сопровожденияОценка трудозатрат на тестирование в проектах сопровождения
Оценка трудозатрат на тестирование в проектах сопровождения
 
Роман Кокин «Организация тестирования в больших командах»
Роман Кокин «Организация тестирования в больших командах»Роман Кокин «Организация тестирования в больших командах»
Роман Кокин «Организация тестирования в больших командах»
 
C# Desktop. Занятие 16.
C# Desktop. Занятие 16.C# Desktop. Занятие 16.
C# Desktop. Занятие 16.
 
QAFest. Роль тестирования в Devops
QAFest. Роль тестирования в DevopsQAFest. Роль тестирования в Devops
QAFest. Роль тестирования в Devops
 
Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"Никита Галкин "Testing in Node.js World"
Никита Галкин "Testing in Node.js World"
 
SCRUMopen Developer Max Kolodezniy
SCRUMopen Developer Max KolodezniySCRUMopen Developer Max Kolodezniy
SCRUMopen Developer Max Kolodezniy
 
Open Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practicesOpen Source Testing Framework: real project example and best practices
Open Source Testing Framework: real project example and best practices
 
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментовРеализация тестового фреймворка на основе OPEN-SOURCE инструментов
Реализация тестового фреймворка на основе OPEN-SOURCE инструментов
 
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья ШишковC++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
C++ CoreHard Autumn 2018. Заглядываем под капот «Поясов по C++» - Илья Шишков
 
Андрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзеАндрей Зайцев - TDD в кровавом энтерпрайзе
Андрей Зайцев - TDD в кровавом энтерпрайзе
 
Test design print
Test design printTest design print
Test design print
 

More from Ontico

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
Ontico
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Ontico
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Ontico
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Ontico
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Ontico
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
Ontico
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Ontico
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Ontico
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
Ontico
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
Ontico
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Ontico
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Ontico
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Ontico
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Ontico
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
Ontico
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Ontico
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Ontico
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
Ontico
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Ontico
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Ontico
 

More from Ontico (20)

One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
One-cloud — система управления дата-центром в Одноклассниках / Олег Анастасье...
 
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)Масштабируя DNS / Артем Гавриченков (Qrator Labs)
Масштабируя DNS / Артем Гавриченков (Qrator Labs)
 
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
Создание BigData-платформы для ФГУП Почта России / Андрей Бащенко (Luxoft)
 
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
Готовим тестовое окружение, или сколько тестовых инстансов вам нужно / Алекса...
 
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
Новые технологии репликации данных в PostgreSQL / Александр Алексеев (Postgre...
 
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
PostgreSQL Configuration for Humans / Alvaro Hernandez (OnGres)
 
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
Inexpensive Datamasking for MySQL with ProxySQL — Data Anonymization for Deve...
 
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
Опыт разработки модуля межсетевого экранирования для MySQL / Олег Брославский...
 
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
ProxySQL Use Case Scenarios / Alkin Tezuysal (Percona)
 
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)MySQL Replication — Advanced Features / Петр Зайцев (Percona)
MySQL Replication — Advanced Features / Петр Зайцев (Percona)
 
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
Внутренний open-source. Как разрабатывать мобильное приложение большим количе...
 
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
Подробно о том, как Causal Consistency реализовано в MongoDB / Михаил Тюленев...
 
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
Балансировка на скорости проводов. Без ASIC, без ограничений. Решения NFWare ...
 
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
Перехват трафика — мифы и реальность / Евгений Усков (Qrator Labs)
 
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
И тогда наверняка вдруг запляшут облака! / Алексей Сушков (ПЕТЕР-СЕРВИС)
 
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
Как мы заставили Druid работать в Одноклассниках / Юрий Невиницин (OK.RU)
 
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
Разгоняем ASP.NET Core / Илья Вербицкий (WebStoating s.r.o.)
 
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...100500 способов кэширования в Oracle Database или как достичь максимальной ск...
100500 способов кэширования в Oracle Database или как достичь максимальной ск...
 
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
Apache Ignite Persistence: зачем Persistence для In-Memory, и как он работает...
 
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
Механизмы мониторинга баз данных: взгляд изнутри / Дмитрий Еманов (Firebird P...
 

TDD: когда нужно и, самое главное, когда не нужно / Павел Калашников (SimbirSoft)

  • 1. Test Driven Development ● когда надо ● когда не надо
  • 2. Павел Калашников, SimbirSoft ● 5 лет опыта коммерческой разработки ● все 5 лет использую TDD ● применял (или не применял) TDD к примерно 30 проектам
  • 4.
  • 5. TDD-обещания ● ускорение скорости разработки ● показ тестов заказчику до реализации ● высокое покрытие функционала тестами ● меньше отладки ● проработанная архитектура приложения
  • 6.
  • 7.
  • 8.
  • 9. TDD-разочарование ● только продуктовым компаниям ● не в нашем стеке технологий ● вообще не работает ● только на backend ● не в этой предметной области
  • 10. TDD нужен НЕ всегда Применять или не применять TDD зависит от: ● человека, который ставит и принимает задачи (“заказчика”) ● ценностей команды разработчиков ● ответственности менеджмента
  • 12. Многие тестовые фреймворки поддерживают возможность создания схемы, которая будет актуальна для всех интерфейсов it "returns valid json matching the candidate types schema" do get candidates_path, :params => {}, :headers => headers expect(response).to match_response_schema("candidates", :strict => true) end Описанная структура интерфейсов
  • 13. Один подход к реализации интерфейсов def show candidate = Candidate.find(params[:id]) render( :json => candidate, :serializer => CandidateSerializer, :status => :ok ) end
  • 14. Один подход к реализации интерфейсов def show user = User.find(params[:id]) render( :json => user, :serializer => UserSerializer, :status => :ok ) end
  • 15. В задаче описана реализация ● GET /bandings -> Lists the bandings for the current account ● POST /bandings -> Creates a banding for the current account ● GET /bandings/:id -> Gets a banding for the current account ● PATCH /bandings/:id -> Updates a banding for the current account
  • 16. Критерии ● в проекте чётко описана структура интерфейсов (JSON-API, REST-API и т.д.) ● в проекте однотипный подход к реализации интерфейсов ● “заказчик” ставит задачу, описывая в ней интерфейс взаимодействия ● задачи ставятся в стиле: одна подзадача - один тест ● в стеке технологий есть высокоуровневный тестовый фреймворк (необязательное условие) ● нет отдельной команды QA
  • 17. TDD & QA Методология предполагает, что тесты пишут программисты
  • 18. Когда TDD не нужен
  • 19. Задачи без должной проработки ● Написание тестов ● Реализация функционала ● Рефакторинг ● Переписывание тестов ● Переделывание функционала ● Снова рефакторинг
  • 21. Сложные вычисления Сложные вычисления -> Сложно предсказать результат -> Сложно написать тест до реализации -> Много времени на написание теста
  • 23. Безопасность Обеспечение безопасности сегодня требует участия человека -> Автоматическое тестирование не очень полезно -> Тесты до реализации ещё менее полезно
  • 24. TDD не нужен! ● “заказчик” ставит задачи без должной проработки ● реализуется назаурядный функционал ● реализуется функционал, связанный со сложными вычислениями ● реализуется функционал, связанный с большими нагрузками ● реализуется функционал, связанный с безопасностью
  • 25. Copy Paste Driven Development + TDD Условия: описанные интерфейсы + описанные принципы реализации интерфейсов Порядок действий: ● Копируем тесты ● Переименовываем endpoints и названия сущностей (2 команды в VIM) ● Прогоняем тесты ● Копируем реализацию ● Переименовываем названия сущностей (2 команды в VIM) ● Прогоняем тесты ● “Работаем напильником”
  • 26. UsersController class UsersController < ApplicationController def show @user = User.find(params[:id]) end def create @user = User.new(params[:user]) if @user.save redirect_to user_path else render :new end end end
  • 27. UsersControllerTest test "should get show" do @user = User.find_by_email(“test@email.com”) get user_path(@user) assert_response :success end test "should post create" do attributes = attributes_for(:user) post :create, user: attribute assert_response :success end
  • 28. CandidateController class CandidatesController < ApplicationController def show @candidate = Candidate.find(params[:id]) end def create @candidate = Candidate.new(params[:candidate]) if @candidate.save redirect_to candidate_path else render :new end end end
  • 29. CandidateControllerTest test "should get show" do @candidate = Candidate.find_by_email(“test@email.com”) get candidate_path(@candidate) assert_response :success end test "should post create" do attributes = attributes_for(:candidate) post :create, candidate: attribute assert_response :success end
  • 30. RSpec or Minitest + FactoryGirl + webdriver Фреймворки для интеграционного тестирования с декларативно-императивным синтаксисоМ ● RSpec or Minitest or Cucumber ● FactoryGirl or another ● Selenium or Poltergeist or PhantomJS
  • 31. RSpec it "returns a candidate with the correct ID" do candidate = create :candidate get candidate_path candidate expect(response.body).to include_json( "data" => { "id" => candidate.id.to_s, "type" => "candidates" } ) end
  • 32. RSpec it "returns a user with the correct ID" do user = create :user get user_path user expect(response.body).to include_json( "data" => { "id" => user.id.to_s, "type" => "users" } ) end
  • 33. RSpec [ :user, :candidate ] do |model_name| it "returns a #{model_name} with the correct ID" do object = create model_name get send "#{model_name}_path", object expect(response.body).to include_json( "data" => { "id" => object.id.to_s, "type" => model_name.pluralize(:en) } ) end end
  • 34. scenario 'Create new open opportunity and add teachers to it' do visit opportunities_path click_on "New opportunity" fill_in "Name", with: "New opportunity" fill_in "Amount in $", with: 100 click_on 'Create Opportunity' fill_in "opportunity_teacher[email]", with: "test@example.com" click_on "Add teacher" expect(page).to have_content("test@example.com") end RSpec + Capybara