Lunch is helper of UI Test with Swift.
- Swift 4.0 or later
- iOS 9 or later
- Insert
github "fromkk/Lunch"
to yourCartfile
. - Run
carthage update
- Link your app with
Lunch.framework
inCarthage/Build
- Link your UI test target with
LunchTest.framework
inCarthage/Build
In App target adopt protocol Creatable
.
import Lunch
struct Creator: Creatable {
func create<T>(_ identifier: String, userInfo: [AnyHashable : Any]?) -> T? {
switch identifier {
case "LunchViewController":
return self.lunchViewController() as? T
default:
return nil
}
}
}
extension Creatable {
func lunchViewController() -> LunchViewController {
let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
return storyboard.instantiateInitialViewController() as! LunchViewController
}
}
// AppDelegate.swift
import Lunch
let creator = Creator()
let rootViewController: UIViewController
#if DEBUG
if let viewController: UIViewController = Launcher(with: creator).launch() {
rootViewController = viewController
} else {
rootViewController = creator.lunchViewController()
}
#else
rootViewController = creator.lunchViewController()
#endif
window?.rootViewController = rootViewController
NOTE: If you want change rootViewController after
Run
Xcode, setLAUNCH_VIEW_CONTROLLER
key and viewController name to value inEnvironment Variables
of your scheme.
In UI Test target.
1 Add component and adopt protocol PageObjectsRepresentable
.
import XCTest
import LunchTest
struct LunchViewControllerPage: PageObjectsRepresentable {
var app: XCUIApplication
init(app: XCUIApplication) {
self.app = app
}
var lunchLabel: XCUIElement {
return self.app.staticTexts["lunchLabel"]
}
}
2 Add your tests and adopt protocol ViewControllerTestable
import XCTest
import LunchTest
class LunchViewControllerTests: XCTestCase, ViewControllerTestable {
var viewControllerName: String {
return "LunchViewController"
}
override func setUp() {
super.setUp()
continueAfterFailure = false
}
func testLunchLabel() {
let launcher = Launcher(targetViewController: self)
let app = launcher.launch()
let page = LunchViewControllerPage(app: app)
XCTAssertTrue(page.lunchLabel.exists)
XCTAssertEqual(page.lunchLabel.label, "Lunch")
}
}