我是Swift的新手,并按照一个简单的教程制作了一个神奇的8球Cocoa App,每当我点击球时它会显示不同的建议。我现在正试图通过断言(XCTAssert)"建议和#34;来尝试练习我的UI自动化测试。 label等于我的数组中的一个字符串值。 我的数组看起来像这样,并且在我的ViewController.swift中:
var adviceList = [
"Yes",
"No",
"Tom says 'do it!'",
"Maybe",
"Try again later",
"How can I know?",
"Totally",
"Never",
]
如何在我的UITests.swift文件中断言断言所显示的字符串等于上面数组中的一个字符串值?
答案 0 :(得分:1)
您可能会询问如何通过UI测试或仅在一般的UI测试中访问应用程序状态。
我认为这是一个非常有趣的问题,所以我要回答,因为这是我不太了解的事情,希望能引起其他人的反响。正确的。
我使用包含两个视图的视图控制器设置了一个基本项目:标签和按钮。点击按钮会使用随机消息更新标签文本:
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测试,显示如何自动点击按钮,抓取标签的值,然后检查标签的值是否为有效消息。
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测试的名称从此面板在Xcode中执行此操作:
更多UI测试参考: