Our goal is to execute our Unit Tests within a Continuous Integration environment (Jenkins)
(I believe it is essential for every question to state what exactly one is trying to achieve. Maybe the problem can actually be solved a very different way)
Firstly, we are talking to specific, self-developed hardware. And I would like the Continuous Integration Test to tell me if anyone changed the behavior of the box without telling all the developers (Yes, yes, I know, such things never happen …)
Secondly, some (not all) of our connections use certificates which are not valid by default, so we have code to check the validity of the certificate (SecTrustEvaluate
etc.). Ideally of course, our tests would test that code, too. But that seems too much to ask.
Thirdly: Well, why should I mock anything if I can have the real deal? The IDE has no issue with that, why should the command line.
And if I wanted predictability, I'd return YES
in all my tests ;) (and I have seen people do that). No, I want to know if the code actually and really works with our device. Is that some sort of perverted desire?
Running tests from the command line sounds pretty straighforward, but
xcodebuild -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO clean test
results in an ugly error:
unsupported build action 'test'
So I searched the web and found this article on Running OCUnit Tests from Command Line.
I followed all the steps, and I can run my tests from the command line like this:
xcodebuild -scheme CITests -sdk iphonesimulator TEST_AFTER_BUILD=YES ONLY_ACTIVE_ARCH=NO clean build
However, now any NSURLConnection to an SSL Server will fail, because "The certificate for this server is invalid.". I have heared about keychain issues when running tests from the command line, but can this be true? Any SSL connection is refused?
Get the sample at https://github.com/below/SSLTestDemo. Open it up, and run the sample test using Xcode's own Test ⌘U command. The test should succeed.
Now run the test on the command line:
xcodebuild -scheme CITests -sdk iphonesimulator TEST_AFTER_BUILD=YES ONLY_ACTIVE_ARCH=NO clean build
The test fails due to the "The certificate for this server is invalid." error.
Any input is appreciated!
In the command line, enter openssl s_client -connect <hostname> : <port> . This opens an SSL connection to the specified hostname and port and prints the SSL certificate. Check the availability of the domain from the connection results.
The --all flag will run all tests.
Well, I ended up simply not checking certificates when we are testing under Jenkins.
As it is dangerous to have code which prevents such checking in your app — after all, it just might not get removed before you ship — you have to set both an environment variable and a compiler flag to activate it …
Post Scriptum:
Apple considers this a bug, rdar://problem/10406441
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With