【问题标题】:UITesting, XCTest current ViewController ClassUITesting, XCTest 当前 ViewController 类
【发布时间】:2016-02-25 15:17:44
【问题描述】:

简单的问题。我得到了执行 segue 到下一个视图控制器的按钮。 我想编写 UI XCTest 来告诉我它是否打开了我想要的视图控制器。

【问题讨论】:

    标签: ios swift xctest xcode-ui-testing ui-testing


    【解决方案1】:

    UI 测试框架无法访问您的应用程序代码,这使得无法对实例进行类断言。您无法直接告诉屏幕上的控制器类。

    但是,如果您对测试的看法稍有不同,您可以做出非常相似的断言。 像用户一样编写测试。您的用户不在乎他/她是在看ItemDetailViewController 还是ItemListTableViewController,所以您的测试也不应该。

    用户关心屏幕上的内容。标题是什么?或者,这些按钮的名称是什么?按照该逻辑,您将根据这些项目而不是编码类的名称重写测试以断言。

    例如,如果您在导航堆栈中显示控制器,则可以声明标题。

    let app = XCUIApplication()
    app.buttons["View Item"].tap()
    
    XCTAssert(app.navigationBars["Some Item"].exists)
    

    或者,如果屏幕以模态方式呈现,但您知道一些静态文本或按钮,请使用这些。

    let app = XCUIApplication()
    app.buttons["View Item"].tap()
    
    XCTAssert(app.staticTexts["Item Detail"].exists)
    XCTAssert(app.buttons["Remove Item"].exists)
    

    【讨论】:

    • 在我的情况下,我必须在 app.buttons["View Item"].tap() 之前 sleep(1) 才能工作
    • 我觉得必须有更好的方法来做到这一点......如果你在应用程序中更改文本会发生什么?如果您在应用程序中对文本进行了多个本地化,会发生什么情况?如果它是本地化的,似乎需要进行大量测试,如果文本需要更改,则可能需要维护。
    • @MattGreen 然后您必须为此类标签/文本字段等分配可访问性标识符。然后就像 let button = app.buttons["accessId"], XCTAssertEqual(button.label, "EXPECTED LABEL ") 和/或 button.tap()
    • @JoeMasilotti 用你的方法,可以用 XCUITest 调用accessibilityCustomAction 吗?
    【解决方案2】:

    Matt Green 的评论给了我一个好主意。我们可以定义一个未使用的标签/按钮,最好是在基本视图控制器中,并为其分配一个可访问性标签,以执行查询以找出呈现的视图控制器。

    public class BaseViewController: UIViewController {
    
        let button = UIButton(frame: CGRect(x: 0, y: 0, width: 1, height: 1))
    
        public override func viewDidLoad() {
            super.viewDidLoad()
            if let identifier = self.theClassName.split(separator: ".").last {
                button.accessibilityIdentifier = String(identifier)
                view.addSubview(button)
            }
        }
    }
    
    public class DatePickerViewController: BaseViewController {
       ...
    }
    
    func testExample() {
        let app = XCUIApplication()
        app.launch()
        app.navigationBars.buttons["DateSelector"].tap()
        XCTAssertTrue(app.buttons["DatePickerViewController"].exists)
    }
    

    请注意,为了使这种方法有效,您必须添加用于识别视图控制器的视图,在这种情况下,应将按钮添加为子视图,并且必须具有非零帧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      相关资源
      最近更新 更多