[swift-users] XCTest from repl

Lou Zell lzell11 at gmail.com
Thu Aug 11 15:09:57 CDT 2016


Thanks Brian!

You pointed me in the right direction.  I've got a working version up here:
https://gist.github.com/lzell/3a4f43d00657a347363343c035e5db4c

Non-pretty version:

// Start repl with:
// $ xcrun swift -F
/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks

// Or run as script:
// $ xcrun swift -F
/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks
%


import Foundation

if
dlopen("/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks/XCTest.framework/Versions/A/XCTest",
RTLD_NOW) == nil {
  perror(dlerror())
}
if
dlopen("/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftXCTest.dylib",
RTLD_NOW) == nil {
  perror(dlerror())
}

import XCTest

class ATest : XCTestCase {
    func testIt() {
        XCTAssertTrue(false, "Now I see this!")
    }
    func testThat() {
        XCTAssertNil(nil, "Passes!")
    }
}

class BTest : XCTestCase {
  func testIt() {
    XCTAssertFalse(false, "whatever")
  }
  func testThat() {
    XCTAssertEqual(1, 0, "I fail too")
  }
}

// MARK: -
func selectors<T: XCTestCase>(forType type: T.Type) -> [Selector] {
  var selectors = [Selector]()
  var count : UInt32 = 0
  let methods = class_copyMethodList(type, &count)!
  for i in 0..<count {
    let method = methods.advanced(by: Int(i)).pointee!
    selectors.append(method_getName(method)!)
  }
  return selectors
}

func runTests(_ types: XCTestCase.Type...) {
  let suite = XCTestSuite(name: "Required")
  for t in types {
    let tests = selectors(forType: t).filter() {
String($0).hasPrefix("test") }
    tests.map(t.init)
         .forEach(suite.addTest)
  }
  suite.run()
}

runTests(ATest.self, BTest.self)


Lou

On Mon, Aug 8, 2016 at 10:05 PM, Brian Gesiak <modocache at gmail.com> wrote:

> Lou,
>
> Wow, this is awesome!! Excellent work.
>
> I have a few ideas as to why you’re not actually seeing any tests run:
>
>    1. swift-corelibs-xctest expects users to run tests via the XCTMain()
>    function
>    <https://github.com/apple/swift-corelibs-xctest/blob/96144ded862f402a742345b38f8324cf108f0398/Sources/XCTest/Public/XCTestMain.swift#L52>.
>    I’m not sure it’s appropriate for your use case, since the function calls
>    exit() directly (and thus has a return type of Never). If it does fits
>    your use case, I’d suggest using it, since all of swift-corelibs-xctest’s
>    regression tests assume this function is called.
>    2. swift-corelibs-xctest lacks the runtime reflection used by Apple
>    XCTest, and so requires users to list their test methods
>    <https://github.com/apple/swift-corelibs-xctest/blob/1f00ab2c677d9c226dea8fa3f541999d6f4405b6/Sources/XCTest/Private/XCTestCaseSuite.swift#L31>.
>    I think you may see the testIt() output by adding the following:
>
> class MyTest : XCTestCase { +    static var allTests = {+        return [+            ("testIt", testIt),+        ]+    }()
>     override func setUp() {
>
> Let me know if that works!
>
> - Brian Gesiak
>>
> On Mon, Aug 8, 2016 at 3:25 PM, Lou Zell via swift-users <
> swift-users at swift.org> wrote:
>
>> Greetings,
>>
>> I am close to getting XCTests running in the swift repl, but for some
>> reason my tests are never invoked.  Does anyone have a suggestion or see
>> something wrong with the test setup?
>>
>> $ xcrun swift -F /Applications/Xcode-beta.app/C
>> ontents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks
>>
>> import Foundation // If you're copy pasting, copy paste these individually!// If you get a null pointer back, use perror(dlerror()) to get a description of the errordlopen("/Applications/Xcode-beta.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks/XCTest.framework/Versions/A/XCTest", RTLD_NOW)dlopen("/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/libswiftXCTest.dylib", RTLD_NOW)import XCTest
>> class MyTest : XCTestCase {
>>     override func setUp() {
>>         super.setUp()
>>         print("Setting up")
>>     }    override func tearDown() {
>>         super.tearDown()                      print("Tearing down")
>>     }
>>     func testIt() {
>>         print("I'm never here")
>>         XCTAssertTrue(false, "I never see this!")
>>     } }
>>
>> let suite = XCTestSuite(name: "foo")suite.addTest(MyTest())suite.run()
>>
>> I see the "setting up" and "tearing down" output, but I never see the
>> print inside -testIt.  Any ideas?
>>
>> Thanks,
>> Lou
>>
>>
>> _______________________________________________
>> swift-users mailing list
>> swift-users at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-users
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20160811/75d11fab/attachment.html>


More information about the swift-users mailing list