Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

XP.Party (iOS) - testable code & architecture

929 views

Published on

  • Be the first to comment

  • Be the first to like this

XP.Party (iOS) - testable code & architecture

  1. 1. Testable code & architectureИнженерные практики в iOS: Unit Tests
  2. 2. О нас● Виталий Ружников ○ iOS-фрилансер ○ Руководитель разработки мобильных проектов● Антон Катков ○ Тренер по инженерным практикам ○ Директор, руководитель проектов, iOS- разработчик
  3. 3. Что значит testable?● Testable - проверяемые (c) Google translate● Проверить можно что угодно● Проверять должно быть удобно
  4. 4. Если проверять не удобно, значит код не testable
  5. 5. Как достигается testability?● инженерные практики: ○ постоянный рефакторинг ○ применение паттернов проектирования ○ устранение применения антипаттернов проектирования ○ поиск и устранение запахов кода и тестов
  6. 6. ПримерДля чего нужны MVC, MVM, MVP и т.п?GUI Architectures by Martin Fowler
  7. 7. Пример 1: без DI@interface XPClassWithNoDI : NSObject { XPDataSource *_datasource; XPDelegate *_delegate; XPService *_service;}@end
  8. 8. Пример 1: без DI@implementation XPClassWithNoDI- (id)init { _delegate = // delegate initialization _datasource = // datasource initialization _service = // service initialization return self;}@end
  9. 9. Пример 1: вопрос● Как протестировать класс XPClassWithNoDI?
  10. 10. Пример 1: c DI@interface XPClassWithDI : NSObject { XPDataSource *_datasource; XPDelegate *_delegate; XPService *_service;}- (id)initWithDelegate:(XPDelegate *)delegate datasource:(XPDataSource *)datasource service:(XPService *)service;@end
  11. 11. Пример 1: c DI@implementation XPClassWithDI- (id)initWithDelegate:(XPDelegate *)delegate datasource:(XPDataSource *)datasource service:(XPService *)service { _delegate = delegate; _datasource = datasource; _service = service; return self;}@end
  12. 12. Пример 1: выводы● Возможно переиспользование кода● Удобно покрывать тестами за счёт мокирования● Легче изменяется логика поведения● Класс более понятен без погружения в код● Незначительно увеличилась сложность написанияИсходный код здесь:https://github.com/xp-party/ios-testability
  13. 13. Пример 2: функция с многимиаргументами- (void)doSomethingWithObj1:(id)obj1 obj2:(id)obj2 fromDate:(NSDate *)fromDate toDate:(NSDate *)toDate forString1:(NSString *)string1 byString2:(NSString *)string2;
  14. 14. Практика 1: нетестируемый кодИсходники:https://github.com/xp-party/teamgame-iosBranch: original_code_to_testЗадача:Написать тесты на метод:- (void)consumeMessage:(NSDictionary *)message;
  15. 15. Практика 2: тестируемый кодИсходники:https://github.com/xp-party/teamgame-iosBranch: refactored_code_to_testЗадача:Написать тесты на метод:- (void)consumeMessage:(NSDictionary *)message;
  16. 16. Выводы● Надо знать паттерны● Необходимо использовать рефакторинг в полной мере● Нужно стремитесь к "Чистому Коду"● Используйте TDD :)
  17. 17. Контакты● Виталий Ружников ○ varuzhnikov@gmail.com ○ Twitter: @ruzhnikov ○ Skype: viruzh● Антон Катков ○ katkov.anton@gmail.com ○ Twitter: @Vanger_cat ○ Skype: anton.katkov

×