EarlGrey 是一款通过仪器测试测试我们的iOS应用的优秀工具。使用它,我们可以模拟用户操作,如点击按钮、滚动或输入。然后,我们可以断言屏幕上出现文本、视图可见或不可见或按钮启用或未启用。
另一方面,如果你尝试了EarlGrey,你会同意它的API不可发现或友好。
Sencha为EarlGrey特性引入了可发现API。因此,你和你所有的iOS团队将轻松编写仪器测试。
使用Sencha(通过EarlGrey)与其他UI测试库相比的优点
- 来自EarlGrey的README文件
EarlGrey的同步功能有助于确保在执行操作之前UI处于稳定状态。这大大增加了测试的稳定性并将其变得高度可重复。
-
多亏了EarlGrey匹配器的严格行为,你可能会在应用程序的UI代码中找到一些保留周期。例如:如果应用程序正在泄漏一个正在测试的视图,当在内存中找到多于一个相同视图的实例时,EarlGrey会立即抛出一个“多个元素找到”异常(
kGREYMultipleElementsFoundException
)。 -
与Apple自己的XCUITest框架不同,您将能够与应用程序的代码进行交互,以便伪造/存根任何依赖项。
安装
Cocoapods
EarlGrey的安装说明非常不寻常。它们要求您安装一个gem,该gem会修改您的本地cocoapods gem(!)以在每个系统中的每次调用pod install
时执行某些更改。
我们发现在安装Sencha(及其依赖的EarlGrey)时并不需要这样做,因此,你只需创建一个单元测试目标,并将以下行添加到新目标的依赖中你的Podfile中
pod 'Sencha'
这就完成了!
Sencha的断言
对于常规UI中的元素
assertVisible(.text("EmptyStateText"))
assertVisible(.accessibilityID("EmptyStateID"))
assertVisible(.class(UIActivityIndicator.class))
assertNotVisible(.text("EmptyStateText"))
注意:之前的断言对于ScrollView中的元素不起作用,您将需要下一部分中的断言。
对于ScrollView(也适用于TableView & CollectionView)内的元素
assertVisible(.text("EmptyStateText"), inScrollableElementWith: .accessibilityID("TableViewID"))
assertVisible(.text("EmptyStateText"), inScrollableElementWith: .accessibilityID("RegularScrollViewID"))
assertNotVisible(.text("EmptyStateText"), inScrollableElementWith: .accessibilityID("TableViewID"))
验证TableView的内容
assert(tableViewWith: .accessibilityID("TableViewID"), hasRowCount: 30)
assert(tableViewWith: .accessibilityID("TableViewID"), hasRowCount: 30, inSection: 1)
assert(tableViewWith: .accessibilityID("TableViewID"), hasSectionCount: 2)
assertTableViewIsEmpty(with: .accessibilityID("TableViewID"))
assertTableViewIsNotEmpty(with: .accessibilityID("TableViewID"))
验证CollectionView的内容
assert(collectionViewWith: .accessibilityID("CollectionViewID"), hasCellCount: 30)
assert(collectionViewWith: .accessibilityID("CollectionViewID"), hasCellCount: 30, inSection: 1)
assert(collectionViewWith: .accessibilityID("CollectionViewID"), hasSectionCount: 2)
assertCollectionViewIsEmpty(with: .accessibilityID("CollectionViewID"))
assertCollectionViewIsNotEmpty(with: .accessibilityID("CollectionViewID"))
验证开关状态
assertSwitchIsOn(.accessibilityID("SwitchID"))
assertSwitchIsOff(.accessibilityID("SwitchID"))
验证滑块值
assertSlider(.accessibilityID("SliderID"), hasValue: .equalTo(0.5))
assertSlider(.accessibilityID("SliderID"), hasValue: .greaterThan(0.0))
assertSlider(.accessibilityID("SliderID"), hasValue: .lessThan(1.0))
验证选择值
assertPicker(.accessibilityID("pickerID"), hasValue: Date())
assertPicker(.accessibilityID("pickerID"), hasValue: "10", inColumn: 1)
Sencha操作
您还可以使用操作来移动内容的可见位置,请注意,这些不是断言,因此,它们不属于测试,而是只是对UI状态的修改。
点击
tap(.accessibilityID("AnythingTappableID"))
tap(.text("ButtonTitle"))
tap(.text("CellTitle"), inScrollableElementWith: .accessibilityID("TableViewID"))
//Tapping the back button contained in a UINavigationBar when using push navigation mode
tapBackButton()
滚动
scrollTo(.accessibilityID("AnythingTappableID"), inElementWith: .accessibilityID("TableViewID"))
scrollToBottom(in: .accessibilityID("TableViewID"))
scrollToTop(in: .accessibilityID("TableViewID"))
scrollToLeft(in: .accessibilityID("TableViewID"))
scrollToRight(in: .accessibilityID("TableViewID"))
文本操作
type("Username", inElementWith: .accessibilityID("UsernameTextFieldID"))
insertText("Username", inElementWith: .accessibilityID("UsernameTextFieldID"))
clearTextInElement(.accessibilityID("UsernameTextFieldID"))
与键盘交互
tapKeyboardReturnKey()
与滑块交互
moveSlider(.accessibilityID("SliderID"), to: 0.5)
与选择器交互
movePicker(.accessibilityID("PickerID"), to: Date())
movePicker(.accessibilityID("PickerID"), column: 1, to: "10")
Sencha的匹配器
为了查找界面元素并在它们上执行操作,我们需要一些匹配器。在其他库中,这是通过通过视图的 accessibilityLabel 属性找到一个元素来实现的,但这个属性是为VoiceOver设计的,不应该用于测试。或者,是的,这完全取决于您,但至少您可以选择:)
最重要的匹配器是
Matcher.text(String)
Matcher.accessibilityID(String)
Matcher.accessibilityLabel(String)
Matcher.class(AnyClass)
不建议使用 .accessibilityLabel(String) 匹配器。当使用VoiceOver时,它可能干扰用户体验,即;如果您放置内部元素标识符,VoiceOver将读取它们。