3

I am using XCode 8 and XCTestCase. I created a class setUp function to be ran once before all tests, and the other setUp to be ran before each test case.

I want the application to be launched once before all test cases. If I use the launch in the class setUp, it never gets executed. If I use the launch in the setUp that is ran before each test, it does launch the test.

enter image description here

It prints:

IN CLASS SETUP

END CLASS SETUP

IN SETUP

IN TEST METHOD

But the application never gets launched. If I uncomment the line to launch the application in the second setUp, it will get launched.

How can I have the application be launched once before all the tests in my test class?

Titouan de Bailleul
  • 12,920
  • 11
  • 66
  • 121
reutsey
  • 1,743
  • 1
  • 17
  • 36

1 Answers1

3

I faced the same issue and solved it the following way

class MyTestCase: XCTestCase {

    static var app: XCUIApplication?

    override func setUp() {
        super.setUp()

        if MyTestCase.app == nil {
            MyTestCase.app = XCUIApplication()
            MyTestCase.app!.launch()
        }
    }

    // Tests...
}

This will only launch the application at the first time the setUp method is called.

Titouan de Bailleul
  • 12,920
  • 11
  • 66
  • 121
  • 2
    Thanks! This workaround does work for me. Still curious about why it doesn't work in the class function that apple provides for the overall setup though. But this will work until then! thanks much! – reutsey Jul 12 '17 at 16:21
  • I learnt that no interaction with XCUIApplication will work in class methods, I think this may be a limitation of the way Xcode UI tests work. – velapanur Nov 07 '18 at 20:02
  • 1
    This is really bad. Apple's XCUITest is basically not doing what it states it should allow: https://developer.apple.com/documentation/xctest/xctestcase/understanding_setup_and_teardown_for_test_methods – Charlie S Jun 06 '19 at 12:10