Đợt này trong dự án của công ty mình đang chuẩn bị triển khai việc dùng Unit Test. Unit Test thì không còn xa lạ gì với anh em Dev, ngay cả bản thân mình hồi học đại học thì cũng đã từng học qua môn quản lý dự án liên quan Unit Test nhưng để áp dụng vào thực tế thì không phải chuyện dễ. Hôm nay , mình cũng thử vọc vặt bước đầu xem Unit Test nó có tác dụng gì, lý do nên viết Unit Test.Dưới đây là 10 lý do để viết Unit:
10 Lý do nên viết Unit Test:
- Giảm lỗi khi implement tính năng mới.
- Giảm lỗi trong tính năng hiện có.
- Test là 1 tài liệu tốt. Một đoạn code ngắn thay cho 1 đống tài liệu.
- Giảm chi phí thay đổi.
- Cải thiện design khi test
- Test cấu trúc code
- Test các điều kiện rằng buộc.
- Test giúp bảo về, đề phòng các lập trình viên khác ( Một ngày đẹp trời bạn nghỉ một hôm, có ông dev khác nhảy vào code thì ...).
- Khi test kết hợp với code bắt buộc bạn phải suy nghĩ chậm lại để code mình viết ra có thể implement unit test vào được.
- Giảm nỗi sợ hãi lớn nhất mà các lập trình viên hay gặp phải là khi có 1 đoạn code nhỏ thay đổi nhỏ mà không biết điều gì sẽ xảy ra.
1. Cài đặt Unit test
1.1. Cài đặt vào project.
Để bắt đầu Unit Test, mình sẽ tạo project mới , các bạn tick vào ô include unit tests.
1.2 .Trường hợp nếu bạn đã có project nhưng chưa tạo file Unit Test.
- Trên Menu của Xcode , các bạn chọn File > New > Target.
- Chọn iOS Unit Testing Bundle. và click Next.
2 .Tạo Internal Class
Tạo Internal Model Object trong project của bạn . Bạn đừng tick target "UnitTestTests" cho thằng class Car và không làm cho class hoặc method của bạn public.
3. Ví dụ Test Case
Khi app của bạn setting testing thì trong thư mục UnitTestTests, Xcode đã setup mẫu 1 file [TênProject]Tests.Swift
- Mỗi một test case thì bạn phải import XCTest
- import @testable là khai báo nhập thêm . Khi bạn dùng khai báo @testable thì sẽ không cần đưa file của target khác vào target test.
- Để tạo một unit test bạn cần 1 class kế thừa class XCTestCase (class UnitTestTests: XCTestCase) .
- Nhập chuột vào hình kim cương ở bên phải màn hình nếu bạn muốn chạy 1 case unit test nào đó.
4. Setup và dùng class Car.
Cho đoạn code quản lý car dưới đây:
// Car.swift
import Foundation
class Car {
var miles = 0
var type: CarType
var transmissionMode: CarTransmissionMode
init(type:CarType, transmissionMode:CarTransmissionMode){
self.type = type
self.transmissionMode = transmissionMode
}
func start(minutes: Int) {
var speed = 0
if self.type == .Economy && self.transmissionMode == .Drive {
speed = 35
}
if self.type == .OffRoad && self.transmissionMode == .Drive {
speed = 50
}
if self.type == .Sport && self.transmissionMode == .Drive {
speed = 70
}
self.miles = speed * (minutes / 60)
}
}
enum CarType {
case Economy
case OffRoad
case Sport
}
enum CarTransmissionMode {
case Park
case Reverse
case Neutral
case Drive
}
Bây giờ chúng ta sẽ khởi tạo object Car trong ViewController.
// ViewController.swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let ferrari = Car(type: .Sport, transmissionMode: .Drive)
ferrari.start(minutes: 120)
print(ferrari.miles) // => 140
}
}
OK. Bây giờ chúng ta sẽ thực hiện Ví dụ về Unit Test.
5 .Tạo Car Unit Test Case
- Go to File -> New File
- Sau đó select Unit Test Case Class.
- Trong choose options, type class name: CarTests and press Next
- Chú ý Target mình chọn phải là target [TênProject]Tests.
6. Customize CarTests
6.1 Import @testable vào trong class CarTests
import XCTest
@testable import UnitTest
6.2 Khai bao những điều mà bạn muốn test. Chúng ta sẽ khai báo implicitly unwrapped optionals (!) vì tại thời điểm test thì các property chắc chắn phải có giá trị .
class CarTests: XCTestCase {
var ferrari:Car!
var jeep:Car!
var honda:Car!
}
6.3 Override method setup()
Car sẽ được setup với types and transmission mode tương ứng.
override func setUp() {
super.setUp()
ferrari = Car(type: .Sport, transmissionMode: .Drive)
jeep = Car(type: .OffRoad, transmissionMode: .Drive)
honda = Car(type: .Economy, transmissionMode: .Park)
}
6.4 Override method tearDown() Chúng ta muốn chắc chắn mọi thứ sẽ được clear khi test kết thúc. Mình sẽ gán nil cho các property cho class CarTests.
override func tearDown() {
super.tearDown()
ferrari = nil
jeep = nil
honda = nil
}
7. Viết thử một Unit test.
Viết đoạn code test dưới đây:
func testSportFasterThanJeep() {
let minutes = 60
//1 start ferrari
ferrari.start(minutes: minutes)
//2 start jeep
jeep.start(minutes: minutes)
//Test it
XCTAssertTrue(ferrari.miles > jeep.miles)
}
Giờ hãy thử chạy test case này bằng cách click vào nút kim cương ở bên trái của func trên.
Tài liệu tham khảo:
https://medium.com/@enricopiovesan/unit-testing-in-swift-tutorial-92daab95246b