Skip to content

Commit

Permalink
unit testing barryclark#2
Browse files Browse the repository at this point in the history
  • Loading branch information
codedeman committed Oct 3, 2021
1 parent cd0da23 commit 6b66c46
Showing 1 changed file with 107 additions and 23 deletions.
130 changes: 107 additions & 23 deletions _posts/unit-test.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
<img src="https://i.imgur.com/h2qJt9L.png" width=50% />


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
Expand All @@ -44,56 +47,137 @@ 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
</br>
**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
</br>
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
</br>
Execution:chạy function
</br>
Expection: trả về True
</br>

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
</br>
Execution:chạy function
</br>
Expection: trả về False
</br>


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é
<br>
<img src="https://i.imgur.com/wjiS1II.png" width=80% />
<br>


``` 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
<br>
<img src="hhttps://i.imgur.com/Q7nZ9KV.png" width=40% />
<br>

Với test case thứ 2 kết quả mà chúng ta mong đợi là False
<br>
<img src="hhttps://i.imgur.com/Q7nZ9KV.png" width=40% />
<br>
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)

0 comments on commit 6b66c46

Please sign in to comment.