XCUITest с использованием шаблона Robot не может напечатать ошибочную строку

Я пытаюсь реорганизовать тест пользовательского интерфейса моего проекта, чтобы использовать шаблон робота. Но похоже, что он не может показать, какая строка в коде содержит ошибку. Вот скриншот:

Шаблон робота и оригинал

Как вы можете видеть здесь, testShowAppHealthAndBackWithoutRobot() может отображать ошибку в красной строке, а testShowAppHealthAndBack() — нет.

Вот код робота:

class Robot {
    let app: XCUIApplication

    init(app: XCUIApplication) {
        self.app = app
    }

    func tap(_ element: XCUIElement, timeout: TimeInterval = 5) {
        guard assertExists(element, timeout: timeout), element.isHittable else {
            XCTFail("Element: \(element) is not hittable!")
            return
        }
        element.tap()
    }

    func assertExists(_ element: XCUIElement, timeout: TimeInterval = 5) -> Bool {
        guard element.waitForExistence(timeout: timeout) else {
            XCTFail("Element: \(element) does not exist!")
            return false
        }
        return true
    }

    func assertExists(_ elements: [XCUIElement], timeout: TimeInterval = 5) {
        for _ in 0 ... Int(timeout) {
            if elements.filter({ $0.exists == false }).isEmpty {
                return
            }
            Thread.sleep(forTimeInterval: 1)
        }
        XCTFail("Elements: \(elements) do not exist!")
    }
}

class MainPageRobot: Robot {
    lazy var mainTitleText = app.staticTexts["My App"]
    lazy var appHealthButton = app.buttons["App Health"]

    func isInMainPageViewController() -> Self {
        _ = assertExists(mainTitleText)
        return self
    }
    func tapAppHealthButton() -> Self {
        tap(appHealthButton)
        return self
    }
}

class AppHealthRobot: Robot {
    lazy var navigationTitle = app.navigationBars["App Health"].staticTexts["App Health"]
    lazy var backButton = app.staticTexts["Red this shit up"]

    func isInAppHealthViewController() -> Self {
        assertExists(navigationTitle, line: line)
        return self
    }

    func tapBackButton() -> Self {
        tap(backButton)
        return self
    }
}

Итак, мой вопрос: как мне показать ошибочные строки в тестовых функциях, используя шаблон робота? Спасибо.


person Bawenang Rukmoko Pardian Putra    schedule 25.03.2020    source источник
comment
Это больше похоже на паттерн PageObject (ScreenObject) с служебными функциями.   -  person Roman Zakharov    schedule 25.03.2020
comment
Я взял за основу эту статью на Medium: medium.com/ Capital-One-Tech/ . Там сказано, что каждый экран будет иметь свой собственный класс Robot, который расширяет Robot. Эти специфичные для экрана роботы содержат действия, характерные для этого экрана.   -  person Bawenang Rukmoko Pardian Putra    schedule 26.03.2020


Ответы (1)


При добавлении служебных функций с вызовами XCTAssert (XCTFail) вы должны передавать аргументы file и line.

Это пример такого поведения.

func verify(something: Bool, file: StaticString = #file, line: UInt = #line) {
     XCTAssertTrue(something, file: file, line: line)
}

func testVerify() {
    verify(false) // This line would be marked as failed
}

person Roman Zakharov    schedule 25.03.2020