iT邦幫忙

2023 iThome 鐵人賽

DAY 12
1
Mobile Development

在 iOS 專案上加上 Unit testing - 因為 You need testing系列 第 12

D12 - 在 iOS 專案加上測試-You need testing {台股小工具 app-股票紀錄轉換par1}

  • 分享至 

  • xImage
  •  

在股票交易紀錄輸入 View 裡面,會需要一個轉換器,在畫面上的 property 按下新增後,進行輸入內容的檢查,以似 Data Model 的轉換。

規格

  • 檢查 stockID, stockName, tradingShares, tradingCostPerShare 都是有值的
  • 檢查 tradingShares, tradingCostPerShare 是可以被轉換成 Int
  • 檢查 tradingShares, tradingCostPerShare 必須是大於 0 的整數
  • 如果上述所有條件都通過,就轉換成 StockRecordUtility 物件並 return StockRecordUtility
  • 只要上述所有條件其中一條件不滿足,就 return Error。(實務上你可以更詳細的設定出 Error 物件,但這個範例只打算設定回傳一個 Error)

測試項目

  • stockID, stockName, tradingShares, tradingCostPerShare 其中有一個為空時,得到 Error
  • stockID = “0050”, stockName = “元大50”, tradingShares = “1000”, tradingCostPerShare = “a” 時,得到 Error
  • stockID = “0050”, stockName = “元大50”, tradingShares = “a”, tradingCostPerShare = “130” 時,得到 Error
  • stockID = “0050”, stockName = “元大50”, tradingShares = “-1000”, tradingCostPerShare = “130” 時,得到 Error
  • stockID = “0050”, stockName = “元大50”, tradingShares = “1000”, tradingCostPerShare = “-10” 時,得到 Error
  • stockID = “0050”, stockName = “元大50”, tradingShares = “1000”, tradingCostPerShare = “130” 時,得到 StockRecordUtility 物件,且此物件的每個屬性和輸入的值是相對應的。也就是 tradingShares = “1000” 時 stockRecordUtility.tradingShares = 1000

開始 測試和實作

依前面所提步驟,先建立測試

import XCTest
@testable import TwStockTools

final class StockRecordUtilityTests: XCTestCase {

    override func setUpWithError() throws {
    }

    override func tearDownWithError() throws {
    }
    
    func testCreateStockRecord() {
        
        /// 這個 test 是可以在還沒寫實作前先寫的
        /// 因為已經列出了測項,有測項就可以寫 test
        let error = StockRecordUtility().getStockRecord(stockID: "", stockName: "", tradingSide: .buy, stockShares: "", stockCostPerShare: "")
        
        /// 這邊的 Assert 也可以在還沒宣告對應的 Error 物件前先寫
        XCTAssertEqual(erro, someError)
    }
}

Step1: 開始實作 StockRecordUtility 物件

extension StockRecordUtility {
    
    enum StockRecordInputError: Error {
        case noValue
        case castingError
    }
}

struct StockRecordUtility {
    
    func getStockRecord(stockID: String, stockName: String, tradingSide: StockTradingInputView.TradingSide, stockShares: String, stockCostPerShare: String) -> Result<StockTradingRecord, Error> {
        
        /// 這還不是正式實作,需要寫 return 是為了讓 project 能 build 起來,只有能 build 後才能 testing
        return .success(StockTradingRecord(stockID: "", stockName: "", tradingSide: .buy, tradingShares: 0, tradingAmount: 0))
    }
}

step2: 修改 unit testing

import XCTest
@testable import TwStockTools

final class StockRecordUtilityTests: XCTestCase {

    override func setUpWithError() throws {
    }

    override func tearDownWithError() throws {
    }
    
    func testCreateStockRecord() throws {
        
        /// 這個 test 是可以在還沒寫實作前先寫的
        /// 因為已經列出了測項,有測項就可以寫 test
        let result = StockRecordUtility().getStockRecord(stockID: "", stockName: "", tradingSide: .buy, stockShares: "", stockCostPerShare: "")
        
        switch result {
            case .success(let _):
                XCTFail("This test case not able success")
            case .failure(let failure):
                
                let error = try XCTUnwrap(failure as? StockRecordUtility.StockRecordInputError)
                XCTAssertEqual(error, StockRecordUtility.StockRecordInputError.noValue)
        }
    }
}

step3: 跑測試

這一步一定失敗,因為我們預設空值時,return Result.Failure 且裡面為 Error 物件。

step4: 修改實作,讓這個 func 符合第一個 spe

func getStockRecord(stockID: String, stockName: String, tradingSide: StockTradingInputView.TradingSide, stockShares: String, stockCostPerShare: String) -> Result<StockTradingRecord, Error> {
        
        if stockID.isEmpty ||
            stockName.isEmpty ||
            stockShares.isEmpty ||
            stockCostPerShare.isEmpty {
            return .failure(StockRecordInputError.noValue)
        }
        
        /// 這還不是正式實作,需要寫 return 是為了讓 project 能 build 起來,只有能 build 後才能 testing
        return .success(StockTradingRecord(stockID: "", stockName: "", tradingSide: .buy, tradingShares: 0, tradingAmount: 0))
    }

step5: 再跑一次測試,並確定通過

完成第一個測項


上一篇
D11 - 在 iOS 專案加上測試-You need testing {台股小工具 app-交易紀錄頁面}
下一篇
D13 - 在 iOS 專案加上測試-You need testing {台股小工具 app-股票紀錄轉換par2}
系列文
在 iOS 專案上加上 Unit testing - 因為 You need testing32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言