Mobile Development 15 min read

Mastering iOS SDK Testing: From KIF Setup to Automated CI

This article explains the inner workings of GrowingIO's iOS data‑collection SDK, outlines a focused testing strategy on no‑beacon events, guides the selection of the KIF automation framework, and details step‑by‑step setup, test case implementation, coverage reporting, and CI integration for reliable SDK validation.

GrowingIO Tech Team
GrowingIO Tech Team
GrowingIO Tech Team
Mastering iOS SDK Testing: From KIF Setup to Automated CI

1. How does the data collection SDK work?

GrowingIO's data‑collection SDK supports both no‑beacon (full‑trace) and beacon‑based event collection. When a user opens the app, navigates pages, or interacts with UI elements, the no‑beacon module automatically records actions to local storage, while beacon events are triggered via explicit SDK API calls. A data‑sending module then batches events, compresses and obfuscates them to save bandwidth and improve security before sending them via HTTP API, handling retries for network failures.

2. How to test?

The data‑sending module is stable, so testing concentrates on the data‑collection part, especially no‑beacon collection. Create a demo app with various pages and UI elements, perform interactions, and verify the captured event data either by inspecting logs or by capturing network traffic. Log inspection is preferred due to its simplicity.

Event logs contain many fields, many of which are not human‑readable, making manual verification time‑consuming. Therefore, automated testing is essential.

3. Choosing a test framework

When selecting a UI automation framework for iOS, consider development cost, maintenance stability, source‑code access, WebView support, OS and tool compatibility (iOS 8+), execution efficiency, reporting features, CI integration, etc.

Development cost (language support, debugging, code completion)

Maintenance cost (framework stability)

Source‑code requirement

WebView support

OS and tool support (iOS 8 compatibility)

Test execution efficiency

Reporting (screenshots, coverage, …)

CI support

After evaluating options, the KIF framework was chosen because it uses Objective‑C (the same language as the SDK), integrates with XCTest, supports CI, is actively maintained, and offers good extensibility.

4. Implementing automated testing

Language & Tools

Language: Objective‑C

IDE: Xcode

Test framework: KIF

Setting up the test target

1. In Xcode, add a new UI Testing Bundle target (File → New → Target → iOS → UI Testing Bundle).

2. Configure the target name, organization identifier, language (Objective‑C), and the app to be tested.

3. Install CocoaPods and add dependencies:

sudo gem install cocoapods
target 'GrowingIOTest' do
  pod 'SDCycleScrollView', '~> 1.75'
  pod 'MJRefresh'
  pod 'MBProgressHUD'
end

target 'GIOAutoTests' do
  pod 'KIF', '~> 3.5.1'
end

4. Run pod install to fetch the pods. pod install Writing a test case

The typical test flow includes preparing the environment, executing steps, asserting results, reporting, and cleaning up. Below is an example that verifies a dialog button click generates the correct clck event.

- (void)setUp {
   // initialization code
}

- (void)tearDown {
   // cleanup code
}

- (void)testDialogBtnCheck {
    /**
     function: verify dialog button click event
    */
    [[viewTester usingLabel:@"UI界面"] tap];
    [tester scrollViewWithAccessibilityLabel:@"CollectionView" byFractionOfSizeHorizontal:0.0f vertical:10.0f];
    [tester waitForTimeInterval:1];
    [[viewTester usingLabel:@"LabelAttribute"] tap];
    [[viewTester usingLabel:@"ShowAlert"] tap];
    [tester waitForTimeInterval:1];
    [[viewTester usingLabel:@"取消"] tap];
    [tester waitForTimeInterval:3];
    NSArray *clckEventArray = [MockEventQueue eventsFor:@"clck"];
    if (clckEventArray.count >= 2) {
        NSDictionary *event = [clckEventArray objectAtIndex:clckEventArray.count-1];
        NSDictionary *checkResult = [NoburPoMeaProCheck ClckEventCheck:event];
        XCTAssertEqual(checkResult[@"KeysCheck"][@"chres"], @"Passed");
        NSLog(@"Dialog button click event test passed---Passed!");
    } else {
        NSLog(@"Dialog button click event test failed:%@!", clckEventArray);
        XCTAssertEqual(1, 0);
    }
}

5. Running tests and generating reports

Install Command Line Tools if not already present: xcode-select --install Make the scheme shared (Product → Scheme → Manage Schemes). Execute all tests via:

xcodebuild -workspace Growing.xcworkspace \
    -scheme GrowingIOTest test \
    -sdk "iphonesimulator13.5" \
    -destination platform='iOS Simulator',OS=13.5,name='iPhone 11'

Run a single test case:

xcodebuild -workspace Growing.xcworkspace \
    -scheme GrowingIOTest test \
    -only-testing:GIOAutoTests/ClckEventsTest/test7DialogBtnCheck \
    -sdk "iphonesimulator13.5" \
    -destination platform='iOS Simulator',OS=13.5,name='iPhone 11'

Use xcpretty to format output and generate an HTML report:

# install xcpretty
gem install xcpretty

xcodebuild -workspace Growing.xcworkspace -scheme GrowingIOTest test \
    -sdk "iphonesimulator13.5" -destination platform='iOS Simulator',OS=13.5,name='iPhone 11' \
    | xcpretty --report html

6. Coverage statistics

Since KIF is built on XCTest, Xcode's built‑in code‑coverage tools can be used. Enable Code Coverage in the scheme settings and add the target to be measured.

7. Continuous integration

Integrate the automated tests into CI (e.g., Jenkins). On each commit, Jenkins pulls the latest code, runs the test suite via the commands above, collects the HTML report, and notifies the team through a messaging bot, enabling rapid feedback and quicker issue resolution.

8. Conclusion

The article presented the architecture of GrowingIO’s iOS data‑collection SDK, a focused testing strategy on no‑beacon events, the rationale for choosing KIF, detailed setup steps, example test cases, coverage measurement, and CI integration, providing practical guidance for engineers responsible for SDK testing.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

mobile developmentiOSKIF
GrowingIO Tech Team
Written by

GrowingIO Tech Team

The official technical account of GrowingIO, showcasing our tech innovations, experience summaries, and cutting‑edge black‑tech.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.