>

并且可以点击查看测试结果等澳门博发娱乐官网

- 编辑:澳门博发娱乐官网 -

并且可以点击查看测试结果等澳门博发娱乐官网

自定义测试方法
  • 自定义测试方法必须以test方法名开头,例如testExample
  • 自定义方法必须为void返回类型

断言大部分的测试方法使用断言决定的测试结果。所有断言都有一个类似的形式:比较,表达式为真假,强行失败等。

//通用断言XCTAssert(expression, format...)//常用断言:XCTAssertTrue(expression, format...)XCTAssertFalse(expression, format...)XCTAssertEqual(expression1, expression2, format...)XCTAssertNotEqual(expression1, expression2, format...)XCTAssertEqualWithAccuracy(expression1, expression2, accuracy, format...)XCTAssertNotEqualWithAccuracy(expression1, expression2, accuracy, format...)XCTAssertNil(expression, format...)XCTAssertNotNil(expression, format...)XCTFail(format...) //直接Fail的断言

举个栗子

- testExample { //设置变量和设置预期值 NSUInteger a = 10; NSUInteger b = 15; NSUInteger expected = 24; //执行方法得到实际值 NSUInteger actual = [self add:a b:b]; //断言判定实际值和预期是否符合 XCTAssertEqual(expected, actual,@"add方法错误!");}-(NSUInteger)add:(NSUInteger)a b:(NSUInteger)b{ return a+b;}

从这也能看出一个测试用例比较规范的写法,1:定义变量和预期,2:执行方法得到实际值,3:断言

性能测试性能测试主要使用measureBlock方法 ,用于测试一组方法的执行时间,通过设置baseline和stddev来判断方法是否能通过性能测试。举个栗子:

- testPerformanceExample { // This is an example of a performance test case. [self measureBlock:^{ //Put the code you want to measure the time of here. //你的性能测试的代码放在这里 }];}

直接执行方法,因为block中没有内容,所以方法的执行时间为0.0s,如果我们把baseline设成0.05,偏差10%,是可以通过的测试的。但是如果设置如果我们把baseline为1,偏差10%,那测试会失败,因为不满足条件。

澳门博发娱乐官网 1666

异步测试测试异步方法时,因为结果并不是立刻获得,所以在异步方法测试有一些特殊的方法和技巧。

举个栗子:

- testAsynExample { XCTestExpectation *exp = [self expectationWithDescription:@"这里可以是操作出错的原因描述。。。"]; NSOperationQueue *queue = [[NSOperationQueue alloc]init]; [queue addOperationWithBlock:^{ //模拟这个异步操作需要2秒后才能获取结果,比如一个异步网络请求 sleep; //模拟获取的异步操作后,获取结果,判断异步方法的结果是否正确 XCTAssertEqual(@"a", @"a"); //如果断言没问题,就调用fulfill宣布测试满足 [exp fulfill]; }]; //设置延迟多少秒后,如果没有满足测试条件就报错 [self waitForExpectationsWithTimeout:3 handler:^(NSError * _Nullable error) { if  { NSLog(@"Timeout Error: %@", error); } }];}

这个测试肯定是通过的,因为设置延迟为3秒,而异步操作2秒就除了一个正确的结果,并宣布了条件满足[exp fulfill],但是当我们把延迟改成1秒,这个测试用例就不会成功,错误原因是expectationWithDescription:@"这里可以是操作出错的原因描述。。。

异步测试除了使用expectationWithDescription以外,还可以使用expectationForPredicate和expectationForNotification

下面这个例子使用expectationForPredicate测试方法,代码来自于AFNetworking,用于测试backgroundImageForState方法

- testThatBackgroundImageChanges { XCTAssertNil([self.button backgroundImageForState:UIControlStateNormal]); NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(UIButton * _Nonnull button, NSDictionary<NSString *,id> * _Nullable bindings) { return [button backgroundImageForState:UIControlStateNormal] != nil; }]; [self expectationForPredicate:predicate evaluatedWithObject:self.button handler:nil]; [self waitForExpectationsWithTimeout:20 handler:nil];}

利用谓词计算,button是否正确的获得了backgroundImage,如果正确20秒内正确获得则通过测试,否则失败。expectationForNotification方法 ,该方法监听一个通知,如果在规定时间内正确收到通知则测试通过。

-testAsynExample1 { [self expectationForNotification:(@"监听通知的名称xxx") object:nil handler:nil]; [[NSNotificationCenter defaultCenter]postNotificationName:@"监听通知的名称xxx" object:nil]; //设置延迟多少秒后,如果没有满足测试条件就报错[self waitForExpectationsWithTimeout:3 handler:nil];}

命令行测试测试不仅可以在xcode中执行,也可以在命令行中执行,这个便于代码持续集成和构建,在git提交中也编译检查代码

如果你有development-enabled设备插入,你可以按照名称或 id 调用他们。例如,如果你有一个名为”Development iPod touch”的 iPod 设备连接了测试的代码,可以使用下面的命令来测试代码> xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp -destination 'platform=iOS,name=Development iPod touch

测试也可以在 iOS模拟器上运行。使用模拟器可以应对不同的外形因素和操作系统版本。例如> xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone,0S=7.0'

-destination 参数可以被连接在一起,这样你只需使用一个命令,就可以跨目标进行指定集成共享方案。例如,下面的命令把之前的三个例子合并到一个命令中

> xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp-destination 'platform=OS X,arch=x86_64'-destination 'platform=iOS,name=Development iPod touch'-destination 'platform=iOS Simulator,name=iPhone,0S=7.0'

关于更多xcodebuild的使用可以查看man手册> man xcodebuild

执行测试快捷键cmd + 5 切换到测试选项卡后会看到很多小箭头,点击可以单独或整体测试cmd + U 运行整个单元测试

注意点使用pod的项目中,在XC测试框架中测试内容包括第三方包时,需要手动去设置Header Search Paths才能找到头文件 ,还需要设置test target的PODS_ROOT。参考阅读

使用 Xcode Server 和 Continuous Integration

使用Xcode Server和持续集成的工作流可以设计无缝和透明的交互式开发。在使用基于服务器的持续集成过程中,很多工作都花在服务器和项目的安装配置上,在这里我们简要描述一下。在开始使用 Xcode Server 和持续集成系统时,仅需三个高级任务。此后,该任务要做的显示正在进行的监测结果和进行不定期的维护。这个概述简要地总结了这些任务,更详细的信息可在 “Xcode Continuous Integration Guide” 中查看。

UI测试可以让你验证UI元素的属性和状态,也可以让界面间进行交互。 UI测试包括UI记录,UI测试让你有能力让你在你的App中通过一些方式进行演习,你也可以通过UI测试工具来扩展。 这个记录让UI测试得到了更多的详细信息,包含测试不通过的时候的屏幕的快照。 UI测试包括两个核心技术:XCTest framework and Accessibility。

  1. XCTest提供框架具有UI测试的功能,和Xcode兼容。创建和使用UI测试扩展根据你会XCTest和单元测试的程度。你可以在你的工程里创建一个UI测试target、UI测试类、UI测试方法。你使用XCTest断言验证你的预期是否正确。你也可以集成一个Xcode Server和XcodeBuild。XCTest充分的兼容Object-C和Swift。
  2. Accessibility是技术的核心,可以让残疾用户得到和一般用户一样的体验。它包含很多语义的数据用户可以通过指引使用你的App。Accessibility是UIKit和APPKit的综合有很多API允许你调整一些行为让一些功能暴露在表面进行使用。UI测试使用这些数据实现这些功能。在源代码里创建一个UI测试类似与单元测试。你创建一个UI测试target在你的app中;Xcode默认创建一个UI测试组和实现文件,在实现文件里写了测试方法的模版。当你创建一个UI测试target,你可以指定你要测试的app。 UI测试的工作远离是找到一个应用程序的用户界面与查询对象、综合时间并派发它们到这些对象。提供了很多的API使你能够检查用户界面对象的属性和状态对他们进行比较确定是不是你期望的状态。

最后

如果大家支持,请github上follow和star

点击播放按钮,开始单个方法的测试:

前言

单元测试和UI测试大致步骤网上很多文章都有,如果会的可以忽略,关键是错误总结,网上很少有文章提及到,感兴趣的读者可以拉到最后面看看总结,相信你一定有所收获!!!

先来简单的了解一下单元测试

澳门博发娱乐官网 211.png

使用快捷键Command+U,这个快捷键是全部测试。也可以单个方法的测试:

澳门博发娱乐官网 3111.jpg

表示测试通过就会出现绿色的菱形

澳门博发娱乐官网 4222.png

编写UI测试

API测试可以同时进行功能测试和性能测试,所以可以进行UI测试。UI测试在应用程序的界面进行操作,很多简单的功能都集成到界面测试里测试是不是预期的表现和反应。UI测试从事件的响应级别进行操作:

  1. 查找到一个元素。
  2. 知道一个元素的预期行为。
  3. 点击或点击该元素引起反应。
  4. 衡量是不是响应了预期的行为。

创建一个UI测试通过XCTest创建和单元测试一样的编程模型。类似的操作和编程方法的整体使用,给出UI测试的API基本概念,以及它们如何运作。 在测试类结构提供setup方法,和单元测试类不相同。<code><pre>*- setUp {*[super setUp];

    • *// Put setup code here. This method iscalled before the invocation of each test method in the class.
  • *self.continueAfterFailure = NO;
  • *[[[XCUIApplication alloc] init] launch];

}</code></pre> Self.continueAfterFailure值默认值设置为NO。一个正确的UI测试依赖于前一个测试的成功。如果一个测试失败,下边的所有测试失败就因为最前边的测试失败。 另外setup方法包括创建实例XCUIApplication并启动它。UI测试必须启动它来进行测试,并缺都在setup方法的测试方法之前运行,这确保了应用启用下边的测试。 编写UI测试方法的时候你应该使用UI录制功能创建一个测试的步骤。你的目的就是编辑这个基本的序列,使用XCTest断言确定是不是一个成功或者失败的单元测试。UI测试可以同时测试功能和性能就像单元测试一样。 保证一个正确的UI测试一般模式如下:

  1. 使用XCUIElementQuery找到下一个XCUIElement。
  2. 合成一个事件并将其发送到XCUIElement。
  3. 使用断言的XCUIElement的状态比较预期的参考状态。

Xcode集成了对测试的支持,使您能够构建测试包,以支持各种不同方式的开发工作。使用测试,可以发现代码中潜在的回归,并测试预期的成功与否,并验证应用程序的行为。通过确保对象能以预期的方式运行,测试能提高代码的稳定性。 当然,通过测试让程序达到稳定的水平也取决于你写的测试的质量。同样,编写良好测试的难易度也取决于你的编码方式。专为测试设计的代码编写有助于编写良好的测试。阅读下面的指南,以确保你的代码是可测试的,以有效减小编写良好测试的难度。

quick start

在xcode新建项目中,默认都会给你建一个单元测试的target,如果你的项目没有,可以在导航中选择 File->New->Target->选择ios-test->选择iOS Unit Testing Bundle 新建一个测试target。

建好后默认会建一个测试类,代码如下:

//
//  BasicTests.m
//  BabyBluetoothAppDemo
//
//  Created by ZTELiuyw on 16/3/9.
//  Copyright © 2016年 刘彦玮. All rights reserved.
//

#import <XCTest/XCTest.h>

@interface BasicTests : XCTestCase

@end

@implementation BasicTests

- (void)setUp {
    [super setUp];
    // Put setup code here. This method is called before the invocation of each test method in the class.
}

- (void)tearDown {
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    [super tearDown];
}

- (void)testExample {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
}

- (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
        // Put the code you want to measure the time of here.
    }];
}

@end

其中有几点需要大家注意:

  • 1:该类中以test开头的方法且void返回类型的方法都会变成单元测试用例
  • 2:单元测试类继承自XCTestCase,他有一些重要的方法,其中最重要的有3个,setUp ,tearDown,measureBlock
//每次测试前调用,可以在测试之前创建在test case方法中需要用到的一些对象等
- (void)setUp ;
//每次测试结束时调用tearDown方法
- (void)tearDown ;

//性能测试方法,通过测试block中方法执行的时间,比对设定的标准值和偏差觉得是否可以通过测试
measureBlock

2.最简单的测试,注意截图路径的问题
进入到这个类,setUp是每个测试方法调用前执行,tearDown是每个测试方法调用后执行。testExample是测试方法,和我们新建的没有差别。不过测试方法必须testXXX的格式,且不能有参数,不然不会识别为测试方法。测试方法的执行顺序是字典序排序。
按快捷键Command + U进行单元测试,这个快捷键是全部测试。
testExample方法中输入

UI测试

 可以参考这个网站  这里就不啰嗦了**


=====

OCUnit(即用XCTest进行测试)苹果自带的测试框架,GHUnit是一个可视化的测试框架。(有了它,你可以点击APP来决定测试哪个方法,并且可以点击查看测试结果等。)OCMock就是模拟某个方法或者属性的返回值,你可能会疑惑为什么要这样做?使用用模型生成的模型对象,再传进去不就可以了?答案是可以的,但是有特殊的情况。比如你测试的是方法A,方法A里面调用到了方法B,而且方法B是有参数传入,但又不是方法A所提供。这时候,你可以使用OCMock来模拟方法B返回的值。(在不影响测试的情况下,就可以这样去模拟。)除了这些,在没有网络的情况下,也可以通过OCMock模拟返回的数据。UITests就是通过代码化来实现自动点击界面,输入文字等功能。靠人工操作的方式来覆盖所有测试用例是非常困难的,尤其是加入新功能以后,旧的功能也要重新测试一遍,这导致了测试需要花非常多的时间来进行回归测试,这里产生了大量重复的工作,而这些重复的工作有些是可以自动完成的,这时候UITests就可以帮助解决这个问题。

APIs

  1. XCUIApplication。
  2. XCUIElement。
  3. XCUIElementQuery。

参考阅读

  • iOS单元测试
  • cocoachina测试专题
  • iOS单元测试(作用及入门提升)
  • In what situation would one use expectationForNotification in swift testing
  • [XCTest 测试实战](http://www.objccn.io/issue-15-2/)

有时候我们想测试一下整个流程是否可以跑通,比如获取验证码、登录、上传头像,查询个人资料。其实只要输入验证码就可以完成整个测试。这时候就需要用到输入框了,以便程序继续执行。使用了一个第三方的弹出输入框STAlertView,前面已经设置。
STAlertView的使用方法:

总结UI测试遇到的问题 (重点) 

1.自动生成uitests字符乱码问题

目前查阅资料只有U变成u,可以用查找工具替换掉,生成的unicode编码也可以直接用中文替换;

2.uitests自动生成的代码经常报TimeStamped Event Matching Error:Failed to find matching element ,这个大多数原因是由于控件id变化导致的,所以对于id动态变化一般都通过下标形式查找到相应的控件

Xcode自动产生的大多数是这样:

[app.buttons[@"u4e8cu624bu8f66u4e16u754c"] tap];

Demo:

[[[[[app.tables elementBoundByIndex:0] childrenMatchingType:XCUIElementTypeCell] elementBoundByIndex:4] childrenMatchingType:XCUIElementTypeTextField] elementBoundByIndex:0]

[app.XXX];获得当前window上所有这种类型的控件

3.uitests textFiled不能通过identifier直接获取到,利用录制的话一般以点击就会报错误;

4.descendantsMatchingType查找包含子类,childrenMatchingType查找本类不包含子类;

5.获取的控件不知道存不存在时可以用exists判断下,对没有获取到的控件操作直接会崩;

6.要特别注意弹出的视图,如果此时对后面一层视图操作会出问题,如果能自动消失的,可以使用延迟pressForDuration: (NSTimeInterval)后在操作,如果不会消失的要转到这层操作;

7.Assertion Failure: :0: UI Testing Failure - Failed to scroll to visible (by AX action) Image 0x600000175240: traits: 8589934596, {{172.0, 70.0}, {70.0, 70.0}}, identifier: 'Icon_Boy', error: Error -25204 performing AXAction 2003 //没有滚到可见范围的错误

[[[[[self.app.tables elementBoundByIndex:0] descendantsMatchingType:XCUIElementTypeAny] elementBoundByIndex:0]tap]; 报上面的错误

解决:[[[[[self.app.tables elementBoundByIndex:0] descendantsMatchingType:XCUIElementTypeAny] elementBoundByIndex:0] coordinateWithNormalizedOffset:CGVectorMake(0.5, 0.5)] tap];

coordinateWithNormalizedOffset:CGVectorMake(0.5, 0.5) 使用这个函数增加点偏移量即可,我试了0.5,0.5 可以用,你们可以试试别的行不行,目前我还不知道这个值是怎么确定的,我们需要做判断用这个方法时,可以用isHittable这个判断下是否可以点击,如果是false,就用偏移的方法,如果返回为yes,就原来的方法即可

有时候放在tableview头视图的imageView,使用[[self.app.images elementBoundByIndex:0] tap]产生这种错误时,可以使用[[self.app.tables elementBoundByIndex:0] descendantsMatchingType:XCUIElementTypeAny] elementBoundByIndex:0] tap]解决

有任何问题可以@我哦

参考网址

)

)

)

)

   UITest

)

https://pan.baidu.com/s/1eR112i2自动化测试视频地址

熟悉单元测试类

澳门博发娱乐官网 5333.pngUnitTestsDemoTests类是继承与 XCTestCase的

- setUp { [super setUp]; // Put setup code here. This method is called before the invocation of each test method in the class. //每个test方法执行之前调用}- tearDown { // Put teardown code here. This method is called after the invocation of each test method in the class. [super tearDown]; // 每个test方法执行之后调用}- testExample { // This is an example of a functional test case. // Use XCTAssert and related functions to verify your tests produce the correct results. // 命名为Example的测试方法}//性能测试- testPerformanceExample { // This is an example of a performance test case. //主要检测代码的执行性能 [self measureBlock:^{ // Put the code you want to measure the time of here. }];}

Xcode7默认带了测试性能的方法- testPerformanceExample

- testPerformanceExample { // This is an example of a performance test case. [self measureBlock:^{ // Put the code you want to measure the time of here. for(int i=0;i<1000;i++) { NSLog; } }];}

重复执行上面的代码,会收集每次执行的时间,并计算出平均值,每次执行后会跟平均值进行比较,给你参考性的提示。

澳门博发娱乐官网 6333.jpg

当我们把i的值后面增添一个0后:

澳门博发娱乐官网 7444.jpg

XCode检测到这一次运行,远超过了平均值,给出了红色的警告

查看代码覆盖

当你的代码覆盖以后,LLVM基于方法和功能的连通的频率来收集覆盖数据。代码覆盖率不但可以收集数据也可以看测试的正确性和性能测试报告,无论是单元测试还是UI测试。你可以查看代码覆盖通过scheme’s编辑测试行为。

  1. 打开scheme编辑菜单。

    澳门博发娱乐官网 8

  2. 选择editor scheme。

  3. 启用代码覆盖复选框来收集覆盖数据。

    澳门博发娱乐官网 9

  4. 单击close。 注意:代码覆盖率启用之后会在性能上有一些损失。无论损失是否显著,都影响了代码的执行,但是线性方式使性能测试仍然可以进行比较。试运行的时候启用它。你应该考虑是否启用代码覆盖率,当你对应用程序进行测试的时候。

断言

大部分的测试方法使用断言决定的测试结果。所有断言都有一个类似的形式:比较,表达式为真假,强行失败等。

//通用断言
XCTAssert(expression, format...)
//常用断言:
XCTAssertTrue(expression, format...)
XCTAssertFalse(expression, format...)
XCTAssertEqual(expression1, expression2, format...)
XCTAssertNotEqual(expression1, expression2, format...)
XCTAssertEqualWithAccuracy(expression1, expression2, accuracy, format...)
XCTAssertNotEqualWithAccuracy(expression1, expression2, accuracy, format...)
XCTAssertNil(expression, format...)
XCTAssertNotNil(expression, format...)

XCTFail(format...) //直接Fail的断言

举个栗子

- (void)testExample {
    //设置变量和设置预期值
    NSUInteger a = 10;NSUInteger b = 15;
    NSUInteger expected = 24;
    //执行方法得到实际值
    NSUInteger actual = [self add:a b:b];
    //断言判定实际值和预期是否符合
    XCTAssertEqual(expected, actual,@"add方法错误!");
}
-(NSUInteger)add:(NSUInteger)a b:(NSUInteger)b{
    return a+b;
}

从这也能看出一个测试用例比较规范的写法,1:定义变量和预期,2:执行方法得到实际值,3:断言

 self.stAlertView = [[STAlertView alloc]initWithTitle:@"验证码" message:nil textFieldHint:@"请输入手机验证码" textFieldValue:nil cancelButtonTitle:@"取消" otherButtonTitle:@"确定" cancelButtonBlock:^{
            //点击取消返回后执行
            [self testAlertViewCancel];
            NOTIFY //继续执行
        } otherButtonBlock:^(NSString *b) {
            //点击确定后执行
            [self alertViewComfirm:b];
             NOTIFY //继续执行
        }];
        [self.stAlertView show];

unitTests测试

1.unitTests作用

由于只是一些简单实用的东西,学学还是挺不错的。其实单元测试用的好,开发起来也会快很多。单元测试对于我目前来说,就是为了方便测试一些功能是否正常运行,还有调试接口是否能正常使用。有时候你可能是为了测试某一个网络接口,然后每次都重新启动并且经过很多操作之后才测试到了那个网络接口。如果使用了单元测试,就可以直接测试那个方法,相对方便很多。 比如由于修改较多,我们想测试一下分享功能是否正常,这时候就有用了。(而不是重新启动程序,进入到分享界面,点击分享,填写分享内容。)其实单元测试并没有降低我们打代码的效率,我们可以在单元测试通过了,直接用到相应的地方。

当然也有一些高级的作用,比如自动发布、自动测试(特别在一些大的项目,以防止程序被误改或引起新的问题)。

现在,让我们先理清一下单元测试到底有些什么东西?

OCUnit(即用XCTest进行测试)其实就是苹果自带的测试框架,我们主要讲的就是这个。GHUnit是一个可视化的测试框架。(有了它,你可以点击APP来决定测试哪个方法,并且可以点击查看测试结果等。)OCMock就是模拟某个方法或者属性的返回值,你可能会疑惑为什么要这样做?使用用模型生成的模型对象,再传进去不就可以了?答案是可以的,但是有特殊的情况。比如你测试的是方法A,方法A里面调用到了方法B,而且方法B是有参数传入,但又不是方法A所提供。这时候,你可以使用OCMock来模拟方法B返回的值。(在不影响测试的情况下,就可以这样去模拟。)除了这些,在没有网络的情况下,也可以通过OCMock模拟返回的数据。UITests就是通过代码化来实现自动点击界面,输入文字等功能。靠人工操作的方式来覆盖所有测试用例是非常困难的,尤其是加入新功能以后,旧的功能也要重新测试一遍,这导致了测试需要花非常多的时间来进行回归测试,这里产生了大量重复的工作,而这些重复的工作有些是可以自动完成的,这时候UITests就可以帮助解决这个问题了。

2.unitTests的使用

创建一个工程,名字随便取,直接勾选include Unit Tests

澳门博发娱乐官网 10

万一我忘了勾选怎么办呢?可以有其他方式创建File-->new-->target-->iOS-->iOS Unit Testing Bundle。名字自己看着办吧。

澳门博发娱乐官网 11

澳门博发娱乐官网 12

工程创建好后,那要怎么开始测试呢?

找到系统单元测试Testes文件夹中.m文件看中会到看到几个方法,我们来看下这个几个方法是什么时候调用和他们各种的作用

- (void)setUp {

[super setUp];

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

//初始化的代码,在测试方法调用之前调用

}

- (void)tearDown {

// Put teardown code here. This method is called after the invocation of each test method in the class.

// 释放测试用例的资源代码,这个方法会每个测试用例执行后调用

[super tearDown];

}

- (void)testExample {

// This is an example of a functional test case.

// Use XCTAssert and related functions to verify your tests produce the correct results.

// 测试用例的例子,注意测试用例一定要test开头

}

- (void)testPerformanceExample {

// This is an example of a performance test case.

// 测试性能例子

[self measureBlock:^{

// Put the code you want to measure the time of here.

// 需要测试性能的代码

}];

}

在ViewController中写一个简单的方法

-(int)getNum;

实现:

- (int)getNum {

return 100;

}

在测试的文件中导入ViewController.h,并且定义一个vc属性

#import

#import "ViewController.h"

@interface ____Tests : XCTestCase

@property (nonatomic,strong) ViewController *vc;

@end

@implementation ____Tests

//测试用例的实现

- (void)setUp {

[super setUp];

// 实例化需要测试的类

self.vc = [[ViewController alloc] init];

}

- (void)tearDown {

// 清空

self.vc = nil;

[super tearDown];

}

- (void)testMyFuc {

// 调用需要测试的方法,

int result = [self.vc getNum];

// 如果不相等则会提示@“测试不通过”

XCTAssertEqual(result, 100,@"测试不通过");

}

command+u快捷方式运行,或者produce-->test都行,或只跑某个测试用例如图

澳门博发娱乐官网 13

澳门博发娱乐官网 14

性能测试

3.使用的断言种类

1.XCTFail(format…) 生成一个失败的测试;

2.XCTAssertNil(a1, format...)为空判断,a1为空时通过,反之不通过;

3.XCTAssertNotNil(a1, format…)不为空判断,a1不为空时通过,反之不通过;

4.XCTAssert(expression, format...)当expression求值为TRUE时通过;

5.XCTAssertTrue(expression, format...)当expression求值为TRUE时通过;

6.XCTAssertFalse(expression, format...)当expression求值为False时通过;

7.XCTAssertEqualObjects(a1, a2, format...)判断相等,[a1 isEqual:a2]值为TRUE时通过,其中一个不为空时,不通过;

8.XCTAssertNotEqualObjects(a1, a2, format...)判断不等,[a1 isEqual:a2]值为False时通过;

9.XCTAssertEqual(a1, a2, format...)判断相等(当a1和a2是 C语言标量、结构体或联合体时使用,实际测试发现NSString也可以);

10.XCTAssertNotEqual(a1, a2, format...)判断不等(当a1和a2是 C语言标量、结构体或联合体时使用);

11.XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...)判断相等,(double或float类型)提供一个误差范围,当在误差范围(+/-accuracy)以内相等时通过测试;

12.XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) 判断不等,(double或float类型)提供一个误差范围,当在误差范围以内不等时通过测试;

13.XCTAssertThrows(expression, format...)异常测试,当expression发生异常时通过;反之不通过;(很变态)

14.XCTAssertThrowsSpecific(expression, specificException, format...) 异常测试,当expression发生specificException异常时通过;反之发生其他异常或不发生异常均不通过;

15.XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression发生具体异常、具体异常名称的异常时通过测试,反之不通过;

16.XCTAssertNoThrow(expression, format…)异常测试,当expression没有发生异常时通过测试;

17.XCTAssertNoThrowSpecific(expression, specificException, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过;

18.XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)异常测试,当expression没有发生具体异常、具体异常名称的异常时通过测试,反之不通过

特别注意下XCTAssertEqualObjects和XCTAssertEqual。

XCTAssertEqualObjects(a1, a2, format...)的判断条件是[a1 isEqual:a2]是否返回一个YES。

XCTAssertEqual(a1, a2, format...)的判断条件是a1 == a2是否返回一个YES。

对于后者,如果a1和a2都是基本数据类型变量,那么只有a1 == a2才会返回YES。

4.异步函数的单元测试

//waitForExpectationsWithTimeout是等待时间,超过了就不再等待往下执行。

#define WAIT do {

[self expectationForNotification:@"RSBaseTest" object:nil handler:nil];

[self waitForExpectationsWithTimeout:30 handler:nil];

} while (0);

#define NOTIFY

[[NSNotificationCenter defaultCenter]postNotificationName:@"RSBaseTest" object:nil];

增加测试方法testRequest:

-(void)testRequest{

// 1.获得请求管理者

AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];

mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"text/html",nil];

// 2.发送GET请求

[mgr GET:@"" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {

NSLog(@"responseObject:%@",responseObject);

XCTAssertNotNil(responseObject, @"返回出错");

NOTIFY //继续执行

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

NSLog(@"error:%@",error);

XCTAssertNil(error, @"请求出错");

NOTIFY //继续执行

}];

WAIT//暂停

}

5.测试覆盖率的查看

在运行测试之前,我们必须先确认 code coverage 是否被打开了,写代码时,默认是关闭的。所以你需要编辑一下你的测试 scheme,把它打开。

确保"Gather coverage data"是被选中的,然后点击关闭按钮,运行测试的 target. 我们希望刚刚创建的测试用例能够顺利通过。

Coverage Tab

澳门博发娱乐官网 15

一旦这个测试通过了,你就能知道 checkWord 这个方法,至少有一条路径是对的。但你不知道的是,还多多少没有被测试到。这就是code coverage这个工具的好处。当你打开code coverage tab后,你可以清楚的看到测试的覆盖情况。他们按找 target, file, function 进行了自动分组。

打开Xcode左边窗口的Report Navigator面板,选中你刚运行的测试。然后在tab中选中 Coverage。

澳门博发娱乐官网 16

这会展示一个你的类、方法的列表,并标示出每个的测试覆盖率。如果你将鼠标悬停在checkWord这个方法上,你可以看到测试的覆盖率是28%。不能接受啊!我们需要找到,那些代码分支是能够被测试执行,那些是不能的,进而改善他们。双击方法的名字,Xcode会打开类的代码,并且看到code coverage的情况。

澳门博发娱乐官网 17

白色的区域表示这些代码时测试覆盖过的。灰色区域时测试无法覆盖的,我们需要添加更多的测试用例来覆盖灰色部分的代码。在右手边的数字,表明这些代码块,在这次测试中被执行的次数。

命令行测试

使用Xcode的命令行测试,可以编写自动化脚本来构建和测试你的项目。通过使用此功能,你可以充分利用现有的构建自动化系统的优势。

  1. 使用XcodeBuild运行测试 XcodeBuild命令行工具像Xcode IDE和OS X Server中的Xcode服务一样驱动测试。使用BuildAction运行XcodeBuild测试。用-destination参数指定不同的测试目的。例如要在本地OS X“my Mac 64 Bit”测试MyApp,使用如下命令来指定目标和框架:➢ xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp -destination 'platform=OS X,arch=x86_64' 如果你有development-enabled设备插入,你可以按照名称或者id调用它们。例如,如果你有一个名为“Development iPod touch”的iPod设备连接了测试代码,可以使用下面的命令来测试代码:➢ xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp -destination 'platform=iOS,name=Development iPod touch'测试也可以在iOS模拟器上运行。使用模拟器可以应对对不同的机型因素和操作系统版本。➢ xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp -destination 'platform=Simulator,name=iPhone,OS=8.1'-destination参数可以被连接在一起,这样你只需要一个命令,就可以跨目标进行指定集成共享方案。例如下边的例子就是将上面的三个例子合在了一个命令当中:➢ > xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp-destination 'platform=OS X,arch=x86_64'-destination 'platform=iOS,name=Development iPod touch'-destination 'platform=Simulator,name=iPhone,OS=9.0' 如果测试失败,XcodeBuild将返回一个非零的退出代码。这些都是你所需要了解的命令行运行测试的要领。有关XcodeBuild更详细的信息,请在终端的应用程序窗口中使用命令进行查找。➢ man xcodebuild
  2. 在XcodeBuild中使用ssh 调用XcodeBuild从ssh远程登陆(或者demon发射)失败,除非你在主机建立一个正确的会话环境。 当你作为一个用户以交互方式登陆到你的OS X系统时需要创建一个“Aqua session”环境。Aqua session初始化基础框架在OS X交互环境下,为了能够运行OS X App这个是必须的。更多的特性,代码使用UI frameworks(AppKit or UIKit)也需要在“Aqua session”运行。因为这个有必要的,OS X的测试(模拟器的测试,OS X的app)都要求“Aqua session”。 默认的情况下,创建一个命令行使用ssh登陆到OS X系统是不能运行会话的。当你使用ssh登陆的时候你必须确保“Aqua session”被创建,你必须有一个用户登陆到了一个远端的OS X主机系统。一个用户存在运行在一个远端系统在“Aqua session”通过ssh登陆。 用户第一次运行在这个主机系统,运行XcodeBuild通过ssh登陆的方式进行测试。下边是通过远端的主机运行一个测试app“MyApp”通过ssh:➢> ssh localhost➢> cd ~/Development/MyAppProject_Folder➢> xcodebuild test -project MyApp.xcodeproj -scheme MyApp -destination 'platform=Simulator,name=iPhone 6' 参考:technical notes a target="_self" Daemons and Agents/a and a target="_self" Daemons and Services Programming Guide。

命令行测试

测试不仅可以在xcode中执行,也可以在命令行中执行,这个便于代码持续集成和构建,在git提交中也编译检查代码

如果你有development-enabled设备插入,你可以按照名称或 id 调用他们。例如,如果你有一个名为"Development iPod touch"的 iPod 设备连接了测试的代码,可以使用下面的命令来测试代码
> xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp -destination 'platform=iOS,name=Development iPod touch

测试也可以在 iOS模拟器上运行。使用模拟器可以应对不同的外形因素和操作系统版本。例如
> xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone,0S=7.0'

-destination 参数可以被连接在一起,这样你只需使用一个命令,就可以跨目标进行指定集成共享方案。例如,下面的命令把之前的三个例子合并到一个命令中

> xcodebuild test -project MyAppProject.xcodeproj -scheme MyApp
-destination 'platform=OS X,arch=x86_64'
-destination 'platform=iOS,name=Development iPod touch'
-destination 'platform=iOS Simulator,name=iPhone,0S=7.0'

关于更多xcodebuild的使用可以查看man手册 > man xcodebuild

- (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
          //Put the code you want to measure the time of here.
          //你的性能测试的代码放在这里
    }];
}

本文由胜博发-编程发布,转载请注明来源:并且可以点击查看测试结果等澳门博发娱乐官网