Почему я должен использовать отдельную тестовую цель для запуска XCTests и как мне это сделать?

Я однажды задал вопрос, связанный с XCTests. И в одном из ответов мне сказали, что обычной практикой является использование отдельной тестовой цели (отличной от основного приложения) при выполнении модульных тестов (по крайней мере, в разработке iOS). Я попытался найти некоторые источники об этом, но я не мог

Я понимаю, что это, вероятно, лучшая практика, поэтому я бы очень хотел ее понять. Может ли кто-нибудь объяснить мне, почему это важно, какие выгоды я получаю от него и как мне это делать? Ссылки на некоторые статьи, объясняющие эту проблему, будут высоко оценены.

P.S. Я понимаю, что мне нужна специальная среда для тестов (фальшивая база данных в памяти, имитирующий сетевой уровень и т.д.), Но до сих пор мне удалось добиться этого без отдельного тестового хоста. Но я считаю, что может быть лучший способ.

Ответ 1

Чтобы ответить на ваши вопросы:

  • Почему важна отдельная тестовая цель?

Разделение проблем. Цель unit test не имеет такой же структуры, как и обычная целевая программа - она ​​содержит тестовый комплект, который ссылается на целевую аудиторию приложения, а также на классы тестов и любые вспомогательные классы. Это не дубликат целевого приложения с добавленным тестовым кодом - на самом деле он даже не должен содержать тестируемый код. Это означает, что вам не нужно прилагать особых усилий, чтобы синхронизировать тестовую цель с главной целью приложения - тот факт, что тестовый комплект загружает основное приложение, обрабатывает все, что для вас. (Вы прокомментировали ответ Ричарда Росса на ваш предыдущий q, предполагающий, что вы уже столкнулись с проблемами дублирования трудности).

  1. Как мне это сделать? (проверено на Xcode 7).

Предполагая, что вы хотите добавить цель в существующий проект, который не имеет каких-либо тестов, выберите основной проект и нажмите "+" под списком целей в проекте. Вы также можете использовать опцию File- > New- > Target. Вы увидите меню с просьбой выбрать шаблон для своей новой цели. Выберите "Тест", и в тесте выберите "Блок тестирования модулей iOS". Проверьте поля на следующем экране - они должны быть правильными по умолчанию - но вам может потребоваться дважды проверить значение поля "Целевое тестирование", если у вас много целей в проекте/рабочей области. Нажмите "ОК", и у вас должен быть функциональный пакет unit test, с примером теста, который вы сможете запустить с помощью Apple-U или Product- > Test. Вам все равно нужно #import классы приложений, используя ObjC.

Если вы создаете новый проект, все, что вам нужно сделать, это отметить флажок "Включить Unit Test" при создании проекта - никаких других шагов не требуется.

  • Apple Docs (со ссылками на соответствующие презентации WWDC)

  • Учебники. Большинство учебных пособий немного устарели. Но не так много изменилось, так что просто взгляните на документы и выясните это. Эти два ниже могут быть полезными, иначе просто Google. С быстрым взглядом большинство из них, похоже, полагают, что проект имел модульные тесты, настроенные в начале

http://www.raywenderlich.com/22590/beginning-automated-testing-with-xcode-part-12 (2012/iOS 6, но процесс по-прежнему в целом одинаковый). Также касается Jenkins, Git и работает тесты из CLI).

Тестирование модулей в OSX - последнее сообщение, не относящееся к iOS, я знаю, но более современное, чем большинство учебников iOS (октябрь 2015) и дает пошаговые инструкции (включая настройку unit test target в схемах построения, что, вероятно, не понадобится в вашем случае). Наверное, стоит взглянуть в любом случае.