如何使用Swift中的XCTAssert声明字符串的值等于数组中任何字符串值之一?

时间:2017-04-05 19:57:47

标签: arrays swift assert assertions

我是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文件中断言断言所显示的字符串等于上面数组中的一个字符串值?

1 个答案:

答案 0 :(得分:1)

您可能会询问如何通过UI测试或仅在一般的UI测试中访问应用程序状态。

我认为这是一个非常有趣的问题,所以我要回答,因为这是我不太了解的事情,希望能引起其他人的反响。正确的。

背景:基本的Magic 8 Ball项目

我使用包含两个视图的视图控制器设置了一个基本项目:标签和按钮。点击按钮会使用随机消息更新标签文本:

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' (帖子底部的参考文献更详细地解释了这一点。)

enter image description here

对于#2我正在检查项目中定义的结构。在单元测试中,您可以访问我的导入@testable import ProjectName,但遗憾的是,此方法不适用于UI测试。

相反,您必须确保要从UI测试中访问的任何源文件都包含在目标中。您可以通过检查UI测试的名称从此面板在Xcode中执行此操作:

enter image description here

更多UI测试参考: