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
● Вначале тесты – потом код
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
16. Работать с 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
● Тесты должны идти в коммите с кодом
● Не весь код должен иметь тесты
● Не совсем помогает
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
● Нужны ли эти тесты?
● Помогли ли они нам?
● Пригодятся ли в будущем?
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
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
Последний довод
Тесты позволяют писать код не приходя в сознание
33. Приемочные тесты
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
Минусы
● Уменьшение количества
регрессий
● Можно проверить что
делают
● Улучшается понимание
● Еще больше
времени на задание
● Отдельный
тестовый сервер
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’)