Upgrade to Pro — share decks privately, control downloads, hide ads and more …

За смъртта на TDD

За смъртта на TDD

Презентацията от PlovdivConf 2014

Stefan Kanev

May 17, 2014
Tweet

More Decks by Stefan Kanev

Other Decks in Programming

Transcript

  1. За смъртта на TDD
    Стефан Кънев

    http://skanev.com/

    @skanev
    PlovdivConf

    17 май 2014

    Пловдив

    View full-size slide

  2. DHH
    (David Heinemeier Hansson)

    View full-size slide

  3. Кратката версия: греши

    View full-size slide

  4. Риторика
    в две стъпки

    View full-size slide

  5. Представя малка част за
    цялата картинка
    1.

    View full-size slide

  6. нишови практики

    View full-size slide

  7. Казва: въобще не са добра
    идея
    Има предвид: не му вършат
    работа за Basecamp
    2.

    View full-size slide

  8. все пак:
    повдига валидни
    притеснения

    View full-size slide

  9. Диалог

    View full-size slide

  10. Дългата версия: …

    View full-size slide

  11. GOOS
    Mocks
    Test-induced design damage
    Hexagonal Architecture
    TDD

    View full-size slide

  12. Здравейте, аз съм Стефан

    View full-size slide

  13. Twitter @skanev
    GitHub @skanev
    Blog skanev.com

    View full-size slide

  14. 1. test-first vs. test-after
    2. hexagonal architecture
    3. mocking & isolation
    4. валидните притеснения
    План
    1.
    2.
    3.
    4.

    View full-size slide

  15. TEST-FIRST TEST-AFTER
    1.

    View full-size slide

  16. “Ако имах повече време, щях да
    напиша по-кратко писмо”

    !
    — Паскал, Твен, Франклин, т.н.

    View full-size slide

  17. “The essence of writing
    is rewriting”

    View full-size slide

  18. При четимия код е същото:
    ревизирането е ключа е към
    разбираемостта

    View full-size slide

  19. ВХОД ИЗХОД

    View full-size slide

  20. една история

    View full-size slide

  21. 1. Зареди си кода
    2. Изтрий всичко от базата
    3. Добави в една таблица
    4. Добави в другата
    5. Свържи ги
    Създай .rb файл, в който:

    View full-size slide

  22. пускане
    грешка
    промяна

    View full-size slide

  23. Същата идея: малки стъпки с
    честа обратна връзка

    View full-size slide

  24. кога не работи?

    View full-size slide

  25. ВХОД ИЗХОД

    View full-size slide

  26. Кога не правя test-first:

    1. Когато не пиша тестове
    2. Когато не съм много
    неуверен в интерфейса

    View full-size slide

  27. 2.
    Hexagonal Architecture

    View full-size slide

  28. hexagonal
    architecture

    View full-size slide

  29. шестоъгълна
    архитектура

    View full-size slide

  30. Как са направим бизнес
    логиката независима от
    GUI-то/базата/framework-а?

    View full-size slide

  31. Controller
    Model
    Database
    View
    Бизнес логика

    View full-size slide

  32. Бизнес логика
    Order
    Transaction
    User
    <>
    Controller
    View
    <>
    Model
    Database

    View full-size slide

  33. Основен trade-off: добавяме
    индирекция за да спечелим
    независимост

    View full-size slide

  34. клъстеризация
    по-сложно, но по-сигурно

    View full-size slide

  35. Подходящо за определени
    ситуации, но не е универсално

    View full-size slide

  36. прост пример с код

    View full-size slide

  37. Disclaimer
    твърде просто за ⬡

    View full-size slide

  38. class EmployeesController < ApplicationController!
    def create!
    @employee = Employee.new(params[:employee])!
    !
    if @employee.save!
    redirect_to @employee, notice: "#{@employee.name} created"!
    else!
    render :new!
    end!
    end!
    end!

    View full-size slide

  39. class EmployeesController < ApplicationController!
    def create!
    CreateEmployee.run(params[:employee], {!
    success: -> (employee) {!
    redirect_to employee, notice: “#{employee.name} created"!
    },!
    failure: -> (employee) {!
    @employee = employee!
    render :new!
    }!
    })!
    end!
    end

    View full-size slide

  40. моят опит

    View full-size slide

  41. Дава добри решения за малки
    части (5%) от приложението

    View full-size slide

  42. Добро попълнение за торбата
    с трикове, но далеч не и
    универсален инструмент

    View full-size slide

  43. оплетена терминология

    View full-size slide

  44. mocks, stubs, doubles, у-а
    умишлено мърляв

    View full-size slide

  45. Controller
    Model
    Database
    MailChimp
    Twitter API
    View
    Internal

    View full-size slide

  46. Тестваме взаимодействието с
    колабораторите, а не резултата
    от страничния им ефект

    View full-size slide

  47. mocks + test-first = GOOS

    View full-size slide

  48. GOOS, London School

    View full-size slide

  49. пример

    View full-size slide

  50. Controller
    Model
    Database
    1. Създай потребител

    2. Извикай контролера

    3. Провери новото име в базата
    без mock-ове

    View full-size slide

  51. Controller
    Model
    с mock-ове
    user = mock('User')!

    User.stub find: user!

    user.should_receive(:update)

    .with(name: 'Jon')!



    post :create, name: ‘Jon'!

    View full-size slide

  52. два проблема

    View full-size slide

  53. 1. “вложени mock-ове”

    View full-size slide

  54. mock, който връща mock,
    който връща mock,
    който връща mock

    View full-size slide

  55. проблем в приложението

    View full-size slide

  56. структурирано
    програмиране

    View full-size slide

  57. if {!
    if {!
    if {!
    ...!
    } else {!
    if {!
    if {!
    ...!
    } else {!
    ...!
    }!
    }!
    }!
    } else {!
    ...!
    }!
    } else {!
    ...!
    }

    View full-size slide

  58. Опитните mockist-и приемат това
    като симптом.


    Или има твърде много coupling, т.е.
    проблем в дизайна…


    …или в този случай е приемливо и
    тестваме в интеграция.

    View full-size slide

  59. 2. “пречи на refactoring”

    View full-size slide

  60. “Искам да refactor-на кода, но
    тестовете ми пречат”.

    !
    Странно, обикновено е обратното.

    View full-size slide

  61. ВХОД ИЗХОД

    View full-size slide

  62. Работи добре при стабилни
    интерфейси. Не е подходящо
    за изменчиви такива.

    View full-size slide

  63. Изводи
    4.

    View full-size slide

  64. Извод №1
    !
    “Ако не правиш TDD, не си
    професионалист” е лъжа

    View full-size slide

  65. Извод №1.5
    !
    “Ако не правиш _____, не си
    професионалист” е лъжа

    View full-size slide

  66. Извод №2
    !
    TDD се научава и обяснява
    трудно. Трябва да се прави
    внимателно.

    View full-size slide

  67. Извод №3
    !
    There is no silver bullet.
    Контекста е цар.

    View full-size slide