SSL连接从命令行运行单元测试时出现问题

时间:2013-03-12 17:18:57

标签: ios xcode jenkins xcodebuild ocunit

目标

我们的目标是在持续集成环境(Jenkins

中执行单元测试

(我认为每个问题都必须说明一个人想要实现的目标。也许这个问题实际上可以通过一种非常不同的方式解决)

更新:更多关于“你为什么要这样做?”

首先,我们正在讨论具体的,自行开发的硬件。我希望持续集成测试告诉我是否有人在没有告诉所有开发人员的情况下改变了盒子的行为(是的,是的,我知道,这样的事情永远不会发生...)

其次,我们的一些(并非所有)连接使用默认无效的证书,因此我们有代码来检查证书的有效性(SecTrustEvaluate等)。当然,理想情况下,我们的测试也会测试该代码。但这似乎太多了。

第三:好吧,如果我能有真正的交易,我为什么要嘲笑? IDE没有问题,为什么命令行。

如果我想要可预测性,我会在所有测试中返回YES;)(我已经看到人们这样做了)。不,我想知道代码是否真正适用于我们的设备。这是某种变态的欲望吗?

到目前为止已解决的问题

从命令行运行测试听起来非常简单,但是

xcodebuild -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO clean test

导致一个丑陋的错误:

unsupported build action 'test'

所以我搜索了网页并在Running OCUnit Tests from Command Line上找到了这篇文章。

我遵循了所有步骤,我可以从命令行运行我的测试:

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

剩余问题

但是,现在对SSL服务器的任何NSURLConnection都将失败,因为“此服务器的证书无效。”。从命令行运行测试时,我听说过钥匙串问题,但这是真的吗?是否拒绝任何SSL连接?

重现

https://github.com/below/SSLTestDemo获取样本。打开它,使用Xcode自己的测试⌘U命令运行样本测试。测试应该成功。

现在在命令行上运行测试:

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

由于“此服务器的证书无效”,测试失败。错误。

任何指针?

  • 我做错了吗?
  • 这是一个真正的错误吗?
  • 如果是的话,有工作吗?

感谢任何输入!

2 个答案:

答案 0 :(得分:2)

好吧,当我们在Jenkins下测试时,我最终根本没有检查证书。

因为在您的应用程序中使用阻止此类检查的代码是危险的 - 毕竟,在您发布之前它可能不会被删除 - 您必须同时设置环境变量和编译器标志以激活它...

Post Scriptum:

Apple认为这是一个错误,rdar:// problem / 10406441

答案 1 :(得分:0)

即使在XCode(使用XCode 4.5)

中,我也遇到了SSL连接问题

我的解决方案是在我的单元测试的setUp中切换HTTPS证书检查:

- (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]];
}

我所做的调用的深奥格式是因为这是一个私有方法,它拒绝使用最新的工具链进行编译。由于这仅用于单元测试目标,因此不会影响生产代码,因此不会受到攻击,错误和Apple AppStore批准。因人而异。