首页 > 解决方案 > Xcode XCTest 使用异步队列测量性能

问题描述

我为我的应用程序编写的框架会下载不同的数据块并进行处理。自然,更大的数据集需要更多的时间来处理。为了更好地研究如何改进,我考虑编写测试来衡量性能,看看哪里/是否值得研究。

通常,measure块工作,但是,为了避免阻塞主线程,我异步处理数据。因此,我无法测量“从头到尾”,因为该measure块忽略异步块并在我的异步队列完成处理所有数据之前完成测试。

我写了一个最小的例子来说明我的意思。

DownloadHandler是在我的框架中接收数据的类。Database是我的应用程序和模型中的一个类,数据最终会在其中得到处理。在我的应用程序中,AppDelegate 连接了这两者,但为了测试,Test 类在这种情况下执行此操作。

这是正在发生的事情的控制台输出:

File A
Sent A to Database

File B
Sent B to Database

File C
 Processed file A in Database 
 Processed file B in Database 
Sent C to Database
[End of Test]

但我需要的是等待测试让队列在停止之前完成所有数据的处理。换句话说,它缺少决赛

 Processed file B in Database 

您将在下面找到我的示例代码来演示。对于不同目的的不同处理程序,实际实现要复杂得多,但我用usleep

下载处理程序.swift

import Foundation

public protocol HandlerDelegate {
    func interpretData(s: Character)
}

class DownloadHandler {
    
    var delegate: HandlerDelegate!
    
    func receivedFiles(files: String) {
        
        for file in files {
            print("\nFile \(file)")
            usleep(100000)
            delegate.interpretData(s: file)
            print("Sent \(file) to database")
        }
    }
    
}

数据库.swift

class Database {
    
    let serialQueue = DispatchQueue(label: "databaseSerial")
    
    var entries = [Character]()
    
    func interpretData(s: Character) {
        serialQueue.async {
            usleep(100000)
            self.entries.append(s)
            print(" Processed file \(s) in database")
        }
    }
    
}

TestFrameworkTests.swift

import XCTest
@testable import TestFramework

class TestFrameworkTests: XCTestCase, HandlerDelegate {
    
    func interpretData(s: Character) {
        database.interpretData(s: s)
    }
    
    var handler = DownloadHandler()
    var database = Database()
    
    var testData = "ABC"

    func testPerformanceExample() throws {
        
        handler.delegate = self
        
        let options = XCTMeasureOptions()
        options.iterationCount = 0

        measure(options: options) {
            print("\n\nTEST ITERATION")
            handler.receivedFiles(files: testData)

        }
    }

}

我想有一些我不知道的 XCTest 功能,但我无法围绕要搜索的内容来寻找我可以适应的东西。

标签: iosswiftunit-testingxctest

解决方案


推荐阅读