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

Паттерны TDD

Паттерны TDD

Доклад на тему паттернов TDD от Игоря Василенко

Avatar for CocoaHeads Russia

CocoaHeads Russia

October 13, 2017

More Decks by CocoaHeads Russia

Other Decks in Programming

Transcript

  1. Паттерны TDD и почему мы должны знать о них 1

    Василенко Игорь
 iOS разработчик в Tinkoff.ru
 Блог: Vasilenko.tech
  2. Agenda - The goal of patterns - Isolated Test -

    Test List - Test First - Assert First - Evident Data - Test Data 2 - A little bit about TDD
  3. A little bit about TDD 3 –Мартин Фаулер Test-driven development

    — техника разработки ПО, которая определяет разработку через написание тестов.
  4. A little bit about TDD 5 Преимущества TDD • Продумывание

    интерфейса до реализации • Меньше отладки • Меньше ошибок • Уверенность при изменении • Документация тестами
  5. A little bit about TDD 6 Недостатки TDD • Больше

    времени на реализацию • Ложное ощущение надежности, ошибка в тесте • Поддержка тестов
  6. Isolated Test 8 –Кент Бек Если у нас один сломанный

    тест — то у нас только одна проблема. Если уже два сломанных теста — у нас две проблемы.
  7. Isolated Test 15 Просто забудьте для себя фразу - порядок

    выполнения тестов.
 Считайте для себя unit-тест как изолированную единицу.
  8. Test List • Разработчик не может помнить обо всем •

    А если и может, то делает это в ущерб самому себе
  9. Test List 20 • Cоставьте список тестов, которые вы хотели

    бы реализовать. • К каждому такому тесту накидайте себе черновик его реализации.
  10. Test List 21 Bad way Составили список тестов на бумажке

    
 и сразу же реализовали их пачкой.
  11. Test List 22 Good way Составили список тестов на бумажке

    
 и реализовали тесты по Red-Green-Refactor
  12. Test First 24 Пишите тесты до того, как вы напишете

    production код. Если вы скажете себе “Я сделаю это потом”, то не сделаете это, возможно, никогда.
  13. Test First 26 2. Создаем новый класс для теста и

    функцию, на которую мы пишем тест
  14. Test First 30 Summary • Наиболее качественный code-coverage • Отличная

    документация • Меньшее количество дефектов • Гораздо меньше времени на отладку
  15. Assert First 31 Попробуйте писать тесты начиная с assert/expect/should, то

    есть снизу-вверх. Такой подход будет сам подсказывать вам, что нужно сделать для того, чтобы тест прошел успешно.
  16. Assert First 33 Summary • Сразу обозначаем, чего мы ожидаем

    в результате • Проще находиться в контексте задачи
  17. Test Data 34 Используйте данные для тестов, которые будут понятны

    для того, кто будет читать ваши тесты и не вводить в заблуждение.
  18. Test Data 35 Bad way func test_whenValidateText_withLowercasedCharacters_thatValidatorReturnsNO() { // given

    let validator = TextValidator() // when let isTextUppercased = validator.isTextUppercased(textForValidation) // then XCTAssertFalse(isTextUppercased) } let textForValidation = "cocoaheads"
  19. Test Data 36 Bad way func test_whenValidateText_withLowercasedCharacters_thatValidatorReturnsNO() { // given

    let validator = TextValidator() // when let isTextUppercased = validator.isTextUppercased(textForValidation) // then XCTAssertFalse(isTextUppercased) } let textForValidation = "cocoaheads" - Почему конкретно эта строка? Почему не другая?
  20. Test Data 37 func test_whenValidateText_withLowercasedCharacters_thatValidatorReturnsNO() { // given let validator

    = TextValidator() // when let isTextUppercased = validator.isTextUppercased(textForValidation) // then XCTAssertFalse(isTextUppercased) } Good way let textForValidation = RandomTextFactory.word().lowercased()
  21. Test Data 38 func test_whenValidateText_withLowercasedCharacters_thatValidatorReturnsNO() { // given let validator

    = TextValidator() // when let isTextUppercased = validator.isTextUppercased(textForValidation) // then XCTAssertFalse(isTextUppercased) } Good way let textForValidation = RandomTextFactory.word().lowercased()
  22. Test Data 39 Summary • Чистые тесты • Понятный контекст

    тестовых данных • Мы ни на минуту не задумываемся о смысле данных
  23. Evident Data 40 Во время написания теста мы могли бы

    вычислить или рассчитать длинные значения, которые мы ожидаем как результат. Не делайте этого, это может запутать читателя в отношении бизнес-логики.
  24. Evident Data 41 Bad way // given let bank =

    Bank() bank.rate = Rate(fromCurrency: "USD", toCurrency: "GBP", rate: 2) bank.commission = 0.015 // when let result = bank.convert(Money(withCurrency: "GBP", amount: 100), toCurrency: "GBP") // then XCTAssertEqual(Money(withCurrency: "GBP", amount: 100/2*(1-0.015)), result)
  25. Evident Data 42 Bad way // given let bank =

    Bank() bank.rate = Rate(fromCurrency: "USD", toCurrency: "GBP", rate: 2) bank.commission = 0.015 // when let result = bank.convert(Money(withCurrency: "GBP", amount: 100), toCurrency: "GBP") // then XCTAssertEqual(Money(withCurrency: "GBP", amount: 100/2*(1-0.015)), result) - Почему именно так рассчитывается конвертация? - Уверены ли мы, что в реализации такой же алгоритм?
  26. Evident Data 43 Good way // given let bank =

    Bank() bank.rate = Rate(fromCurrency: "USD", toCurrency: "GBP", rate: 2) bank.commission = 0.015 // when let result = bank.convert(Money(withCurrency: "GBP", amount: 100), toCurrency: "GBP") // then XCTAssertEqual(Money(withCurrency: "GBP", amount: 49.25), result)
  27. Evident Data 44 Good way // given let bank =

    Bank() bank.rate = Rate(fromCurrency: "USD", toCurrency: "GBP", rate: 2) bank.commission = 0.015 // when let result = bank.convert(Money(withCurrency: "GBP", amount: 100), toCurrency: "GBP") // then XCTAssertEqual(Money(withCurrency: "GBP", amount: 49.25), result)
  28. Evident Data 45 Summary • Явность теста • Чистота бизнес-логики

    • Уменьшает боль при чтении тестов
  29. Conclusion 46 • Тесты не должны зависеть друг от друга

    • Составляйте список тестов, которые нужно реализовать • Пишите тесты до того, как вы напишете production код • Начните писать тесты с assert/expect/should проверок (снизу-вверх) • Используйте данные для тестов, которые не вводят в заблуждение • Предпочтите в своих тестах явные данные, нежели вычисляемые