Некоторые из моих модульных тестов не завершаются в XCode 4.4.

Я видел, как люди писали об этом здесь и в других местах, но я не нашел никакого работающего решения. Я использую XCode 4.4 и настроил кучу модульных тестов. Я запускал их все раньше в этом проекте, поэтому я знаю, что они проходят/не проходят, когда должны, если они действительно запущены.

У меня около 15 наборов тестов, и каждый содержит от 1 до 7 тестов. В большинстве попыток все наборы тестов были завершены (и пройдены), кроме 1 (FooTests). Он дает предупреждение:

FooTests did not finish
    testFoo did not finish

XCode сообщит, что тестирование прошло успешно, независимо от того, что происходит в незавершенных тестах. Еще одна вещь, которую следует отметить, иногда это другой тест, который не будет завершен, а иногда несколько наборов не будут завершены. Я не замечал случая, когда все тесты завершаются, но, судя по такому, казалось бы, случайному поведению, я считаю, что это возможно.

Итак, это ошибка в XCode? Я не могу придумать никакой другой причины, по которой тесты случайным образом не завершаются, а затем заставляют XCode сообщать, что все прошло успешно. Есть ли решения?


person Logan Serman    schedule 06.09.2012    source источник
comment
Нашли такую ​​же проблему. Очистка цели и запуск теста, похоже, решают проблему, когда она появляется. Я думаю, это ошибка.   -  person timthetoolman    schedule 07.09.2012
comment
Уборка мне не помогла :/   -  person Logan Serman    schedule 07.09.2012
comment
У меня тоже была эта проблема, но я обнаружил, что это происходит только тогда, когда я не запускаю все свои тесты одновременно. Если я отредактирую схему и сниму отметку с некоторых тестов, я в конечном итоге получу предупреждение о том, что это не завершено, хотя в противном случае я бы этого не сделал.   -  person Cruinh    schedule 18.01.2013


Ответы (7)


Я на XCode 4.5.2. Для модульного теста приложения, если ваши тестовые наборы заканчиваются так быстро, что основное приложение не загружается до этого, вы получите предупреждение. Вы можете просто избежать этой проблемы, добавив сон в конце теста, как показано ниже. Этого не происходит для теста логического блока.

 [NSThread sleepForTimeInterval:1.0];
person sonicfly    schedule 19.12.2012
comment
Я обнаружил, что вы действительно можете сделать это 0.0, и оно работает так же хорошо (и не замедляет ваши тесты). - person Tony Arnold; 29.01.2013
comment
В быстром наборе я все еще вижу это с 0.0. Я поместил этот код в свою функцию tearDown: - (void)tearDown { static int loaded = FALSE; if (!loaded) { [NSThread sleepForTimeInterval:1.0]; loaded = TRUE; } [super tearDown]; } - person AlexChaffee; 05.02.2013
comment
Только сегодня наткнулся на это, думал, что схожу с ума, лол, спасибо за объяснение! - person Zhang; 22.05.2013

У меня только что была эта проблема с XC4.5DP4.

У меня был тест, который выполняет некоторую работу в цикле и больше ничего не делает, когда выходит из цикла, и я получал ошибку «не закончил».

В попытке доказать, что тест завершается, я добавил это как самую последнюю строку:

NSLog(@"done");

Мало того, что «выполнено» печатается на выходе — теперь Xcode сообщает, что тест завершен.

Кажется, это обходной путь... пойди разберись.

person Sam Deane    schedule 12.09.2012
comment
Это надежно воспроизводится для меня - если я снова уберу строку журнала, Xcode вернется к тому, что не закончил. Ваш пробег, однако, может варьироваться... - person Sam Deane; 12.09.2012
comment
Это ничего не сделало для меня. Тест, который у меня не завершается, включает веб-запрос, и он может не ждать, пока запрос будет выполнен, чтобы запустить остальную часть теста. Но у меня есть другие тесты, использующие веб-запрос, которые отлично работают... - person Logan Serman; 12.09.2012
comment
Я тоже это вижу... странно. - person seanicus; 07.12.2012

Я использую XCode46-DP3 и только что решил эту проблему в своих тестах. У меня есть несколько тестов, которые запускают веб-сервер, а затем выполняют http-вызов; в конце теста веб-сервер останавливается. На прошлой неделе эти тесты стали выдавать предупреждение «не завершено». Для меня было достаточно добавить следующий сон в конце этих тестов (именно я добавил его в tearDown):

- (void)tearDown {
  [self.httpServer stop];
  [NSThread sleepForTimeInterval:1.0];
  self.httpServer = nil;
  self.urlComposer = nil;
}
person jean71    schedule 17.12.2012
comment
+1 за упоминание о том, что вы поместили его в tearDown. только один комментарий: разве вы не должны вызывать здесь [super tearDown]? - person martin jakubik; 28.03.2013

Проблема заключается в том, что ваши тесты завершаются слишком быстро, чтобы Xcode мог получить и проанализировать сообщения журнала, указывающие на неудачу или успех. Сон в течение 1 секунды в последнем прогоне тестового примера работал у меня надежно, а 0,0 - нет. Чтобы узнать, какой тестовый набор является последним, проверьте тестовое действие в диалоговом окне «Схема».

Я создал отдельный тестовый пример WorkaroundForTestsFinishingTooFast с одним методом:

- (void)testThatMakesSureWeDontFinishTooFast
{
    [NSThread sleepForTimeInterval:1.0];
}

Проблема в том, что по мере добавления дополнительных тестов вам придется убедиться, что этот тест является последним запущенным методом. Это означает удаление и добавление этого класса из действия «Тест», поскольку изменение порядка тестов не допускается. С другой стороны, вы задерживаете весь тестовый пакет всего на 1 секунду.

person Robert Gilliam    schedule 14.05.2013
comment
Я добавил задержку в tearDown, не беспокойтесь. - person meaning-matters; 23.07.2013

У меня были такие же предупреждения в Log Navigator. Я исправил это для меня.

В моем проекте у меня есть 2 схемы: одна для запуска проекта и одна для модульных тестов.

  1. Перейдите в Продукт --> Редактировать схему...
  2. Выберите схему UnitTest в средстве выбора схемы.
  3. Выберите значок «Тест» слева.
  4. Измените отладчик с LLDB на GDB и нажмите OK.
  5. Тесты должны закончиться сейчас. (у меня сработало нормально)
person Bodo    schedule 21.09.2012
comment
Это работало для меня в прошлом, но не работает в этом случае. - person Logan Serman; 21.09.2012

Для меня решение состояло в том, чтобы сократить выходные данные журнала из частей приложения, которые тестировались тестами. Я думаю, что xcode не смог вовремя проанализировать выходные данные тестов из-за другого вывода, который у меня был во всем приложении.

person bwhite    schedule 30.05.2013

У меня была такая же проблема с запуском XCode 4.6, причиной которой, в моем случае, было несоответствие между схемой и реальными юнит-тестами в тестовых костюмах. В схеме у меня были проверены некоторые костюмы, но в их .m-файле были закомментированы некоторые юнит-тесты.

Для решения проблемы: либо раскомментируйте тест, либо снимите выделение с файла/костюма в схеме и все снова станет зеленым :)

для таких людей, как я, которые забыли, как добраться до схемы, вот необходимые шаги:

  1. щелкните правой кнопкой мыши на названии проекта в разделе схемы (справа на кнопку остановки)
  2. выбрать схему редактирования
  3. выберите тестовую отладку
  4. щелкните треугольник рядом с проектом модульного теста, а рядом с каждым файлом у вас есть флажок
  5. снимите флажки с файлов, которые вы разместили в комментариях

надеюсь это поможет

person liv a    schedule 14.03.2013