在Xcode 5中,是否有可能在Instruments下运行基于XCTest的测试?

25

看着XCTest和Xcode 5的单元测试,不知道如何在Xcode 5下使用Instruments运行我的单元测试...

具体来说,我想在测试期间查找泄漏(尽管在这种情况下不需要自动化,但显然这将很有用)。

有可能实现吗?


1
请注意 @quelish 的下面的答案。现在可以通过测试本身的上下文菜单在Xcode 7中使用 - 感谢Xcode团队! - Dad
5个回答

65

在 Xcode 中,在测试导航器中右键单击您的测试,然后选择“分析“TestName”:

instruments profile unit test memory


2
是的!功能请求已经实现了!现在可以在Xcode中使用。(在Xcode 5中没有此功能)感谢您指出这个问题,让其他可能会遇到类似问题的人知道。 - Dad
4
似乎在使用Xcode 8时遇到了问题。菜单项仍然存在,但Instruments只显示“所有进程”,而Xcode无法开始测试。 - fzwo
在Xcode 8中,这可能只能与UI测试一起始终正常工作。 - quellish
"安装请求的应用程序失败。""在提供的路径中找不到应用程序。" Xcode 10.2.1。解决方案是我需要将我们的应用程序添加到测试方案的配置文件部分。但仍然不是100%。 - Alex Zavatone
这个程序为我启动了工具,但似乎没有进一步操作。没有明显的错误。它提示我选择一个模板,打开一个新文档,然后...什么都没有发生。Xcode 12.4在Bug Sur上。 - Rick

28

我认为这是最简单的方法:

  1. 在测试中设置断点(我通常在setup方法中设置)
  2. 在Instruments中打开一个新文档
  3. 运行应用程序,并确保它停在断点处
  4. 从Instruments的Target下拉菜单中选择Attach to Process,然后向下滚动到你的进程
  5. 点击record按钮,然后在XCode中继续执行

我也遇到了同样的问题。我的单元测试中出现了僵尸进程,但我无法确定是什么原因导致的。我应该选择哪个进程? - Fergal Rooney
@FergalRooney 这将是你的应用程序名称。这是我创建的一个名为ShapeAnimationTest的测试项目附加它的截图。我忘了在我的原始答案中提到,您需要在找到它之前运行应用程序。 - psobko
1
谢谢提供截图。我按照你列出的步骤选择了我的应用程序,但是当我运行工具并在设置断点后继续测试时,我没有看到任何分配列表。似乎根本没有对应用程序进行分析。 - Fergal Rooney
不错!去年我用SenTest回答了同样的问题,可惜我从没看到过这个 - https://dev59.com/mGgu5IYBdhLWcg3w8bds#17789641 - Daniel Galasko
似乎这是我在Xcode 13.4.1上能够使单元测试分析工作的唯一方法。我尝试了Xcode的“Profile <test case>”选项,但似乎在通过Instruments启动时几秒钟后应用程序启动就会终止。 - Bugmeister
显示剩余3条评论

10

以下是在Xcode 6下正确的操作方式:

1)在您的Xcode项目中,展开“Products”文件夹,在“.xctest”产品上单击右键,并最后选择上下文菜单中的“在Finder中显示”。

2)启动Instruments并使用所选模板创建新文档。

3)为文档执行“选择目标...”

4)导航并选择Xcode用于运行测试的工具,位于/Applications/Xcode.app/Contents/Developer/usr/bin/xctest (您可以在终端中使用xcrun -f xctest 找到此位置)- 您需要启用“遍历包”以浏览Xcode应用程序内部。

5)从Finder拖放“.xctest”产品到步骤1中显示的“参数”字段中 - 这将输入其绝对路径。

6)单击“选择”。

现在您已准备好从Instruments运行单元测试了!

enter image description here


4

我基于正在测试的Mac应用程序目标创建了一个新目标,然后将xctest类添加到要编译的文件中。

然后将 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks/XCTest.framework 添加到要链接的框架中。

接下来将其路径 $(DEVELOPER_DIR)/Platforms/MacOSX.platform/Developer/Library/Frameworks 添加到Runpath搜索路径中。

然后在main.m中添加以下内容:

    XCTestSuite *suite = [XCTestSuite testSuiteWithName:@"My tests"];
    [suite addTest:[VideohogCachingTest testCaseWithSelector:@selector(testCompleteSequentialText)]];
    [suite run];

这个命令在类 VideohogCachingTest 上运行了测试 testCompleteSequentialText,并以普通应用程序的方式运行,因此允许我通过 command+R 或在此情况下进行分析 with command+I 来运行测试。然后我可以捕获僵尸进程并跟踪问题,这是以前不可能的。

如果您想运行所有测试,可以执行以下操作:

XCTestSuite *suite = [XCTestSuite defaultTestSuite];
[suite run];

1
这对我很有帮助,因为似乎你必须编译以进行剖析才能在分配中获取Swift符号。请注意,我还必须将该路径添加到框架搜索路径中,并编辑方案以使Profile使用Debug配置。 - tmandry

0

Profile提示到Instruments,例如Activity MonitorAllocationsTime Profiler等。

有几个注意事项:

应用程序

  • Activity Monitor仅适用于真实设备

单元测试包

  • 仅适用于模拟器
  • Activity Monitor不可用

UI测试包

  • 无法进行分析

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接