这个快速入门的目的是告诉你可以在开发项目中加入测试,使测试更加简单方便。
介绍测试导航(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实例方法提供一种方法,使许多测试方法中使用的普通代码保持一致性,同时易于调试。
网友评论