国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Swift 單元測試入門

這篇具有很好參考價值的文章主要介紹了Swift 單元測試入門。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

含義:編程語言中的單元測試是為了確保編寫的代碼按預(yù)期工作。
給定一個特定的輸入,希望代碼帶有一個特定的輸出。通過測試代碼,能夠給當前的重構(gòu)和發(fā)布建立信心,因為將能夠確保代碼在成功運行的測試套件后按預(yù)期工作。

一、單元測試簡介

單元測試是運行和驗證一段代碼(稱為“單元”)以確保其按預(yù)期運行并符合其設(shè)計的自動化測試。
例如,寫一個字符串擴展方法將第一個字母大寫:

extension String {
    func uppercasedFirst() -> String {
        let firstCharacter = prefix(1).capitalized
        let remainingCharacters = dropFirst().lowercased()
        return firstCharacter + remainingCharacters
    }
}

我們要確保 uppercasedFirst()方法按預(yù)期工作。如果我們給它一個輸入 antoine,我們期望它輸出 Antoine。我們可以使用XCTAssertEqual 方法為此方法編寫單元測試:

final class StringExtensionsTests: XCTestCase {
    func testUppercaseFirst() {
        let input = "antoine"
        let expectedOutput = "Antoine"
        XCTAssertEqual(input.uppercasedFirst(), expectedOutput, "The String is not correctly capitalized.")
    }
}

如果我們的方法不再按預(yù)期工作(比如上面的擴展代碼不小心被修改了),Xcode 將使用我們提供的描述顯示失?。?br>Swift 單元測試入門

二、項目中添加單元測試

  1. 創(chuàng)建項目時勾選單元測試
    Swift 單元測試入門

  2. 已有項目添加測試target
    左下角添加target,搜索test,選擇Unit Test Bundle
    Swift 單元測試入門
    Swift 單元測試入門

  3. 項目中就會出現(xiàn)單元測試的文件夾
    Swift 單元測試入門

三、在 Swift 中編寫單元測試

有多種方法可以測試相同的結(jié)果,但是當測試失敗時它并不總是給出相同的反饋。以下提示可幫助您編寫測試,通過從詳細的失敗消息中獲益,幫助您更快地解決失敗的測試。

1.命名測試用例和方法

描述你的單元測試是很重要的,這樣你就會明白測試試圖驗證什么。如果你不能想出一個簡短的名字,那你可能測試了太多東西。一個好名字還可以幫助您更快地解決失敗的測試。

要快速找到特定類的測試用例,建議使用相同的命名并結(jié)合 “test”。就像上面的例子一樣,我們根據(jù)我們正在測試一組字符串擴展的事實命名了 StringExtensionTests。如果您正在測試ContentViewModel 實例,另一個示例可能是 ContentViewModelTests。

2.不要所有測試都使用 XCTAssert

許多場景都可以使用 XCTAssert,但當測試失敗時會導(dǎo)致不同的結(jié)果。以下代碼行都測試了完全相同的結(jié)果:

func testEmptyListOfUsers() {
    let viewModel = UsersViewModel(users: ["Ed", "Edd", "Eddy"])
    XCTAssert(viewModel.users.count == 0)
    XCTAssertTrue(viewModel.users.count == 0)
    XCTAssertEqual(viewModel.users.count, 0)
}

正如你所看到的,該方法使用了一個描述性的名字,告訴人們要測試一個空的用戶列表。然而,我們定義的視圖模型不是空的,因此,所有的斷言都失敗了。
Swift 單元測試入門

結(jié)果顯示了為什么必須對驗證類型使用正確的斷言。 XCTAssertEqual 方法為我們提供了有關(guān)斷言失敗原因的更多上下文。這顯示在紅色錯誤和控制臺日志中,可幫助您快速識別失敗的測試。

3.Setup and Teardown

多個測試方法中使用的參數(shù)可以定義為測試用例類中的屬性。您可以使用 setUp() 方法為每個測試方法設(shè)置初始狀態(tài),并使用 tearDown() 方法進行清理。有多種設(shè)置和拆卸方法的變體供您選擇,例如支持并發(fā)的變體或拋出變體,如果設(shè)置失敗,您可以在其中提前使測試失敗。
一個可以生成用戶默認實例以用于單元測試的示例:

struct SearchQueryCache {
    var userDefaults: UserDefaults = .standard

    func storeQuery(_ query: String) {
        /// ...
    }
}

final class SearchQueryCacheTests: XCTestCase {

    private var userDefaults: UserDefaults!
    private var userDefaultsSuiteName: String!

    override func setUpWithError() throws {
        try super.setUpWithError()
        userDefaultsSuiteName = UUID().uuidString
        userDefaults = UserDefaults(suiteName: userDefaultsSuiteName)
    }

    override func tearDownWithError() throws {
        try super.tearDownWithError()
        userDefaults.removeSuite(named: userDefaultsSuiteName)
        userDefaults = nil
    }

    func testSearchQueryStoring() {
        /// 使用生成的用戶默認值作為輸入。
        let cache = SearchQueryCache(userDefaults: userDefaults)

        /// ... write the test
    }
}

這樣做可以確保您不會操縱在模擬器上測試期間使用的標準用戶默認值。其次,您將確保在測試開始時處于干凈狀態(tài)。我們使用了拆卸方法來刪除用戶默認套件并進行相應(yīng)的清理。

4.拋出方法

和編寫應(yīng)用程序代碼時一樣,您也可以定義一個可拋出測試的方法。這允許您在測試中的方法拋出錯誤時使測試失敗。例如,在測試 JSON 響應(yīng)的解碼時:

func testDecoding() throws {
    /// 當數(shù)據(jù)初始值設(shè)定項拋出錯誤時,測試將失敗。
    let jsonData = try Data(contentsOf: URL(string: "user.json")!)

    /// `XCTAssertNoThrow` 可用于獲取有關(guān)拋出的額外上下文
    XCTAssertNoThrow(try JSONDecoder().decode(User.self, from: jsonData))
}

當在任何進一步的測試執(zhí)行中不需要 throwing 方法的結(jié)果時,可以使用 XCTAssertNoThrow 方法。您應(yīng)該使用 XCTAssertThrowsError 方法來匹配預(yù)期的錯誤類型。例如,您可以為證書密鑰驗證程序編寫測試:

struct LicenseValidator {
    enum Error: Swift.Error {
        case emptyLicenseKey
    }

    func validate(licenseKey: String) throws {
        guard !licenseKey.isEmpty else {
            throw Error.emptyLicenseKey
        }
    }
}

class LicenseValidatorTests: XCTestCase {
    let validator = LicenseValidator()

    func testThrowingEmptyLicenseKeyError() {
        XCTAssertThrowsError(try validator.validate(licenseKey: ""), "An empty license key error should be thrown") { error in
            /// 我們確保預(yù)期的錯誤被拋出。
            XCTAssertEqual(error as? LicenseValidator.Error, .emptyLicenseKey)
        }
    }

    func testNotThrowingLicenseErrorForNonEmptyKey() {
        XCTAssertNoThrow(try validator.validate(licenseKey: "XXXX-XXXX-XXXX-XXXX"), "Non-empty license key should pass")
    }
}

5.可選值解包

XCTUnwrap 方法最適合用于拋出測試,因為它是一個拋出斷言:

func testFirstNameNotEmpty() throws {
let viewModel = UsersViewModel(users: [“Antoine”, “Maaike”, “Jaap”])

let firstName =  try XCTUnwrap(viewModel.users.first)
XCTAssertFalse(firstName.isEmpty)

}
XCTUnwrap 斷言可選變量的值不為 nil,如果斷言成功則返回它的值。它會阻止您編寫 XCTAssertNotNil 并結(jié)合解包或處理其余測試代碼的條件鏈接。

四、在 Xcode 中運行單元測試

編寫測試后,就該運行它們了。通過以下提示,這將變得更有效率。

1.使用測試三角形

您可以使用前導(dǎo)三角形運行單個測試或一組測試:
Swift 單元測試入門

根據(jù)最新的測試運行結(jié)果,同一方塊顯示紅色或綠色。

2.重新運行最新的測試

使用以下命令重新運行上次運行測試:

? Control + ? Option + ? Command + G.

上面的快捷方式可能是我最常用的快捷方式之一,因為它可以幫助我在對失敗測試實施修復(fù)后快速重新運行測試。

3. 運行測試組合

使用 CTRL 或 SHIFT 選擇要運行的測試,右鍵單擊并選擇“Run X Test Methods”。
Swift 單元測試入門

4.在測試導(dǎo)航器中應(yīng)用過濾器

Swift 單元測試入門

  • 使用搜索字段根據(jù)名稱搜索特定測試
  • 僅顯示當前所選方案的測試。如果您有多個測試方案,這將很有用。
  • 只顯示失敗的測試。這將幫助您快速找到失敗的測試

五、問題統(tǒng)計

1. 運行單元測試后代碼簽名失敗

應(yīng)用程序已經(jīng)打開了自動簽名,所以我認為當測試目標也沒有打開自動簽名時,Xcode 中出現(xiàn)了問題。代碼簽名需要一致。
Swift 單元測試入門

2. 在單元測試中引用Framework

頭部添加包名稱@testable import (name)文章來源地址http://www.zghlxwxcb.cn/news/detail-515170.html

到了這里,關(guān)于Swift 單元測試入門的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Rust編程語言入門之模式匹配

    模式是Rust中的一種特殊語法,用于匹配復(fù)雜和簡單類型的結(jié)構(gòu) 將模式與匹配表達式和其他構(gòu)造結(jié)合使用,可以更好地控制程序的控制流 模式由以下元素(的一些組合)組成: 字面值 解構(gòu)的數(shù)組、enum、struct 和 tuple 變量 通配符 占位符 想要使用模式,需要將其與某個值進行

    2023年04月22日
    瀏覽(23)
  • Rust編程語言入門之無畏并發(fā)

    Concurrent:程序的不同部分之間獨立的執(zhí)行(并發(fā)) Parallel:程序的不同部分同時運行(并行) Rust無畏并發(fā):允許你編寫沒有細微Bug的代碼,并在不引入新Bug的情況下易于重構(gòu) 注意:本文中的”并發(fā)“泛指 concurrent 和 parallel 在大部分OS里,代碼運行在進程(process)中,OS同時

    2023年04月19日
    瀏覽(26)
  • Rust編程語言入門之智能指針

    指針:一個變量在內(nèi)存中包含的是一個地址(指向其它數(shù)據(jù)) Rust 中最常見的指針就是”引用“ 引用: 使用 借用它指向的值 沒有其余開銷 最常見的指針類型 智能指針是這樣一些數(shù)據(jù)結(jié)構(gòu): 行為和指針相似 有額外的元數(shù)據(jù)和功能 通過記錄所有者的數(shù)量,使一份數(shù)據(jù)被多個

    2023年04月16日
    瀏覽(26)
  • C語言入門 Day_1 編程與C語言

    C語言入門 Day_1 編程與C語言

    計算機最早的出現(xiàn)是為了幫人們解決一些計算量巨大的任務(wù),比如計算 導(dǎo)彈的軌跡,原子彈的爆炸范圍,火箭的速度等等特定目的。 最早的計算機,一種計算機只能處理一種特定任務(wù),隨著時代的發(fā)展,一個能處理多種不同的任務(wù)的計算機開始出現(xiàn),這就是通用計算機,比

    2024年02月12日
    瀏覽(22)
  • APP開發(fā)入門:了解主流的編程語言

    APP開發(fā)入門:了解主流的編程語言

    在過去的幾年里,有許多程序員開始學(xué)習和使用編程語言。這其中包括C、C++、 Java和 Python。盡管有許多語言可供選擇,但大多數(shù)程序員都會選擇最容易學(xué)習的編程語言。 如今,有很多編程語言供選擇。程序員們在學(xué)習這些語言時可以自由地選擇他們喜歡的方式,因為他們的

    2024年02月15日
    瀏覽(19)
  • Rust編程語言入門之函數(shù)式語言特性:-迭代器和閉包

    閉包(closures) 迭代器(iterators) 優(yōu)化改善 12 章的實例項目 討論閉包和迭代器的運行時性能 閉包:可以捕獲其所在環(huán)境的匿名函數(shù)。 閉包: 是匿名函數(shù) 保存為變量、作為參數(shù) 可在一個地方創(chuàng)建閉包,然后在另一個上下文中調(diào)用閉包來完成運算 可從其定義的作用域捕獲值

    2023年04月08日
    瀏覽(27)
  • C語言編程入門之刷題篇(C語言130題)(8)

    (題目標題可以直接跳轉(zhuǎn)此題鏈接) BC72 平均身高 ? 從鍵盤輸入5個人的身高(米),求他們的平均身高(米)。 輸入描述: 一行,連續(xù)輸入5個身高(范圍0.00~2.00),用空格分隔。 輸出描述: 一行,輸出平均身高,保留兩位小數(shù)。 輸入:1.68 1.75 1.82 1.60 1.92 輸出:1.75 ?參考

    2024年02月02日
    瀏覽(18)
  • Rust編程語言入門之cargo、crates.io

    通過 release profile 來自定義構(gòu)建 在https://crates.io/上發(fā)布庫 通過 workspaces 組織大工程 從 https://crates.io/來安裝庫 使用自定義命令擴展 cargo release profile: 是預(yù)定義的 可自定義:可使用不同的配置,對代碼編譯擁有更多的控制 每個 profile 的配置都獨立于其它的 profile cargo 主要的

    2023年04月09日
    瀏覽(28)
  • 初學(xué)編程入門基礎(chǔ)教學(xué)視頻,中文編程開發(fā)語言工具箱之豪華編輯構(gòu)件,免費版中文編程軟件下載

    初學(xué)編程入門基礎(chǔ)教學(xué)視頻,中文編程開發(fā)語言工具箱之豪華編輯構(gòu)件,免費版中文編程軟件下載

    初學(xué)編程入門基礎(chǔ)教學(xué)視頻,中文編程開發(fā)語言工具箱之豪華編輯構(gòu)件,免費版中文編程軟件下載 ?構(gòu)件的其中一個屬性、方法,查找內(nèi)容,替換內(nèi)容。 構(gòu)件工具箱非常豐富,其中該構(gòu)件在?文本件構(gòu)件板菜單下。 編程系統(tǒng)化課程總目錄及明細,零基礎(chǔ)學(xué)中文編程視頻教程,

    2024年02月07日
    瀏覽(95)
  • Shell編程——弱數(shù)據(jù)類型的腳本語言快速入門指南

    Shell編程——弱數(shù)據(jù)類型的腳本語言快速入門指南

    目錄 Linux Shell 數(shù)據(jù)類型 變量類型 運算符 算術(shù)運算符 賦值運算符 拼接運算符 比較運算符 關(guān)系運算符 控制結(jié)構(gòu) 順序結(jié)構(gòu) 條件分支結(jié)構(gòu) if 條件語句 case 分支語句? 循環(huán)結(jié)構(gòu) for 循環(huán) while 循環(huán) until 循環(huán) break 語句 continue語句 函數(shù) 函數(shù)定義? 函數(shù)名 函數(shù)體 返回值 參數(shù) 函數(shù)的

    2024年02月12日
    瀏覽(97)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包