【发布时间】:2016-02-25 15:17:44
【问题描述】:
简单的问题。我得到了执行 segue 到下一个视图控制器的按钮。 我想编写 UI XCTest 来告诉我它是否打开了我想要的视图控制器。
【问题讨论】:
标签: ios swift xctest xcode-ui-testing ui-testing
简单的问题。我得到了执行 segue 到下一个视图控制器的按钮。 我想编写 UI XCTest 来告诉我它是否打开了我想要的视图控制器。
【问题讨论】:
标签: ios swift xctest xcode-ui-testing ui-testing
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) 才能工作
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)
}
请注意,为了使这种方法有效,您必须添加用于识别视图控制器的视图,在这种情况下,应将按钮添加为子视图,并且必须具有非零帧。
【讨论】: