2017-04-05 32 views
-2

我是新来的Swift,并且遵循一个简单的教程来制作一个魔术8球可可应用程序,每次点击球时它都会显示一条不同的建议。我现在试图通过声明(XCTAssert)来实践我的UI自动化测试,其中“Piece of Advice”标签等于我的数组中的一个字符串值。 我的阵列看起来像这样,是我ViewController.swift:如何声明一个字符串的值等于在Swift中使用XCTAssert的数组中的任何字符串值之一?

var adviceList = [ 
    "Yes", 
    "No", 
    "Tom says 'do it!'", 
    "Maybe", 
    "Try again later", 
    "How can I know?", 
    "Totally", 
    "Never", 
    ] 

我怎样才能让我的UITests.swift文件中的说法,声称所显示的字符串是等于字符串值中的一个上面的数组?

+1

可能重复的[如何检查一个元素是否在数组中](http://stackoverflow.com/questions/24102024/how检查一个元素是否在数组中) –

+0

在数组的contains方法上声明为true? – DatForis

+0

从一个答案移动的Meta建议:欢迎来到Stack Overflow!由于人们将问题看作'如何检查一个数组是否包含一个已被多次询问的值',因此您会得到一些降薪。下一个问题你问一下['如何提出一个好问题'](https://stackoverflow.com/help/how-to-ask),以确保它不被误解。 – halfer

回答

1

您可能会问如何从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 '(文章底部的参考文献更详细地解释了这一点)。

enter image description here

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

相反,您必须确保您想要从UI测试访问的任何源文件都包含在目标中。

enter image description here

更多的UI测试引用:

+0

非常感谢:) –

+0

这是一个出色的答案,很好的工作!我希望我可以将元评注转移到评论中,因为我们希望帖子专注于材质本身。评论非常自由,所以它们更适合于自己的问题或答案。 – halfer

相关问题