XP.Party (iOS) - testable code & architecture

  • 535 views
Uploaded on

 

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
535
On Slideshare
0
From Embeds
0
Number of Embeds
2

Actions

Shares
Downloads
1
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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