Search code examples
objective-cxcodexctestxcuitest

How to extract performance metrics measured by measureBlock in XCTest


I have a simple test function which will tap a button an measure the performance. I'm using XCTest. After measureBlock returns I can see a bunch of perf-metrics on the console. I would like to get this within the test-program such that I can populate the data somewhere else programmatically. Watching the test data on test-console is proving to be slow because I have a lot of test-cases.

- (void)testUseMeasureBlock {
    XCUIElement *launchTest1Button = [[XCUIApplication alloc] init].buttons[@"Launch Test 1"];
    void (^blockToMeasure)(void) = ^void(void) {
        [launchTest1Button tap];
    };
    // Run once to warm up any potential caching properties
    @autoreleasepool {
        blockToMeasure();
    }

    // Now measure the block
    [self measureBlock:blockToMeasure];
    /// Collect the measured metrics and send somewhere.

When we run a test it prints:

measured [Time, seconds] average: 0.594, relative standard deviation: 0.517%, values: [0.602709, 0.593631, 0.593004, 0.592350, 0.596199, 0.593807, 0.591444, 0.593460, 0.592648, 0.592769], 

If I could get the average time, that'd be sufficient for now.


Solution

  • There's a private instance variable __perfMetricsForID of XCTestCase store the result. And you can access it by call

     NSDictionary* perfMetrics = [testCase valueForKey:@"__perfMetricsForID"];
    

    the result is just like this:enter image description here