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
Сбой теста из-за "Недопустимый сертификат для этого сервера". ошибка.
Любые указатели?
- Я делаю это неправильно?
- Это настоящая ошибка?
- Если да, есть ли рабочие?
Любой ввод оценивается!
Ответы
Ответ 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.