Swiftpack.co - intere/UITestKit as Swift Package

Swiftpack.co is a collection of thousands of indexed Swift packages. Search packages.
See all packages published by intere.
intere/UITestKit 0.2.0
Programmatic UI Tests (not using the Apple UI Test Framework). XCTest-based tests.
⭐️ 11
🕓 1 year ago
iOS
.package(url: "https://github.com/intere/UITestKit.git", from: "0.2.0")

UITestKit

An iOS Library for UI Testing

Features

  • UI Testing from a vanilla XCTest target
    • Enable / Disable UI Animations
    • Take screenshots on test assertion failures
    • waitForCondition function to free up the UI thread and wait for your block condition to become true (or timeout and move on)
    • pauseForUIDebug() function to allow you to pause a (configurable) amount of time between steps in your tests
      • function becomes a no-op when shouldPauseUI is false (the default)
    • variables to get you the top view controller
  • Example App to demonstrate capabilities

Build Status Documentation Platform CocoaPods
CocoaPods CocoaPods

Why not use XCUITests?

  • UITestKit lets you interact with the application code directly from test code
    • Easier mocking of model objects
    • Easier invocation of ViewControllers
    • Lower level access to your application
  • UITestKit provides convenience variables for taking screenshots from failures
  • UITestKit can be far less rigid than XCUITests

Example

To run the example project, clone the repo, and run pod install from the Example directory first. Example Tests

Requirements

  • iOS 9.0 or higher

Installation

UITestKit is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'UITestKit'

Code Examples

/// Pre-test initialization
override func setUp() {
    super.setUp()
    // Don't show view transitions - this will help prevent timing related failures
    disableAnimations()
    // pause when pauseForUIDebug() is called
    shouldPauseUI = true
    // how long to pause for when pauseForUIDebug() is called
    pauseTimer = 0.3

    // Now do other setup tasks
}
/// Tests logging in to the application
func testLoginSuccess() {

    // Verify that we're at the Main VC or fail and take a screenshot
    XCTAssertTrue(waitForCondition({ self.mainVC != nil }, timeout: 3), topVCScreenshot)
    pauseForUIDebug()
    mainVC?.loadEmailLoginScreen()

    // Verify that we're at the Sign in VC or fail and take a screenshot
    XCTAssertTrue(waitForCondition({ self.signInVC != nil}, timeout: 1), topVCScreenshot)
    pauseForUIDebug()

    // Simulate typing email
    if let emailText = signInVC?.emailText {
        emailText.text = "[email protected]"
        pauseForUIDebug()
    }

    // simulate typing password
    if let passwordText = signInVC?.passwordText {
        passwordText.text = "UserPassword"
        pauseForUIDebug()
    }

    // log in
    signInVC?.login()

    // Verify that we've signed in successfully and are at the Welcome VC or fail and take a screenshot
    XCTAssertTrue(waitForCondition({ self.welcomeVC != nil}, timeout: 5), topVCScreenshot)
}

Best Practices

  • It is recommended to create a BaseUITest class that specializes UITestKitBase and provides convenience variables for your application's view controllers:
/// Gets you the `SquareTabVC` if it's the topVC
var squareTabVC: SquareTabVC? {
    return topVC as? SquareTabVC
}

/// Gets the `ShapesTableViewController`
var shapeTableVC: ShapesTableViewController? {
    return topVC as? ShapesTableViewController
}
  • It is recommend that you use the screenshot capability when checking for specific UI's to be visible or in a specific UI state:
XCTAssertTrue(waitForCondition({ self.shapeTableVC != nil }, timeout: 1), topVCScreenshot)

topVCScreenshot will produce failures like this:

Sample Test Failure with Screenshot

The Screenshot that is produced will look something like the following:

Author

Eric Internicola | Eric's Github Site

License

UITestKit is available under the MIT license. See the LICENSE file for more info.

GitHub

link
Stars: 11
Last commit: 1 year ago
Advertisement: IndiePitcher.com - Cold Email Software for Startups

Release Notes

0.2.0
1 year ago

Adds support for Swift Package Manager.

Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics