翻译:使用Xcode测试(一)——快速入门(Quick Start)

这个快速入门的目的是告诉你可以在开发项目中加入测试,使测试更加简单方便。

介绍测试导航(test navigator)

当进行测试时,你会经常使用到Xcode的测试导航(test navigator)。
测试导航(test navigator)是workspace的一部分,使创建、管理、运行和评估测试更加加单。通过点击导航选择栏中的图标进入测试,该图标在问题导航和调试导航之间。当项目中有一系列定义的测试,你会看到如下图所示的导航视图。

导航视图

上面展示的测试导航(test navigator)包含示例项目测试包(test bundle)、类和方法。这个项目是一个计算器app的示例。计算引擎作为一个框架。你可以在SampleCalcTests测试的顶层看到用于测试应用的代码。

注意:Xcode 测试目标(target)生成的测试包(test bundle)显示在测试导航(test navigator)处。

如果测试使用asset数据文件、图像,可以将它们添加到测试包(test bundle)中,运行时使用NSBundle API访问。使用测试类+[NSBundle bundleForClass:]的确保获得正确bundle来检索asset。更多信息,参见NSBundle类引用(NSBundle Class Reference)。

Xcode中的scheme控制built的内容。scheme还控制哪个可用的测试方法执行测试操作。可以单击测试导航(test navigator)列表中的项目,启用或禁用测试包(test bundle)、类和方法。从快捷菜单中选择启用或禁用,从而启动或禁用scheme中的项目。

在这个视图的的测试包(test bundle)是SampleCalcTests。SampleCalcTests包括一个测试类,这个测试类包含九个测试方法。当将指示放在列表中的任何像时,该项目名称的右侧显示为运行按钮()。这种方法可以快速的运行bundle中的所有测试,类中的所有测试或其他单独的测试。测试返回通过或失败的结果到Xcode。测试被执行,这些指标会更新告知你结果,绿色的复选表示通过,红色的x表示失败。如测试导航(test navigator)所示,两个测试断言失败。

测试导航

在源编辑器打开测试类,点击展开列表中的任何测试类或测试方法。在源代码编辑器中测试类和测试方法同样被标记,这与测试导航(test navigator)中的方法相同。测试失败时,在源代码编辑器中显示相关断言的结果字符串。

在测试导航(test navigator)的底部有添加按钮(+)和过滤控制。可以将视图缩小到只有scheme或失败的测试,你也可以通过名称筛选。

有关测试导航(test navigator)操作的详细信息,参见测试导航(test navigator)帮助(测试导航(test navigator) Help)。

添加测试到app

Xcode5或更高版本中创建的新app,框架和library项目预先配置了测试目标(target)。当你开始使用一个新项目,打开测试导航(test navigator),你可以看到测试包(test bundle),测试类和测试方法模板。但你可能在较早版本的Xcode中打开一个已经存在的项目,还没有定义测试目标(target)。这里展示了一个已经存在、并没有加入测试的项目添加测试的流程。

创建测试目标(target)

当打开测试导航(test navigator),单击左下角添加按钮(+),从菜单中选择新的单元测试目标(target)。

创建测试目标

在下一个对话框中选择OS X或iOS单元测试包(test bundle)并单击下一步。在出现的新目标(target)设置助理,编辑产品名称和其他你需要的参数。

设置

单击完成,添加目标(target),它包含一个模板测试类和两个测试方法模板,测试导航(test navigator)图。

测试导航
运行测试并查看结果

现在,你已经往项目中添加测试,你希望开发测试做一些有用的事情。首先,将指示放在测试导航(test navigator)中的SampleCalcTests测试类,点击运行按钮运行该类中的所有方法。在函数名旁边的源代码编辑器中有绿色勾标记结果。

绿色勾标记

模版单元和性能测试都是空的,这表明成功,没有失败的断言。注意34行measureBlock:方法旁边的灰色钻石图标。点击钻石图标显示性能结果面板。

性能结果面板

这个面板允许你设置性能基准线,并允许你编辑基准线和最大标准差参数。这些功能在之后讨论。

编辑测试并再次运行

因为示例项目是计算器app,你希望检查它是否正确执行加法、减法、乘法和除法运算,以及测试计算器的其他计算功能。因为测试是建立在应用项目上,你可以添加所有上下文或其他需要的信息进行测试。创建测试其实就是往单元测试实现问价中添加方法。

例如,往SampleCalcTests.m文件中插入如下的 #import和实例变量声明。

<pre><code>
\#import <XCTest/XCTest.h>

//

// Import the application specific header files

\#import "CalcViewController.h"

\#import "CalcAppDelegate.h"

@interface CalcTests : XCTestCase {

// add instance variables to the CalcTests class

@private

NSApplication       *app;

CalcAppDelegate     *appDelegate;

CalcViewController  *calcViewController;

NSView              *calcView;

}

@end
</pre></code>

然后给测试方法一个描述性名称,例如testAddition,并为该方法添加实现源代码。

<pre><code>
-(void) testAddition

{

// obtain the app variables for test access

app = [NSApplication sharedApplication];

calcViewController = (CalcViewController*)[[NSApplication sharedApplication]
delegate];

calcView = calcViewController.view;

// perform two addition tests

[calcViewController press:[calcView viewWithTag: 6]]; // 6

[calcViewController press:[calcView viewWithTag:13]]; // +

[calcViewController press:[calcView viewWithTag: 2]]; // 2

[calcViewController press:[calcView viewWithTag:12]]; // =

XCTAssertEqualObjects([calcViewController.displayField stringValue], @"8", @"Part 

1 failed.");

[calcViewController press:[calcView viewWithTag:13]]; // +

[calcViewController press:[calcView viewWithTag: 2]]; // 2

[calcViewController press:[calcView viewWithTag:12]]; // =

XCTAssertEqualObjects([calcViewController.displayField stringValue], @"10", 

@"Part 2 failed.");

}
</pre></code>

注意,在测试导航(test navigator)中的列表改变,反映示例测试方法,即testExample变为testAddition。

测试导航

现在使用测试导航(test navigator)中的运行按钮(或源代码编辑器中的指示)来运行testAddition方法。

断言失败

正如你看到的,一个断言失败了,在测试导航(test navigator)和源代码编辑器中高亮显示。查看源代码,Part 1成功,Part 2出现问题。仔细检查,错误是显而易见的:在76行,应该是 [calcView viewWithTag:12],而不是[calcView viewWithTag:11]。纠正这个错误,测试成功。

测试成功
使用setUp()和 tearDown()方法

Xcode可以一次运行测试包(test bundle)中所有测试类中的测试方法。在这个小例子中,在测试类中只实现了一个测试方法,它需要访问计算器app中三个变量对象。如果你在同一个类中写了四个或五个测试方法,你会发现在每个测试方法中都有相同的代码,访问app对象状态。XCTest 框架提供了测试类的实例方法,setUp和tearDown,分别在运行普通代码前调用,在每个测试方法运行后调用。

setUp和tearDown的使用很简单。在Mac_Calc_Tests.m文件中的testAddition,剪切从// obtain the app variable for test access 开始的四行代码,并将其粘贴到模版中默认setUp实例方法中。

<pre><code>
-(void)setUp

{

[super setUp];

// Put setup code here. This method is called before the invocation of each test 

method in the class.

// obtain the app variables for test access

app = [NSApplication sharedApplication];

calcViewController = (CalcViewController*)[[NSApplication sharedApplication]
delegate];

calcView = calcViewController.view;

}

</pre></code>

现在添加更多测试方法testSubtraction及其他方法,这样可以使用最少重复代码。

测试导航

总结

正如你看到的快速入门,往项目中添加测试非常简单。这里有一些需要注意的:

  • Xcode设置最基本的测试配置。当你往项目中添加一个新的测试目标(target),Xcode自动将其添加到相关产品目标(target)的scheme中。该目标(target)中会添加只有一个测试方法的初始测试类,可以在测试导航(test navigator)中看到。

  • 测试导航(test navigator)让你轻松定位和编辑测试方法。想要立即运行测试,可以使用测试导航(test navigator)中的指示按钮或者当测试类的实现是公开的,直接从源代码编辑器处运行。当测试失败,测试导航(test navigator)中的指示与源代码编辑器中的失败标记相匹配。

  • 一个测试方法可以包含多个断言,只有一个结果通过或失败。这种方法使你可以根据项目需求,创建简单或者非常复杂的测试。

  • setup和tearDown实例方法提供一种方法,使许多测试方法中使用的普通代码保持一致性,同时易于调试。

官方原文地址:

https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/02-quick_start.html#//apple_ref/doc/uid/TP40014132-CH2-SW1

推荐阅读更多精彩内容