35
Unit-тестирование мобильных приложений на примере платформы iOS Роман Петров, технический директор Omega-R

Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Embed Size (px)

Citation preview

Page 1: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Unit-тестирование мобильных приложений

на примере платформы iOS

Роман Петров, технический директор Omega-R

Page 2: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Зачем писать юнит-тесты?

Page 3: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Зачем писать юнит-тесты?● Быть уверенным в том, что ваш код работает как надо.● Продолжать быть уверенным в этом после внесения изменений

(защита от регрессии).● Сокращать время ручного тестирования (как программистов, так и

тестировщиков).● Эффективно использовать системы непрерывной интеграции (без

авто-тестов смысла в них становится меньше).● Повышать ЧСВ: «Я могу в юнит-тесты!»

Page 4: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Почему многие не пишут юнит-тесты?

Page 5: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

«Тут ломаться нечему!»

Page 6: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

«Я же крутой, я и без тестов правильно напишу!»

Page 7: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

«Чукча не читатель, чукча писатель!»

Page 8: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

«Как на ЭТО вообще можно тесты написать?»

Page 9: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Немного теории

Page 10: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Немного теории● Юнит-тесты — они же модульные тесты.● Минимальный модуль в ООП — класс.● Тестируем каждую нетривиальную функцию.● Пишем более комплексные тесты на взаимосвязанные функции.● Пишем как положительные, так и отрицательные тесты.● Аксиома: НИКОГДА не верь входным данным, даже если данные дает

твой собственный код.● В сферическом приложении в вакууме все функции являются

«чистыми», а классы — абсолютно изолированы.● Реальность кусается.

Page 11: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Средства тестирования на мобильных платформах

Page 12: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

iOSXCTest — родное средство для юнит-тестов, умеет все: собственно юнит-тесты, тесты асинхронных процессов, замеры производительности, тестирование UI.

OCMock — средство для создания mock-объектов (полноценно работает только с Objective-C).

KIF Framework — более удобное средство для автоматизации тестирования UI.

Page 13: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

AndroidJUnit — стандартный фреймворк для написания юнит-тестов на Java, тесты запускаются в виртуальной машине Java на компьютере.

Espresso — фреймворк для тестирования UI (входит в Android Testing Support Library).

AndroidJUnitTestRunner — средство для запуска JUnit-тестов на реальных устройствах и симуляторе.

Page 14: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Windows PhoneВ среде MS Visual Studio есть все необходимые инструменты как для модульного тестирования, так и для интерфейсного тестирования.

Page 15: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Что надо тестировать?

Page 16: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

В идеале

ВСЁ

Page 17: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

В реальностиРасставим приоритеты:

● Весь код модели (в паттерне MVC).● Работа с API (как со своим, так и с чужим).● Use cases (без UI).● Производительность критических участков.

Page 18: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Перестаем бояться тестов и начинаем их писать

Page 19: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Тестируем факториалХороший Плохой

Page 20: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Тестируем факториалВсе хорошо

Почти все плохо

Page 21: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Измеряем производительность

Page 22: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Измеряем производительность

Page 23: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Более практические примеры

Page 24: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Тест работы с API: делаем это правильноНеобходимо разорвать зависимость (если она есть) и определить протокол. В Objective-C можно использовать OCMock, но лучше и в нем использовать протоколы.

Page 25: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Тест работы с API: делаем это правильно

Page 26: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Тестируем работу с CoreDataНе включаем классы сущностей в тестовый таргет и импортируем модуль приложения в классе теста. Классы сущностей надо будет сделать публичными.

Page 27: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Тестируем работу с CoreData

Page 28: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Тест на вызов метода делегатаВ OCMock есть готовое средство для таких тестов, но работает это, опять же, только в Objective-C. Поэтому на Swift пишем сами.

Page 29: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Тест на вызов метода делегата

Page 30: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Общие методы в нескольких наборах тестов

Page 31: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Очевидно, но не очень правильно

Наследование приводит к появлению лишнего пустого набора тестов

Page 32: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

ПравильноРасширение класса

Протокол с реализацией по умолчанию

Пример использования

Page 33: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Как улучшать архитектуру, чтобы тесты писались легче (и вообще писались)

Page 34: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Улучшаем архитектуру● Чистые функции и чистые классы● Разрыв зависимостей● Один класс — одна задача (single responsibility)● Применяем паттерны проектирования

Page 35: Роман Петров - юнит-тестирование мобильных приложений на примере платформы iOS

Благодарю за внимание!А теперь время для вопросов