XCTest-2-快速开始

此快速入门的目的是说明你可以将测试作为软件开发的一个组成部分,并且测试方便,易于使用。

介绍测试导航器

当您使用测试时,经常使用Xcode测试导航器。

测试导航器是工作空间的一部分,旨在简化创建,管理,运行和查看测试的能力。您可以通过单击导航器选择器栏中位于问题导航器和调试导航器之间的图标来访问它。当您有一个定义了一组测试的项目时,您将看到类似于此处所示的导航器视图。

导航器视图

上面显示的测试导航器显示包含在示例项目中的测试包,类和方法的分层列表。这个特定的项目是一个示例计算器应用 计算器引擎被实现为框架。您可以在层次结构的顶层查看SampleCalcTests测试包,以测试应用程序中的代码。

注意: Xcode测试目标生成测试导航器中显示的测试包。
如果您的测试使用资产数据文件,图像等等 - 它们可以添加到测试包,并在运行时使用NSBundleAPI 访问。使用类方法bundleForClass:与你的测试类,确保您获得正确的包来检索资产。
Xcode方案控制什么是内置的。方案还控制哪些可用的测试方法为测试操作执行。您可以选择性地启用和禁用测试包,类和方法,方法是按住Control键并单击测试导航器列表中的项目,然后从快捷菜单中选择启用或禁用,从而启用或禁用方案中的项目。
此视图中的活动测试包是SampleCalcTests。SampleCalcTests包括一个测试类,其又包含九个测试方法。


从文档截的图

当将指针保持在列表中的任何项目上时,运行按钮()显示在项目名称的右侧。这是一个快速的方法来运行所有的测试在一个包,所有的测试在类,或任何单独的测试。测试将通过或失败的结果返回到Xcode。当测试正在执行时,这些指示器更新以显示结果,绿色复选标记为通过,红色x为失败。在这里显示的测试导航器中,其中两个测试声明了一个失败。

失败和成功的示意图

单击列表中的任何测试类或测试方法将在源代码编辑器中打开测试类。测试类和测试方法在源编辑器槽中标记有指示符,其工作方式与在测试导航器中相同。测试失败在源编辑器中的相关断言处显示结果字符串。
在测试导航器的底部是添加按钮(+)以及过滤控件。您可以将视图缩小为仅在活动方案中测试或仅测试失败,也可以按名称进行筛选。

将测试添加到您的应用程序

在Xcode 5或更高版本中创建的新应用程序,框架和库项目都已预先配置了测试目标。当您开始一个新项目并打开测试导航器时,您将看到测试包,测试类和模板测试方法。但是你可能从尚未定义测试目标的Xcode的早期版本打开一个预先存在的项目。这里介绍的工作流程假设了一个没有测试的预先存在的项目。

创建测试目标

打开测试导航器,单击左下角的添加按钮(+),然后从菜单中选择新建单元测试目标。

新建测试目标,也是文档里面截图

从下一个对话框中选择macOS或iOS单元测试包,然后单击下一步。在出现的新目标设置助手中,根据您的首选项和需要编辑产品名称和其他参数。

设置参数

单击完成以将包含模板测试类和两个测试方法模板的目标添加到测试导航器视图。

添加完成之后的示意图

运行测试并查看结果

现在你已经添加了测试到你的项目,你想开发测试来做一些有用的事情。但首先,将指针保持SampleCalcTests在测试导航器中的测试类上,然后单击运行按钮以运行类中的所有测试方法。结果通过功能名称旁边和源编辑器排水槽中的绿色复选标记指示。

点击左边的那个菱形就可以测试了,绿色表示测试通过

模板单元和性能测试都是空的,这就是为什么他们发布成功的迹象; 没有失败。请注意图中第34行的灰色菱形measureBlock:。单击这个按钮将显示“性能结果”面板。

性能测试结果示意图

此面板允许您设置性能基线以及编辑基线和最大STDDEV参数。这些特征将在后面讨论。

编辑测试并再次运行

因为这个示例项目是一个计算器应用程序,所以要检查它是否正确执行加,减,乘,除运算,以及测试其他计算器函数。由于测试是在应用程序项目中构建的,因此您可以添加所有上下文和其他信息,以便在任何复杂级别执行测试,满足您的需求。创建测试是向单元测试实现文件中添加方法的问题。

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

import <XCTest/XCTest.h>

//

// 导入应用程序的头文件

import "CalcViewController.h"

import "CalcAppDelegate.h"

@interface CalcTests : XCTestCase {

// 把实例变量添加到CalcTests类

@private

NSApplication *app;

CalcAppDelegate *appDelegate;

CalcViewController *calcViewController;

NSView *calcView;

}

@end


不知道怎么样吧代码显示的好看一些,只能这样了,图片是文档中的截图

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

  • (void)testAddition

{

//获取用于测试访问的应用程序变量

app = [NSApplication sharedApplication];

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

calcView = calcViewController.view;

//执行两个附加测试

[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。”);

}}

testAddition以及该测试方法的实现

请注意,测试导航器中的列表已更改,以反映示例测试方法,testExample已替换为testAddition。

testExample已替换为testAddition

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

运行结果示意图

如您所见,断言失败,并在测试导航器和源代码编辑器中突出显示。看看源代码,第1部分成功了 - 它是第2部分有问题。仔细检查,错误是明显的:在第76行,[calcView viewWithTag:11]是一个关闭性质的代码,它应该是[calcView viewWithTag:12]。更正此错误可解决问题,测试成功。

纠正错误之后的成功的示意图

对普通代码使用setUp()和tearDown()方法

Xcode为活动测试包中的所有测试类一次运行一个测试方法。在这个小例子中,只有一个测试方法在测试类中实现,并且它需要访问三个计算器应用程序变量对象才能运行。如果在同一个类中编写了四个或五个测试方法,您可能会发现在每个测试方法中重复相同的代码,以获取对应的app对象状态。该XCTest框架为您提供了实例方法用于测试类setUp和tearDown,你可以用它来把之前和运行每个测试方法运行后调用这些共同的代码。

使用setUp和tearDown简单。从testAddition源代码中Mac_Calc_Tests.m,剪切四行// obtain the app variable for test access,并将它们粘贴到setUp模板提供的默认实例方法中。

  • (void)setUp

{

[super setUp];

// Put setup code here。在调用类中的每个测试方法之前调用此方法。

//获取用于测试访问的应用程序变量

app = [NSApplication sharedApplication];

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

calcView = calcViewController.view;

}}

set Up方法

现在添加更多的测试方法 - testSubtraction和其他方法-- 用最少的重复代码。

testSubtraction和其他方法

概要

从这个简短的快速入门可以看出,向项目添加测试很简单。这里有一些事情要注意:

Xcode设置了大部分的基本测试配置。当您向项目添加新的测试目标时,Xcode会自动将其添加到相关产品定位的方案中。具有单个测试方法的初始测试类与目标一起添加,并且可以在测试导航器中找到。

测试导航器使您可以轻松地定位和编辑测试方法。当测试类实现打开时,您可以使用测试导航器中的指示器按钮或直接从源代码编辑器立即运行测试。当测试失败时,测试导航器中的指示器将与源编辑器中的故障标记配对。

单个测试方法可以包括多个断言,导致单个通过或失败结果。这种方法使您能够根据项目的需要创建简单或非常复杂的测试。

在setup与tearDown实例方法为您提供了一种因素很多测试方法的一致性,更容易调试使用的通用代码。

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

推荐阅读更多精彩内容