SSL-соединения Проблемы при запуске Unit Tests из командной строки - программирование
Подтвердить что ты не робот

SSL-соединения Проблемы при запуске Unit Tests из командной строки

Цель

Наша цель - выполнить наши модульные тесты в среде непрерывной интеграции (Jenkins)

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

Обновление: больше: "Почему вы хотите это сделать?"

Во-первых, мы говорим об определенном, саморазвивающемся оборудовании. И я хотел бы, чтобы Тест непрерывной интеграции рассказывал мне, изменил ли кто-либо поведение поля, не сообщив всем разработчикам (да, да, я знаю, таких вещей никогда не бывает...)

Во-вторых, некоторые (не все) из наших соединений используют сертификаты, которые по умолчанию недействительны, поэтому у нас есть код для проверки действительности сертификата (SecTrustEvaluate и т.д.). В идеале, конечно, наши тесты также проверили бы этот код. Но это кажется слишком большим спросом.

В-третьих: Ну, почему я должен что-то издеваться над чем-нибудь, если у меня будет реальная сделка? У IDE нет проблем с этим, зачем нужна командная строка.

И если бы я хотел предсказуемости, я бы вернул YES во все мои тесты;) (и я видел, как это делают люди). Нет, я хочу знать, действительно ли код действительно работает с нашим устройством. Это какое-то извращенное желание?

Проблема решена до сих пор

Запуск тестов из командной строки звучит довольно странно, но

xcodebuild -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO clean test

приводит к уродливой ошибке:

unsupported build action 'test'

Итак, я искал в Интернете и нашел эту статью на Выполнение тестов OCUnit из командной строки.

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

xcodebuild -scheme CITests -sdk iphonesimulator TEST_AFTER_BUILD=YES ONLY_ACTIVE_ARCH=NO clean build

Оставшаяся проблема

Однако теперь любое NSURLConnection на SSL-сервер завершится неудачно, потому что "сертификат для этого сервера недействителен". Я слышал о проблемах с цепочкой ключей при запуске тестов из командной строки, но может ли это быть правдой? Любое SSL-соединение будет отклонено?

Воспроизведение

Получить образец в https://github.com/below/SSLTestDemo. Откройте его и запустите образец теста, используя собственную команду Test ⌘U Xcode. Тест должен быть успешным.

Теперь запустите тест в командной строке:

xcodebuild -scheme CITests -sdk iphonesimulator TEST_AFTER_BUILD=YES ONLY_ACTIVE_ARCH=NO clean build

Сбой теста из-за "Недопустимый сертификат для этого сервера". ошибка.

Любые указатели?

  • Я делаю это неправильно?
  • Это настоящая ошибка?
  • Если да, есть ли рабочие?

Любой ввод оценивается!

4b9b3361

Ответ 1

Ну, я просто не проверял сертификаты, когда мы тестируем Jenkins.

Как опасно иметь код, который предотвращает такую ​​проверку в вашем приложении - в конце концов, он просто не удаляется перед отправкой - вам нужно установить как переменную среды, так и флаг компилятора, чтобы активировать ее...

Post Scriptum:

Apple считает это ошибкой, rdar://problem/10406441

Ответ 2

У меня проблемы с подключением SSL даже в XCode (с XCode 4.5)

Мое решение состояло в том, чтобы переключить проверку сертификата HTTPS внутри setUp моих модульных тестов:

- (void)setUp
{
    // Set-up code here.
    [super setUp];

    NSURL *URL = [NSURL URLWithString:<#Your SSL Address#>];

    [NSURLRequest.class performSelector:NSSelectorFromString(@"setAllowsAnyHTTPSCertificate:forHost:")
                             withObject:NSNull.null  // Just need to pass non-nil here to appear as a BOOL YES, using the NSNull.null singleton is pretty safe
                             withObject:[URL host]];
}

Эзотерический формат вызова, который я делаю, заключается в том, что это частный метод, который отказывается компилировать с помощью последней инструментальной цепочки. Поскольку это используется только в Unit Test цели, это не повлияет на производственный код и поэтому безопасно от атак, ошибок и одобрения Apple AppStore. YMMV.