Vincent Tourraine
Blog

Notes WWDC 2021 : Embrace Expected Failures in XCTest

#dev #Xcode

Mes notes pour la session Embrace Expected Failures in XCTest de la WWDC 2021.

Up until now, 2 solutions to handle known failures:

try XCTSkipUnless(UIDevice.current.userInterfaceIdiom == .pad, "Only supported on iPad")

New: XCTExpectFailure

Called at beginning of test. Test failures reported as expected failures, suite reported as passed.

Can embed URL:

XCTExpectFailure("<https://dev.myco.com/bugs/4923> myValidationFunction is returning false")

Stateful or scoped:

XCTExpectFailure("<https://dev.myco.com/bugs/4923> fix myValidationFunction") {
  XCTAssert(myValidationFunction())
}

Issue matching filters:

let options = XCTExpectedFailure.Options()
options.issueMatcher = { issue in
  return issue.type == .assertionFailure
}

XCTExpectFailure("<https://dev.myco.com/bugs/4923> fix myValidationFunction", options: options)
let options = XCTExpectedFailure.Options()
#if os(macOS)
options.isEnabled = false
#endif

XCTExpectFailure("<https://dev.myco.com/bugs/4923> fix myValidationFunction", options: options) {
  XCTAssert(myValidationFunction())
}

Tests that don’t always fail (deterministic or not), can specify as “non strict”:

XCTExpectFailure("<https://dev.myco.com/bugs/4923> fix myValidationFunction", strict: false) {
  XCTAssert(myValidationFunction())
}