Unit Test cho thư viện CocoaPods bằng Podspec

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 ảomá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:

  1. What language do you want to use? Chọn Swift.
  2. Would you like to include a demo application with your library? Chọn Yes để tạo một ứng dụng ví dụ.
  3. Which testing frameworks will you use? Chọn QuickNimble để cài đặt hai framework hỗ trợ viết test.
  4. 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à QuickNimble.

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ư QuickNimble, đồ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
  1. Trong Xcode, chọn scheme của MyLibraryTests từ menu scheme (ở góc trái trên cùng).
  2. Chọn một thiết bị máy ảo (simulator) từ danh sách thiết bị.
  3. 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
  1. Kết nối thiết bị iPhone/iPad của bạn với máy tính.
  2. Chọn thiết bị thật từ danh sách Devices trong Xcode.
  3. 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.

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Related Posts

Unit Test trong Swift với Quick và Nimble

Trong phát triển phần mềm, đảm bảo chất lượng mã nguồn thông qua kiểm thử tự động là một bước quan trọng. Bài viết này sẽ hướng dẫn bạn cách…

Read more
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất
Phản hồi nội tuyến
Xem tất cả bình luận