From 6b66c46964ddae7bc9ddc67e67834b162c41ab3e Mon Sep 17 00:00:00 2001 From: kevin Date: Sun, 3 Oct 2021 23:04:48 +0700 Subject: [PATCH] unit testing #2 --- _posts/unit-test.md | 130 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 107 insertions(+), 23 deletions(-) diff --git a/_posts/unit-test.md b/_posts/unit-test.md index 4abf40fd5402e..0f0a2314ad15f 100644 --- a/_posts/unit-test.md +++ b/_posts/unit-test.md @@ -10,16 +10,19 @@ Vì lý do đấy nhiều công ty đang bắt đầu viết automation test cho Tính từ giới kim tự tháp đầu tiên là Unit test, sau đó đến Integration Test và cuối cùng là UI test ## Unit testing là gì ? -Unit test là một trong những khái niệm căn bản nhẩt của automation test chạy và xác thực mã nguồn, hiểu một cách đơn giản là là function truyền vào tham số và kiểm tra kết quả mong đợi đầu ra, nó đơn giản mà nhanh +Unit test là một trong những khái niệm căn bản nhẩt của automation test chạy và xác thực mã nguồn, hiểu một cách đơn giản là là function truyền vào tham số và kiểm tra kết quả mong đợi đầu ra ## Integration test -Tương tự như Unit test nhưng nó sẽ có thể cover rộng hơn so với unittest -Mục tiêu của interaction là cài thiện chất lượng của phần mềm +Tương tự như Unit test điều khác biệt ở đây là nó có thể cover rộng hợn so với Unit test, đối với Unit test thì nó chỉ cover được một phạm vi logic rất nhỏ của app, còn Integration test có thể cover được chức năng của một hệ thống nhỏ kết hợp giữa class và function ## UI test là bước cuối cùng của automation test là testing chạy lậu nhất so với hai thằng còn lại, nó có khả năng gi lại những tương tác của user lên giao diện và chuyển nó thành mã nguồn -Trong bài viết này mình muốn chia sẻ một chút hiểu biết của mình về unit test +## Performance Testing + + + +Trong phần này chúng ta sẽ tìm hiểu ở bước căn bản nhất của testing ## Lợi ích của Unit test Unittest hữu ích khi làm việc với codebase lớn, khi dự án phải làm việc với nhiều dev khác tiết kiệm thời gian thay đổi chỉnh sửa chức năng mà không sợ ảnh hưởng đến code của ông khác hạn chế bug phát sinh, mình đã từng đau khổ khi maintain các dự án cũ nhưng không có unittest kết quả là sửa tính năng này, thì lại hỏng tính năng kia vì các tính năng đều liên quan đến nhau nên code có unittest thì sẽ gíup bạn gỉai quyết vấn đề này @@ -44,22 +47,22 @@ Khởi tạo classs mà bạn muốn test ## Setup và Teardown **Setup** là phương thức khởi tạo các phương thức test
-**TearDown** là phương thức clean sau mỗi phương thức hoàn thành thực thi theo cơ chế LIFO +**TearDown** là phương thức clean sau mỗi phương thức hoàn thành test case nó thực thi theo cơ chế LIFO Chúng ta có test case đơn giản như sau -Case 1 nhập vào một số chia hết cho 2 +Case 1 Người dùng đăng nhập tài trạng thái active
-Setup:Tạo một function nhập vào 1 số chia hết cho 2 +Setup:Tạo một function phương thức đăng nhập user
Execution:chạy function
Expection: trả về True
-Case 2 nhập vào một số không chia hết cho 2 +Case 2 Người dùng đăng nhập tài trạng thái inactive -Setup:Tạo một function nhập vào 1 số không chia hết cho 2 +Setup:Tạo một function phương thức đăng nhập user
Execution:chạy function
@@ -67,33 +70,114 @@ Expection: trả về False
-Bây giờ chúng ta sẽ chuyển đoạn mã giả trên thành code nào, đầu tiên khi tạo project chúng ta sẽ tích vào Unittest nhé +Bây giờ chúng ta sẽ chuyển đoạn mã giả trên thành code nào, đầu tiên khi tạo project chúng ta sẽ tích vào Unit test nhé

``` Swift - func sumArray(nums:[Int]) ->Int { - var sum:Int! - for num in nums { - if (num%2 != 0) { - sum = num+num - } + enum UserStatus:Int { + case active = 1 + case inactive = 2 +} + +enum BiometricType:Int { + case figgerPrint = 0 + case faceId = 1 + case enterText = 2 + case wrongPass = 3 +} + +enum LoginStaus:Int { + case scucess = 0 + case failure = 1 +} + + func performGetStatusUser(userStatus: UserStatus, biometric: BiometricType) -> LoginStaus { + if userStatus == .active { + switch biometric { + case .figgerPrint: + return .scucess + case .faceId: + return .scucess + case .enterText: + return .scucess + case .wrongPass: + return .failure + } + } else { + + return .failure + } + } +``` +Bây giờ chúng ta sẽ viết test cho function trên +``` Swift + +import XCTest +@testable import Binance // import tên project chúng ta muống test vào + +class BinanceTests: XCTestCase { + public var viewHome = HomeViewModel() + + override func setUp() { + super.setUp() + viewHome.binding(delegate: self) // khởi tạo class mà chúng ta muốn test + + } + + override func tearDown() { + super.tearDown() + viewHome.unbinding(delegate: self) } - return sum - } + + func test_UserStatus () { + let userStatus = viewHome.interactor.performGetStatusUser(userStatus:.active, biometric: .faceId) == .scucess + XCTAssertTrue(userStatus, "valid") + } + ``` +Để chạy được test case chúng ta có thể dùng tổ hợp phím Comand + Shift+ U để chạy toàn bộ test case or chúng ta có thể bấm vào test case mà chúng ta muốn chạy + +Với test case đầu tiền kết quả mà chúng ta mong đợi là True +
+ +
+ +Với test case thứ 2 kết quả mà chúng ta mong đợi là False +
+ +
+Chúng ta có test case thứ 2 để test class Helper + +``` Swift + +import Foundation + +class AppHelper { + + static let shareInstance = AppHelper() + + func stringToDate(dateStr:String,format:String) ->Date? { + let dateFormatterGet = DateFormatter() + dateFormatterGet.dateFormat = format + + guard let dateResult = dateFormatterGet.date(from: dateStr) else { return nil} + + return dateResult + } + +} -``` Swift - func testSum() { - let sums = [2,2,3,5] - XCTAssertEqual(sut.sumArray(nums: sums), 8) - } ``` +Chúng ta sẽ test function stringToDate này + + ## Kết luận Bài viết này mình đã giới thiệu cho các bạn những khái niệm căn bản nhất của testing, và chúng ta cũng ta cũng đã thử viết 1 unit test căn bản, hy vọng bài viết của mình sẽ hữu ích cho bạn khi mới tiếp cận đến unit test, trong bài viết sắp tới mình sẽ chia sẻ cho các bạn về UI test, mọi ý kiến đóng góp mong các bạn gửi về địa chỉ ![]phamtrungkiendev@gmail.com hoặc bình luận phía giới của bài viết này nhé! Bài viết tham khảo của +[Apple document](https://developer.apple.com/documentation/xcode/testing-your-apps-in-xcode)