翻译:使用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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容