The problem
Some tests need to be skipped when executing on CI (continuous integration like travis.org).
What tests? In my case, it's performance tests.
Why? because I can't trust all CI results and sometimes, randomly, some tests will fail without good reason, like this one:
error: testPerformance : failed: The relative standard deviation of the measurements is 11.061% which is higher than the max allowed of 10.000%.
This is due to actual, temporary machine load that affects results of performance measurements. Happens.
Solution
Active Compilation Conditions
a.k.a. SWIFT_ACTIVE_COMPILATION_CONDITIONS
a.k.a. conditional compilation flag.
"Active Compilation Conditions" is a new build setting for passing conditional compilation flags to the Swift compiler.
note for Objective-C programmers: it's -DMYFLAG
from OTHER_FLAGS
usage
#if MYFLAG
// do stuff
#endif
I named it CI
and added to my Travis build script. Since I'm using Swift Package Manager it's called like this
$ swift test -Xswiftc -DCI
Now, wherever I check for CI
I may distinguish if a test is run on continuous integration server.
#if !CI
extension FooTests {
func testPerformance() {
// ...
}
}
#endif
finally, enough adjust list of tests for Swift Package Manager to not try run tests not intended for CI
// ...
#if !CI
tests += [
("testPerformance", testPerformance),
]
#endif
// ...
tadaaam.
Sidenote about #if
Swift #if ... #endif directive behaves differently than the one known from C, and it has implications. See comments to this tweet
I'm disappointed that I can't use #if in the middle of code pic.twitter.com/HIknsFEOGL
— Marcin Krzyzanowski (@krzyzanowskim) October 10, 2016
thoughts?