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.

SECON'2017, Мухаметов Андрей, XCTest. UI и Unit тестирование для iOS.

96 views

Published on

SECON'2017 | 21-22 апреля

Published in: Internet
  • D0WNL0AD FULL ▶ ▶ ▶ ▶ http://1lite.top/qWCjat ◀ ◀ ◀ ◀
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

SECON'2017, Мухаметов Андрей, XCTest. UI и Unit тестирование для iOS.

  1. 1. Нашу презентацию можно смотреть на телефоне
  2. 2. XCTest. UI и Unit тестирование для iOS АНДРЕЙ МУХАМЕТОВ, iOS DEVELOPER МАРИНА ПЕТРЕНКО, QA ENGINEER
  3. 3. Андрей Мухаметов iOS Developer, FunCorp a.m@fun.co Марина Петренко QA Engineer, FunCorp, PenzaQA petrenko.m@fun.co
  4. 4. О чем расскажем • О продукте: общее и iOS-частное • Unit tests • UI tests • Что, зачем и почему? • Выбор инструмента • XCTest • Проблемы и решения
  5. 5. iFunny :) • Разрабатывается с 2011 года • Развлекательное приложение 
 с мемами и для молодежи • ~3М пользователей в США и Бразилии • iOS, Android
  6. 6. Технические подробности iFunny на iOS • 99% кода на Objective-C • MVC — основное архитектурное решение • Cocoapods — для зависимостей • Есть внутренний pod • Свой проигрыватель webm-контента • Форк от SDWebImage • RestKit для API
  7. 7. UNIT TESTS
  8. 8. Что мы покрываем 
 юнит-тестами • Критичные моменты бизнес-логики • Workarounds • Правила наследования классов
  9. 9. Тесты бизнес-логики - (void)testIsNewFeaturedSetForContentArrayFalse { NSArray *newData = [self baseContentArray]; ds.currentSessionCID = @"0"; BOOL result = [ds isNewFeaturedSetForArray:newData]; XCTAssertFalse(result, @"cid check assert"); }
  10. 10. Правила наследования классов - (void)testAllAnalyticParametersClasses { NSArray *parameterClasses = [TestUtils classesForBaseClass: [AnalyticParameter class]]; for (Class class in parameterClasses) { AnalyticParameter *parameter = [class value:@"test"]; XCTAssertNotNil(parameter.key); XCTAssertNotNil(parameter.dictionary); } }
  11. 11. UI TESTS
  12. 12. UI Tests iOS. Why not? • Работа с UI • Тестовый flavor для задания первоначальных настроек • Моки для API • CI Bitrise и Amazon Device Farm
  13. 13. UI Tests. Profit • Уменьшить объем ручных проверок • Автоматизировать регресс • Continuous Testing
  14. 14. UI Tests iOS. Tools Cross-platform Native Cross-platform Open Source Apple Open Source, Xamarin Долгое ожидание новых версий OS Актуален всегда Последние поддерживаемые iOS 11 и Android O
  15. 15. Выбор в пользу XCTest • Native • Нет лишних зависимостей • Стандартные для iOS языки: Swift и Objective-C • Возможность использовать CI от Apple • Простое подключение к проекту • Использует приложение, как чёрный ящик • Возможность взаимодействия с системой
  16. 16. Recorder. Advantages • Генерирует код тестов • Создает лейблы в случае их отсутствия
  17. 17. Recorder. Disadvantages • Тормозит на запись • Пишет кривой код • Нет повторяемости при записи тестов • Ошибки в распознавании жестов
  18. 18. ПРОБЛЕМА 1
  19. 19. Проблема черного ящика • Environment variables • Arguments • Pre-action
  20. 20. Environment set app = [[XCUIApplication alloc] init]; app.launchEnvironment = @{testEnvironmentUserToken : @"", testEnvironmentDeviceID : @"", testEnvironmentCountry : @"" }; app.launchArguments = @[testArgumentNotClearStart];
  21. 21. Environment read NSProcessInfo *processInfo = [NSProcessInfo processInfo]; [TestAPIEnvHandler handleArguments:processInfo.arguments environment:processInfo.environment];
  22. 22. ПРОБЛЕМА 2
  23. 23. Свойства элементов • Спасибо Apple. Нет стандартного API для свойств • Альтернативы — Reveal • Accessibility API
  24. 24. Accessibility API • Code — accessibilityValue • Test — value
  25. 25. Наше решение • JSON-строка • Категории UIView наследников • GitHub?
  26. 26. ПРОБЛЕМА 3
  27. 27. UI Actions. XCUIElement - tap - doubleTap - twoFingerTap - tapWithNumberOfTaps:numberOfTouches: - pressForDuration: - pressForDuration:thenDragToElement: - swipeLeft/Right/Up/Down - pinchWithScale:velocity: - rotate:withVelocity:
  28. 28. ПРИМЕР
  29. 29. Launch Set Check Smile Check
 again Scroll
 &
 Enjoy :)
  30. 30. Результат - (void)testExample { XCUIElement *button = app.buttons[@"FeedSmile"]; [button tap]; NSDictionary *result = [FNTestAPIParametersParser decodeString:button.value]; CIColor *color = [CIColor colorWithString:result[testKeyTextColor]]; XCTAssertFalse(color.red - 1.f < FLT_EPSILON && color.green - 0.76f < FLT_EPSILON && color.blue - 0.29f < FLT_EPSILON, @"Color not valid"); XCUIElement *feed = app.scrollViews[@"FeedContentFeed"]; [feed swipeLeft]; [feed swipeLeft]; [feed swipeLeft]; }
  31. 31. На будущее • Увеличение скорости выполнения тестов • Моки для API • CI • Система отчетов
  32. 32. Выводы • Писать UI тесты для iOS можно и нужно • Придется изобретать велосипеды • Необходимо привлекать разработчиков • Рекордер можно использовать только в ознакомительных целях
  33. 33. Спасибо за внимание АНДРЕЙ МУХАМЕТОВ iOS DEVELOPER a.m@fun.co МАРИНА ПЕТРЕНКО QA ENGINEER petrenko.m@fun.co

×