XP.Party (iOS) - testable code & architecture

787 views
698 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
787
On SlideShare
0
From Embeds
0
Number of Embeds
185
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

×