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

Ios 从命令行运行单元测试时出现SSL连接问题 目标,ios,xcode,jenkins,xcodebuild,ocunit,Ios,Xcode,Jenkins,Xcodebuild,Ocunit,我们的目标是在持续集成环境中执行单元测试() (我认为,每个问题都必须明确说明自己想要达到的目标。也许这个问题实际上可以用一种完全不同的方式来解决) 更新:更多关于“你为什么要这样做?” 首先,我们谈论的是特定的、自主开发的硬件。我希望持续集成测试能够告诉我是否有人在没有告诉所有开发人员的情况下改变了box的行为(是的,是的,我知道,这样的事情永远不会发生…) 其次,我们的一些(并非所有)连接使用默认情况下无效的证书,因此我们有代码来检查证书的有效性(SecTrustEvaluate等)。当然,

我们的目标是在持续集成环境中执行单元测试()

(我认为,每个问题都必须明确说明自己想要达到的目标。也许这个问题实际上可以用一种完全不同的方式来解决)

更新:更多关于“你为什么要这样做?” 首先,我们谈论的是特定的、自主开发的硬件。我希望持续集成测试能够告诉我是否有人在没有告诉所有开发人员的情况下改变了box的行为(是的,是的,我知道,这样的事情永远不会发生…)

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

第三:如果我能得到真正的交易,我为什么要嘲笑任何事情?IDE对此没有问题,为什么命令行应该这样做呢

如果我想要可预测性,我会在所有测试中返回
YES
)(我也见过有人这样做)。不,我想知道这些代码是否真的和我们的设备一起工作。那是某种变态的欲望吗

到目前为止问题已经解决 从命令行运行测试听起来很难,但是

xcodebuild -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO clean test
导致一个丑陋的错误:

unsupported build action 'test'
所以我在网上搜索并在上找到了这篇文章

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

xcodebuild -scheme CITests -sdk iphonesimulator TEST_AFTER_BUILD=YES ONLY_ACTIVE_ARCH=NO clean build
遗留问题 但是,现在任何到SSL服务器的NSURL连接都将失败,因为“此服务器的证书无效”。我听说在从命令行运行测试时会出现密钥链问题,但这是真的吗?是否拒绝任何SSL连接

复制 在……处取样品。打开它,并使用Xcode自己的测试运行示例测试⌘U命令。测试应该成功

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

xcodebuild -scheme CITests -sdk iphonesimulator TEST_AFTER_BUILD=YES ONLY_ACTIVE_ARCH=NO clean build
由于“此服务器的证书无效”,测试失败。错误

有什么建议吗?
  • 我做错了吗
  • 这是一个真正的错误吗
  • 如果有,是否有变通办法

欢迎您的任何意见

好吧,当我们在詹金斯手下测试时,我只是没有检查证书

因为在你的应用程序中有阻止这种检查的代码是危险的——毕竟,在你发布之前它可能不会被删除——你必须设置一个环境变量和一个编译器标志来激活它

后脚本:


苹果认为这是一个bug,rdar://problem/10406441

即使在XCode(使用XCode 4.5)中,我也有SSL连接问题

我的解决方案是在我的单元测试设置中切换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]];
}
-(无效)设置
{
//在这里设置代码。
[超级设置];
NSURL*URL=[NSURL URLWithString:];
[NSURLRequest.class性能选择器:NSSelectorFromString(@“SetAllowsAnyHttpScCertificate:forHost:”)
withObject:NSNull.null//只需在此处传递non-nil以显示为BOOL YES,使用NSNull.null单例是非常安全的
withObject:[URL主机]];
}

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

Mh为什么要使用网络连接进行单元测试?通常情况下,为了获得更可预测的结果,你会模仿这些东西,并消除外部依赖。请参阅我上面的附录,以回答你的问题,“当你可以拥有真实的东西时,为什么要模仿”:你想消除变量。如果您在单元测试中实际连接到设备,那么测试失败可能是由除代码提交之外的任何其他原因造成的。例如,设备已通电,未连接到网络。不是说这些测试没有价值,但它们不是单元测试。这些是集成测试,这就是我们正在尝试做的。当作为单元测试运行时,您可能会遇到SSL主机检查问题。请参阅,您可以使用类扩展来允许从测试内部访问该方法。有关示例,请参见我之前的评论。