我可以使用 XCTest 测试我的应用程序中某个部分的性能吗?

Posted

技术标签:

【中文标题】我可以使用 XCTest 测试我的应用程序中某个部分的性能吗?【英文标题】:Can I test performance of one section in my application with XCTest? 【发布时间】:2016-08-12 11:20:49 【问题描述】:

由于我对UNIT testing 和 Xcode XCTest 目标有点了解,我想知道在我的项目中,有一个部分包含许多 animations 和许多服务以及那里的 database 进程,所以如何在XCTest 中测量该屏幕的性能?

【问题讨论】:

【参考方案1】:

XCTestCase中有衡量性能的方法:measure和measureMetrics。

这些方法执行块内的代码十次,并报告各个执行时间、平均时间和偏差。他们还为每个测试设备设置了基线,如果您的代码的测量部分在未来变得明显变慢,则报告测试失败。

单元测试用例文件的 Xcode 模板底部有一个性能测试方法示例:

class CoreDataTestTests: XCTestCase 

    func testPerformanceExample() 
        self.measure 
            // Put the code you want to measure the time of here.
        
    

【讨论】:

所以在这里我需要测量我的动画 + 数据库数据获取速度,所以我需要将该代码放在这个测量块中,或者只是通过 XCTest 类调用该函数? 将代码保留在原处,并从测试方法的测量块中调用该函数。被测方法需要是公共的或内部的(如果是内部的:使用@testable 导入其模块)。通过单击断点槽中的小菱形运行测试,或使用 Product->Test 菜单命令运行所有测试。对于动画性能,您可能还想检查 Instruments,有一些用于动画性能分析的工具。 感谢您的回答,让我检查一下。 @CodeChanger - 请注意您的动画是异步运行的,因此您需要使用 XCTestExpectation 和 waitForExpectation,否则您的测试将在异步代码之前完成。【参考方案2】:

这取决于你想对结果做什么。

如果您想通过某种基准测试来测试您的函数的性能,以查看更改该代码后事情是变慢还是变快,请查看nils 的建议。

如果您想知道处理时间的原因,最好使用Instruments 获得准确的测量结果。您可以使用Profilecommand+iProduct 菜单运行仪器。

选择time profiler 并在设备上运行该进程(使用红色圆圈按钮)。请注意,启用一些设置有助于更清楚地查看数据。

像用户一样使用您的应用,并实时观察调用树,因为它显示了哪些函数占用了最多的处理器时间。

从这里您可以看到可能需要优化的内容等。

注意:您可能需要在构建设置中启用 dSYM,以便在跟踪中获取符号而不是随机内存偏移。

Instruments 是一个很好的工具,可以帮助您了解您的应用中发生了什么。可以查看CPU核心使用率、线程使用率、线程等待等。

【讨论】:

以上是关于我可以使用 XCTest 测试我的应用程序中某个部分的性能吗?的主要内容,如果未能解决你的问题,请参考以下文章

iOS:如何在设备上运行 XCTest?

无法从 XCTest 访问应用程序代码

从 XCTest 覆盖中忽略视图控制器

是否可以在 IOS 的 XCTest 单元测试用例中模拟方法(带参数)调用

在 XCTest 的 UI 测试中从 TextView 获取文本

XCTest UI 测试 - 拖放