Sencha 0.14.1

Sencha 0.14.1

测试已测试
Lang语言 SwiftSwift
许可协议 Apache-2.0
发布最新发布2019年11月
SPM支持SPM

Xavier JuradoFran AlvarezGil Serra维护。



Sencha 0.14.1

  • Schibsted Spain

Sencha logo

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"))

文本操作

⚠️如果需要触发文本输入的委托方法(否则可以使用下面的insertText),请使用此方法。此方法使用模拟器的键盘进行输入,根据文本可能失败。

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将读取它们。