2
votes

I'm developing a modular app with >30 modules, where each module has its own Unit test target. I also have a special test scheme which runs all Unit tests from all the targets.

The problem is - it's too slow. While the tests run fast, it takes a lot of time for Xcode to switch from one test target to another. The "all tests" scheme is supposed to be run in CI so I would really like to improve the performance.

I tried to convert all Unit test targets into static frameworks and link them to a new "merged" Unit test target. In this target I then created a single AllTests.swift file importing the frameworks and manually invoked tests on each of them. The performance improvement was ~4x.

However, this will be quite hard to maintain this file. My assumption is, since they are linked statically, there can be a way to make Xcode run imported in such a way tests automatically. If this works I'll be able to fully automate this process, keeping test targets for development and generating the "merged" target in CI.

What else I tried:

  • Investigated the option of using SourceKitten to parse the project and generate the AllTests.swift file automatically. This would require building the project one more time, eliminating the performance improvement.
  • Instead of linking frameworks, include references to source files into the merged target. This introduces a bunch of "multiple files with the same name" and "same declaration" errors that cannot be automatically resolved.
  • Made all declarations in the static frameworks public.
  • Googled a lot. This SO question is quite close but the solution doesn't work for me.

So the main question is - is there a way to make Xcode automatically include Unit tests that are part of a static framework the current target is linked against? Or any other suggestion on how I can automate this process will be very much appreciated.

it's too slow what does "too slow" mean? If this is in the magnitude of seconds, then should be no problem on CI. - Cristik
The "all tests" scheme runs in several minutes while the "merged" tests target runs in half a minute. The number of modules will grow so the performance will become worse. - askrav
That's odd, the difference should not be that big. Unless you have some scripts that create and destroy simulators for every target. - Cristik