您可能会问如何从UI测试访问应用程序状态,或者只是在一般的UI测试中。
我认为这是一个非常有趣的问题,所以我会回答,因为这是我不了解的很多东西,并希望会提示其他人提醒和纠正。
背景:一个基本的魔术8球项目
我设置了一个包含两个视图的视图控制器的基础工程:一个标签和一个按钮。轻点按钮更新,可与随机信息标签文本:
import UIKit
struct EightBall {
static let messages = ["Yes", "No", "It's not certain"]
var newMessage: String {
let randomIndex = Int(arc4random_uniform(UInt32(EightBall.messages.count)))
return EightBall.messages[randomIndex]
}
}
class ViewController: UIViewController {
let ball = EightBall()
@IBOutlet weak var messageLabel: UILabel!
@IBAction func shakeBall(_ sender: Any) {
messageLabel.text = ball.newMessage
}
}
一个基本的UI测试
这里是展示如何自动轻按按钮,抓住标签值的注释UI测试,并然后检查标签的值是否是有效的消息。
import XCTest
class MagicUITests: XCTestCase {
// This method is called before the invocation of each test method in the class.
override func setUp() {
super.setUp()
// In UI tests it is usually best to stop immediately when a failure occurs.
continueAfterFailure = true
// UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
XCUIApplication().launch()
}
func testValidMessage() {
// Grab reference to the application
let app = XCUIApplication()
// #1
// Grab reference to the label with the accesability identifier 'MessageLabel'
let messagelabelStaticText = app.staticTexts["MessageLabel"]
// Tap the button with the text 'Shake'
app.buttons["Shake"].tap()
// get the text of the label
let messageLabelText = messagelabelStaticText.label
// #2
// check if the text in the label matches one of the allowed messages
let isValidMessage = EightBall.messages.contains(messageLabelText)
// test will fail if the message is not valid
XCTAssert(isValidMessage)
}
}
在#1的方法,我使用,以获取标签是访问标签accessibilityIdentifier
财产。对于这个项目,我通过故事板输入了这个内容,但是如果您使用代码设置视图,则可以直接自行设置accessibilityIdentifier
属性。
另一件令人困惑的事情是,为了访问视图中的元素,您不是浏览视图层次结构,而是层次结构的代理,这就是为什么获取标签的语法是奇怪的'staticTexts '(文章底部的参考文献更详细地解释了这一点)。
#2,我检查我的项目中定义的结构。在单元测试中,您可以访问我的导入@testable import ProjectName
,但不幸的是,这种方法不适用于UI测试。
相反,您必须确保您想要从UI测试访问的任何源文件都包含在目标中。
更多的UI测试引用:
可能重复的[如何检查一个元素是否在数组中](http://stackoverflow.com/questions/24102024/how检查一个元素是否在数组中) –
在数组的contains方法上声明为true? – DatForis
从一个答案移动的Meta建议:欢迎来到Stack Overflow!由于人们将问题看作'如何检查一个数组是否包含一个已被多次询问的值',因此您会得到一些降薪。下一个问题你问一下['如何提出一个好问题'](https://stackoverflow.com/help/how-to-ask),以确保它不被误解。 – halfer