John Paul Ashenfelter
John Paul Ashenfelter

Reputation: 3143

How can I run XCTest for a swift application from the command line?

I want to test drive some Swift examples using XCTest from the command line if possible.

import XCTest

class LeapTest : XCTestCase {

    func testVanillaLeapYear() {
      let year = Year(calendarYear: 1996)
      XCTAssertTrue(year.isLeapYear);
    }
}

I'd love to run it from the command line.

I already set Xcode to use the developer tools in the beta:

sudo xcode-select -s /Applications/Xcode6-Beta.app/Contents/Developer/

If I naively try and run it it goes like this

$ xcrun swift LeapTest.swift
LeapTest.swift:1:8: error: cannot load underlying module for 'XCTest'
import XCTest
       ^

Any way to run it directly from the CLI? Or do I have to create a Xcode project?

Upvotes: 34

Views: 19025

Answers (2)

Adam Sharp
Adam Sharp

Reputation: 3668

I was able to get your XCTestCase compiling with the following command:

swiftc \
-F/Applications/Xcode6-Beta5.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks \
-Xlinker -rpath -Xlinker /Applications/Xcode6-Beta5.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks \
-lswiftCore LeapTest.swift \
-o LeapTests

Then you can execute the tests with xctest:

xcrun xctest LeapTests

And to break down those swiftc command line options:

  1. -F... adds XCTest.framework to the framework search paths, enabling it to be imported from Swift
  2. -Xlinker -rpath ... makes sure the XCTest shared library can be found at load time
  3. Without explicitly specifying -lswiftCore, I found that xctest would crash when it tried to run the test suite

Hope that helps!

Upvotes: 15

chourobin
chourobin

Reputation: 4124

I think the issue is you have your test.swift file under the main project's target membership. Make sure your swift test files belong to the Test target only.

Upvotes: 49

Related Questions