此快速入门的目的是说明你可以将测试作为软件开发的一个组成部分,并且测试方便,易于使用。
介绍测试导航器
当您使用测试时,经常使用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。”);
}}
请注意,测试导航器中的列表已更改,以反映示例测试方法,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;
}}
现在添加更多的测试方法 - testSubtraction和其他方法-- 用最少的重复代码。
概要
从这个简短的快速入门可以看出,向项目添加测试很简单。这里有一些事情要注意:
Xcode设置了大部分的基本测试配置。当您向项目添加新的测试目标时,Xcode会自动将其添加到相关产品定位的方案中。具有单个测试方法的初始测试类与目标一起添加,并且可以在测试导航器中找到。
测试导航器使您可以轻松地定位和编辑测试方法。当测试类实现打开时,您可以使用测试导航器中的指示器按钮或直接从源代码编辑器立即运行测试。当测试失败时,测试导航器中的指示器将与源编辑器中的故障标记配对。
单个测试方法可以包括多个断言,导致单个通过或失败结果。这种方法使您能够根据项目的需要创建简单或非常复杂的测试。
在setup与tearDown实例方法为您提供了一种因素很多测试方法的一致性,更容易调试使用的通用代码。