14

目标

我们的目标是在持续集成环境 ( 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

剩下的问题

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

重现

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

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

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

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

任何指针?

  • 我做错了吗?
  • 这是一个真正的错误吗?
  • 如果是这样,是否有解决方法?

任何输入表示赞赏!

4

2 回答 2

2

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

由于在您的应用程序中存在阻止此类检查的代码是很危险的——毕竟,它可能不会在你发布之前被删除——你必须同时设置一个环境变量和一个编译器标志来激活它……</p>

后文:

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

于 2013-03-15T21:23:26.173 回答
0

即使在 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]];
}

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

于 2013-08-21T02:32:59.060 回答