在XCode中编写模块化UI测试

时间:2017-04-30 09:50:59

标签: swift xcode testing xcode-ui-testing

我对XCode上的UI测试很陌生。我发现记录功能非常酷,它工作得很好,但只要你有决策点,代码就会破坏DRY原则。因此,我的想法是编写模块化测试并根据用户登录状态,角色等调用它们。

问题是我找不到将我的函数标记为not-tests的方法(它们是在主入口点适当时调用的助手)。这就是我想出来的

func testExample() {
   let exists = NSPredicate(format: "exists == true")

   let app = XCUIApplication()

   if(!app.staticTexts[""].exists){
       testLaunchScreen()
   }
   testAsRole1()

}

func testLaunchScreen(){
    let app = XCUIApplication()

    let scrollViewsQuery = app.scrollViews
    scrollViewsQuery.otherElements.containing(.image, identifier:"image0").element.swipeLeft()
    app.buttons["Continue"].tap()
    testFacebookLoginScreen()
}


func testFacebookLoginScreen() {
    let app = XCUIApplication()

    // set up an expectation predicate to test whether elements exist
    let exists = NSPredicate(format: "exists == true")
    // as soon as your sign in button shows up, press it
    let facebookSignInButton = app.buttons["Join with Facebook!"]
    expectation(for: exists, evaluatedWith: facebookSignInButton, handler: nil)
    facebookSignInButton.tap()


    self.waitForExpectations(timeout: 10, handler: nil)  
    if(app.staticTexts["Confirm"].exists){
        // create a reference to the button through the webView and press it
        let webView = app.descendants(matching: .webView)
        webView.buttons["OK"].tap()
    } else {
        let webViewsQuery = app.webViews
        webViewsQuery/*@START_MENU_TOKEN@*/.textFields["Email or Phone"]/*[[".otherElements[\"Welcome to Facebook\"]",".otherElements[\"main\"].textFields[\"Email or Phone\"]",".textFields[\"Email or Phone\"]"],[[[-1,2],[-1,1],[-1,0,1]],[[-1,2],[-1,1]]],[0]]@END_MENU_TOKEN@*/.typeText("user@tfbnw.net")
        webViewsQuery/*@START_MENU_TOKEN@*/.secureTextFields["Facebook Password"]/*[[".otherElements[\"Welcome to Facebook\"]",".otherElements[\"main\"].secureTextFields[\"Facebook Password\"]",".secureTextFields[\"Facebook Password\"]"],[[[-1,2],[-1,1],[-1,0,1]],[[-1,2],[-1,1]]],[0]]@END_MENU_TOKEN@*/.typeText("password")
        webViewsQuery.buttons["Login"].tap()   
    }
    // wait for your app to return and test for expected behavior here
    self.waitForExpectations(timeout: 10, handler: nil)  
}


func testAsRole1(){

  ///
}

问题是所有testXXX函数都按照我想要的顺序运行,我只想运行testExample。我找到了一些关于扩展名的post,但我认为这些不适合我的情况

编辑: 我发现https://github.com/kif-framework/KIF这似乎是一个非常好的库但我希望能够只记录序列并将它们命名为我可以重用的函数,我认为它更容易维护

非常感谢

1 个答案:

答案 0 :(得分:2)

XCTest将XCTestCase子类中以test开头的每个方法视为独立测试。只需更改方法名称即可。或者,您可以将它们放在一个不从XCTestCase继承的单独的类中,但是您将丢失那里定义的便捷方法。

来自documentation

  

测试方法是没有参数的实例方法,不返回值,其名称以小写单词“test”开头。

因此,有几种不同的方法可以修改这些方法,以便它们不被视为测试。