Trong bài viết này, bạn sẽ học cách tạo một thư viện CocoaPods, cấu hình Unit Test sử dụng podspec
, cách tích hợp vào dự án chính, và cách chạy Unit Test trên cả máy ảo và máy thật.
1. Khởi tạo dự án thư viện với CocoaPods
Đầu tiên, chúng ta sẽ tạo một thư viện mới bằng lệnh pod lib create
, và sau đó thêm Unit Test.
Bước 1: Cài đặt CocoaPods
Nếu chưa cài đặt CocoaPods, bạn có thể cài đặt nó thông qua RubyGems:
sudo gem install cocoapods
Bước 2: Khởi tạo thư viện với lệnh pod lib create
Lệnh này sẽ giúp bạn tạo cấu trúc dự án cho thư viện mới:
pod lib create MyLibrary
Trong quá trình này, CocoaPods sẽ hỏi một số câu hỏi như sau:
- What language do you want to use? Chọn Swift.
- Would you like to include a demo application with your library? Chọn Yes để tạo một ứng dụng ví dụ.
- Which testing frameworks will you use? Chọn Quick và Nimble để cài đặt hai framework hỗ trợ viết test.
- Các câu hỏi khác, bạn có thể để mặc định hoặc điều chỉnh theo ý thích.
Kết quả, CocoaPods sẽ tạo một dự án với cấu trúc thư mục như sau:
MyLibrary/
├── Example/ # Ứng dụng ví dụ để test thư viện
├── MyLibrary/ # Mã nguồn của thư viện
├── MyLibrary.podspec # File podspec để cấu hình
├── MyLibraryTests/ # Thư mục chứa test case
└── README.md
2. Cấu hình Podspec để hỗ trợ Unit Test
File podspec
đóng vai trò quan trọng trong việc cấu hình thư viện và test. Mở file MyLibrary.podspec
và cập nhật như sau:
Pod::Spec.new do |spec|
spec.name = 'MyLibrary'
spec.version = '0.1.0'
spec.summary = 'A simple Swift library.'
spec.homepage = 'https://github.com/yourusername/MyLibrary'
spec.license = { :type => 'MIT', :file => 'LICENSE' }
spec.author = { 'YourName' => '[email protected]' }
spec.source = { :git => 'https://github.com/yourusername/MyLibrary.git', :tag => spec.version.to_s }
# Cấu hình các file mã nguồn chính của thư viện
spec.source_files = 'MyLibrary/Classes/**/*'
# Cấu hình cho các platform hỗ trợ
spec.platform = :ios, '10.0'
# Phụ thuộc cần thiết (ví dụ nếu thư viện phụ thuộc vào các pod khác)
spec.dependency 'Alamofire'
# Cấu hình cho Unit Test
spec.test_spec 'Tests' do |test_spec|
test_spec.requires_app_host = true
test_spec.source_files = 'MyLibraryTests/**/*'
test_spec.dependency 'Quick'
test_spec.dependency 'Nimble'
end
end
Ở đây:
- spec.test_spec ‘Tests’: Định nghĩa cấu hình cho Unit Test. Tất cả các file test sẽ nằm trong thư mục
MyLibraryTests/
. - test_spec.dependency: Định nghĩa các phụ thuộc cho test, ở đây là
Quick
vàNimble
.
3. Viết Unit Test cho thư viện
Trong thư mục MyLibraryTests
, tạo các file test để kiểm tra mã nguồn của thư viện.
Ví dụ, nếu thư viện của bạn có một lớp Calculator
:
public class Calculator {
public init() {}
public func add(_ a: Int, _ b: Int) -> Int {
return a + b
}
}
Chúng ta có thể viết Unit Test cho lớp này như sau:
import Quick
import Nimble
import MyLibrary
class CalculatorSpec: QuickSpec {
override func spec() {
describe("Calculator") {
var calculator: Calculator!
beforeEach {
calculator = Calculator()
}
it("should return the sum of two numbers") {
let result = calculator.add(2, 3)
expect(result).to(equal(5))
}
}
}
}
4. Cài đặt và chạy Unit Test
Bước 1: Cài đặt các phụ thuộc
Trước khi chạy test, bạn cần cài đặt các phụ thuộc:
cd Example
pod install
Điều này sẽ tải các thư viện cần thiết như Quick và Nimble, đồng thời liên kết với thư viện MyLibrary
của bạn.
Bước 2: Mở file .xcworkspace
Sau khi chạy pod install
, bạn sẽ thấy một file mới có tên MyLibrary.xcworkspace
. Mở nó bằng Xcode để tiến hành kiểm tra và chạy test.
Bước 3: Chạy test trên thiết bị máy ảo
- Trong Xcode, chọn scheme của MyLibraryTests từ menu scheme (ở góc trái trên cùng).
- Chọn một thiết bị máy ảo (simulator) từ danh sách thiết bị.
- Nhấn
Cmd + U
để chạy tất cả các test.
Nếu tất cả test đều thành công, bạn sẽ thấy thông báo test passed trên Xcode.
Bước 4: Chạy test trên thiết bị thật
- Kết nối thiết bị iPhone/iPad của bạn với máy tính.
- Chọn thiết bị thật từ danh sách Devices trong Xcode.
- Nhấn
Cmd + U
để chạy test trên thiết bị thật.
Lưu ý rằng khi chạy test trên thiết bị thật, bạn cần đảm bảo rằng thiết bị đã được cấu hình với các profile phát triển tương thích.
BONUS
Trong quá trình setup unit test trong dự án thật, có thể các bạn sẽ gặp phải một số lỗi như không chạy được unit test, lỗi thư viện Nimble, Quick, chạy unit test trên thiết bị thật bị lỗi. Dưới đây là cách fix của mình, các bạn có thể tham khảo.
Thêm vào Podfile
post_install do |installer|
installer.pods_project.targets.each do |target|
if target.name == "Nimble" || target.name == "Quick"
target.build_configurations.each do |config|
config.build_settings['APPLICATION_EXTENSION_API_ONLY'] = 'YES'
end
end
end
end
# Run unittest on physic device
post_install do |installer|
installer.generated_projects.each do |project|
project.targets.each do |target|
if target.name.include?("AppHost")
target.build_configurations.each do |config|
config.build_settings["DEVELOPMENT_TEAM"] = "UANSY5HQP8"
end
end
if target.name.include?("UnitTest")
target.build_configurations.each do |config|
config.build_settings["DEVELOPMENT_TEAM"] = "UANSY5HQP8"
config.build_settings.delete('CODE_SIGN_IDENTITY[sdk=iphoneos*]')
end
end
end
end
end
5. Tích hợp thư viện vào dự án chính
Sau khi thư viện đã được kiểm thử đầy đủ, bạn có thể tích hợp nó vào các dự án khác bằng cách thêm thư viện vào Podfile
của dự án.
Bước 1: Thêm thư viện vào Podfile
Trong dự án chính của bạn, mở file Podfile
và thêm dòng sau:
pod 'MyLibrary',
:testspecs => ['Tests'],
:path => '../MyLibrary'
Dòng này chỉ ra rằng thư viện MyLibrary
nằm trong thư mục cha so với dự án chính.
Bước 2: Cài đặt thư viện
Chạy lệnh sau để cài đặt thư viện vào dự án chính:
pod install
Sau đó, bạn có thể sử dụng các lớp và hàm trong MyLibrary
trong mã nguồn của dự án chính.
6. Tích hợp CI/CD để tự động chạy Unit Test
Khi bạn phát triển thư viện, việc tích hợp Continuous Integration (CI) sẽ giúp bạn tự động chạy Unit Test mỗi khi có thay đổi trong mã nguồn.
Ví dụ, bạn có thể sử dụng GitHub Actions để cấu hình CI. Dưới đây là một ví dụ cấu hình cho GitHub Actions để tự động chạy test mỗi khi có push lên nhánh main
:
name: CI
on:
push:
branches:
- main
jobs:
test:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
- name: Install CocoaPods dependencies
run: pod install --project-directory=Example/
- name: Run Tests
run: xcodebuild test -workspace Example/MyLibrary.xcworkspace -scheme MyLibrary-Example -destination 'platform=iOS Simulator,name=iPhone 12,OS=14.5'
7. Kết luận
Bằng cách viết Unit Test và cấu hình podspec
đúng cách, bạn có thể đảm bảo rằng thư viện CocoaPods của mình luôn được kiểm thử đầy đủ trước khi phân phối. Việc chạy test trên cả thiết bị ảo và thật giúp bạn kiểm soát tốt hơn chất lượng thư viện khi triển khai lên các môi trường thực tế.
Tích hợp thư viện vào dự án chính cũng rất đơn giản nhờ CocoaPods, và việc cấu hình CI/CD sẽ giúp bạn tự động kiểm tra tính ổn định của thư viện qua từng thay đổi.