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 Slide

  2. DHH
    (David Heinemeier Hansson)

    View Slide

  3. View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. View Slide

  8. View Slide

  9. View Slide

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

    View Slide

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

    View Slide

  12. Test-driven

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  16. Q.E.D.

    View Slide

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

    View Slide

  18. Диалог

    View Slide

  19. View Slide

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

    View Slide

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

    View Slide

  22. x
    y
    z

    View Slide

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

    View Slide

  24. Twitter @skanev
    GitHub @skanev
    Blog skanev.com

    View Slide

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

    View Slide

  26. TEST-FIRST TEST-AFTER
    1.

    View Slide

  27. View Slide

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

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

    View Slide

  29. “The essence of writing
    is rewriting”

    View Slide

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

    View Slide

  31. View Slide

  32. ВХОД ИЗХОД

    View Slide

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

    View Slide

  34. View Slide

  35. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  40. ВХОД ИЗХОД

    View Slide

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

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

    View Slide

  42. 2.
    Hexagonal Architecture

    View Slide

  43. hexagonal
    architecture

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  48. View Slide

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

    View Slide

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

    View Slide

  51. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  55. 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 Slide

  56. 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 Slide

  57. моят опит

    View Slide

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

    View Slide

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

    View Slide

  60. Mocks
    3.

    View Slide

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

    View Slide

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

    View Slide

  63. Controller
    Model
    Database
    MailChimp
    Twitter API
    View
    Internal

    View Slide

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

    View Slide

  65. mocks + test-first = GOOS

    View Slide

  66. GOOS, London School

    View Slide

  67. пример

    View Slide

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

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

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

    View Slide

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

    User.stub find: user!

    user.should_receive(:update)

    .with(name: 'Jon')!



    post :create, name: ‘Jon'!

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  75. if {!
    if {!
    if {!
    ...!
    } else {!
    if {!
    if {!
    ...!
    } else {!
    ...!
    }!
    }!
    }!
    } else {!
    ...!
    }!
    } else {!
    ...!
    }

    View Slide

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


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


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

    View Slide

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

    View Slide

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

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

    View Slide

  79. ВХОД ИЗХОД

    View Slide

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

    View Slide

  81. Изводи
    4.

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  86. View Slide

  87. View Slide