XCTest: Parameterized test suite has `nil` value during retries

53 Views Asked by At

Below is my simple test class. As you can see, I am using defaultTestSuite to create parameterized test methods. I am failing the test on purpose when value is 2. The problem I am facing is that, I have configured test plan to retry the tests on failure. So, when test 2 fails, XCode retries it and it's failing because self.number is nil.

Question: How can I re-run the parameterized test without variables having nil values?

import XCTest

final class HelloiOSUITests: XCTestCase {
    var number: Int?
    
    override func setUpWithError() throws {
        continueAfterFailure = false
    }

    func testExample() throws {
        guard let num = self.number else {
            XCTFail("Failed with NPE")
            throw NSError()
        }
        print("Running for number: \(num)")
        if num == 2 {
            XCTFail("Failing on purpose to demonstrate NPE issue.")
        }
    }
    
    override class var defaultTestSuite: XCTestSuite {
        get {
            let suite = XCTestSuite(name: NSStringFromClass(self))
            addTestCase(to: suite, value: 1)
            addTestCase(to: suite, value: 2)
            addTestCase(to: suite, value: 3)
            print("Test method count = \(suite.testCaseCount)")
            return suite
        }
    }
    
    static func addTestCase(to suite: XCTestSuite, value: Int) {
        for invocation in self.testInvocations {
            let testMethod = HelloiOSUITests(invocation: invocation)
            testMethod.number = value
            suite.addTest(testMethod)
        }
    }
}
1

There are 1 best solutions below

0
On

Please try using :

import XCTest

final class HelloiOSUITests: XCTestCase {
let numbers = [1, 2, 3]

override func setUpWithError() throws {
    continueAfterFailure = false
}

func testExample() throws {
    guard let num = self.number else {
        XCTFail("Failed with NPE")
        return
    }
    print("Running for number: \(num)")
    if num == 2 {
        XCTFail("Failing on purpose to demonstrate NPE issue.")
    }
}

override class var defaultTestSuite: XCTestSuite {
    let suite = XCTestSuite(name: NSStringFromClass(self))
    for value in numbers {
        addTestCase(to: suite, value: value)
    }
    print("Test method count = \(suite.testCaseCount)")
    return suite
}

static func addTestCase(to suite: XCTestSuite, value: Int) {
    let test = HelloiOSUITests()
    test.number = value
    suite.addTest(test)
  }
}