簡體   English   中英

構建XCTest UI測試套件的最佳實踐是什么?

[英]What are the best practices for structuring an XCTest UI Test Suite?

我正在為iOS應用程序設置測試套件。 我正在使用Xcode的XCTest框架。 這只是一個UI測試套件。 現在我有一個測試目標有一個文件TestAppUITests。 我的所有測試用例都駐留在這個文件中(第一個問題:我的所有測試用例都應該在這里,還是我需要更多的文件?)在這個文件中,我有一堆測試用例就好像是用戶使用的一樣應用程序。 登錄/創建帳戶然后登錄 - >瀏覽應用程序 - >檢查是否加載了UI元素 - >添加其他安全性,如輔助電子郵件地址 - >注銷。 這些如何訂購?

我到處研究過,在這里和那里發現了一些寶石,但仍有疑問。 在測試目標中,您應該有多個文件嗎? 我只是在我的UITest目標中有一個。 我的另一個重要問題是難以解釋。 每次我們從一開始就運行測試套件時,應用程序就會在您未登錄的狀態下啟動,因此,例如,為了測試類似於在應用程序中導航的內容,我需要運行該測試以首先登錄。 現在我設置它以便登錄測試運行一次,然后是其后的所有其他測試,然后以logout結束。 但是,一個文件TestAppUITests變得非常長,有大量的測試用例。 這是最佳做法嗎?

洙。 讓我們把它分成更多的部分:

1 / Should all of my test cases be in here or do I need more files?

好吧 - 您的測試與任何其他應用程序代碼相同。 你有一個文件中的所有應用程序代碼? 可能不是,所以一個好的做法是將測試划分為更多的類(我按照他們測試的方式進行 - LoginTests類, UserProfileTests類等等)。

為了更進一步 - 我有測試類和方法分為單獨的文件 - 我有一個方法,將在UI測試中進行登錄,所以我有UITestCase+Login擴展中的方法( UITestCase是一個類,即擴展了所有這些UITestCase+Something擴展)並且我有測試,它將在LoginTests中進行登錄,我在其中從UITestCase+Login擴展調用login方法。

但是 - 您不一定需要更多測試類 - 如果您決定在一個類中進行所有UI測試,那么這是您的選擇。 一切都會奏效,但是將測試和方法用於單獨的文件只是測試和方法未來發展的一個很好的實踐。

2 / ... Add additional security like secondary email address... How should these be ordered?

將它們分配到方法中並在測試中調用它們。

當我使用無效的登錄憑據時,這是我期待一些UI消息的方法:

func expectInvalidCredentialsErrorMessageAfterLoggingWithInvalidBIDCredentials() {
    let alertText = app.alerts.staticTexts[localizedString("mobile.account.invalid_auth_credentials")]
    let okButton = app.alerts.buttons[localizedString("common.ok")]

    wait(
        until: alertText.exists && okButton.existsAndHittable,
        timeout: 15,
        or: .fail(message: "Alert text/button are not visible.")
    )
    okButton.tap()
}

這是我在測試中使用它:

func testTryToLoginWitMissingBIDAndExpectError() {
    let inputs = BIDLoginInputs(
        BID: "",
        email: "someemail@someemail.com",
        departureIATA: "xxx",
        dayOfDeparture: "xx",
        monthOfDeparture: "xxx",
        yearOfDeparture: "xxx"
    )

    loginWithBIDFromProfile(inputs: inputs)
    expectInvalidCredentialsErrorMessageAfterLoggingWithInvalidBIDCredentials()
}

您可以看到,測試非常易讀,並且它們(幾乎完全)由方法組成,這些方法可在更多測試中重復使用。

3 / Within the test target, should you have multiple files?

再次 - 這取決於你,但是在一個文件中包含所有內容對於維護和這些測試的未來開發並不是很好。

4 / ... Each time we run the test suite from the beginning the app starts in a state where you are not logged in...Right now I have it setup so that the login test runs once, then all other tests after it, then ends with logout...

不是一個好的方法(在我看來很簡單的觀點。) - 將功能放入方法(是的,我在這里重復:-))並將測試用例分成更多的文件(理想情況是它們的功能性質,“他們做什么”)。

希望,這對你有幫助,當我開始使用iOS UI測試時,我也遇到了同樣的問題。 哦。 順便說一下 - 我在media.com上關於XCTest的iOS UI測試的高級策略和方法的文章將在幾天內發布,我可以在它出來之后給它一個鏈接 - 它應該會幫助你更進一步。

回答這個答案 ,將復雜應用程序的所有測試存儲在單個文件中是違反最佳實踐的,並且您的測試應該是結構化的,以便它們彼此獨立,只測試每個測試中的單個行為。

將所有內容拆分成許多測試似乎都是違反直覺的,這些測試需要在每次測試開始時重新啟動應用程序,但這會使測試套件更可靠,更容易調試,因為測試中的未知數量通過更小,更短的測試來最小化。 由於UI測試需要相對較長的時間才能運行,這可能令人沮喪,因此您應該嘗試通過確保應用程序具有良好的單元/集成測試覆蓋率來最小化所需的數量。

關於構建XCTest UI測試的最佳實踐,您應該查看Screenplay或Page Object模型。 頁面對象模型已經存在很長時間了,雖然許多帖子都傾向於關注Selenium或基於Java的測試框架,但它有很多帖子。 我使用Swift和XCTest在Page Object模型Screenplay模型上寫過帖子,他們應該幫助你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM