iOS自动化测试

iOS自动化测试包括 UI测试 和数据测试两个方面。
UI测试:
UITest介绍

   XCUIApplication *app = [[XCUIApplication alloc] init];
   XCUIElement *element = [[[[app.otherElements containingType:XCUIElementTypeNavigationBar identifier:@"View"] childrenMatchingType:XCUIElementTypeOther].element childrenMatchingType:XCUIElementTypeOther].element childrenMatchingType:XCUIElementTypeOther].element;
   XCUIElement *textField = [[element childrenMatchingType:XCUIElementTypeTextField] elementBoundByIndex:0];
   [textField tap];
   [textField typeText:@"Blank_佐毅"];

   XCUIElement *textField2 = [[element childrenMatchingType:XCUIElementTypeTextField] elementBoundByIndex:1];
   [textField2 tap];

   XCUIElement *moreNumbersKey = app/*@START_MENU_TOKEN@*/.keys[@"more, numbers"]/*[[".keyboards.keys[@\\\\"more, numbers\\\\"]",".keys[@\\\\"more, numbers\\\\"]"],[[[-1,1],[-1,0]]],[0]]@END_MENU_TOKEN@*/;
   [moreNumbersKey tap];
   [textField2 typeText:@"123"];
   [app.buttons[@"Login"] tap];
24.gif
   XCUIApplication。这是你正在测试的应用的代理。它能让你启动应用,这样你就能执行测试了。它每次都会新起一个进程,这会多花一些时间,但是能保证测试应用时的状态是干净的,这样你需要处理的变量就少了些。
   XCUIElement。这是你正在测试的应用中UI元素的代理。每个元素都有类型和标识符,结合二者就能找到应用中的UI元素。所有的元素都会嵌套在代表你的应用的树中。
   XCUIElementQuery。 当你想要找到某个元素时,就会用到 element query。每个 XCUIElement 里都包含一个query。这些query搜索 XCUIElement 树, 必须要找到一个匹配的。否则当你视图访问该元素时,测试就会失败。 例外是exists 属性,你可以使用这个属性来检查一个元素是否展示在树中。 这对于断言很有用。 更一般地你可以使用 XCUIElementQuery 来找到对accessibility可见的元素。Query会返回结果的集合。

数据测试(行为驱动测试)

  BDD DSL 测试

【行为驱动测试-Objc中国】(http://objccn.io/issue-15-1/)

Snip20160102_1.png
 SpecBegin 声明了一个名为StalkerSpec 测试类. SpecEnd 结束了类声明。
 describe 块声明了一组实例。
 context 块的行为类似于 describe 。
 it 是一个单一的例子 (单一测试)。
 beforeEach 是一个运行于所有同级块和嵌套块之前的块。
 可能你已经注意到,几乎在这种 DSL 中定义的所有组件由两部分都组成:一个字符串值定义了什么被测试,以及一个包含了测试其本身或者更多组件的块。这些字符串有两个非常重要的功能。
 首先,在 describe 块内,这些字符串将联系紧密的被测试的一部分特性的行为进行分组描述 。因为你可以按意愿指定任意多的嵌套块,你可以基于对象或者它们的依赖关系的上下文来编写的不同的测试。

 #define EXP_SHORTHAND
 #import "Expecta.h"
 #import "Specta.h"
 #import "NSObject+BPStalker.h"

 SpecBegin(Stalker)
 describe(@"objectWithStalker", ^{

__block NSMutableDictionary *objectToBeObserved;
__block NSObject *objectWithStalker;
__block NSString *testNotification;

beforeEach(^{
    //
    objectWithStalker = [[NSObject alloc] init];
    objectToBeObserved = [@{ @"one" : @1,@"two" : @2 } mutableCopy];
    testNotification = @"TEST_NOTIFICATION";
    
});

it(@"should have a stalker", ^{
    expect(objectWithStalker.stalker).toNot.beNil;
});

it(@"should be able to observer changes", ^{
    
    __block BOOL objectChanged = NO;
    __block NSInteger blockCalled = 0;
    
    [objectWithStalker.stalker whenPath:@"one"
                        changeForObject:objectToBeObserved
                                options:(NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew |
                                         NSKeyValueObservingOptionOld)
                                   then:^(NSMutableDictionary *object, NSDictionary *change) {
                                       
                                       expect(object[@"one"]).to.equal(@1);
                                       blockCalled++;
                                   }];
    
    [objectWithStalker.stalker whenPath:@"two"
                        changeForObject:objectToBeObserved
                                options:(NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew |
                                         NSKeyValueObservingOptionOld)
                                   then:^(NSMutableDictionary *object, NSDictionary *change) {
                                       
                                       blockCalled++;
                                       
                                       if (objectChanged)
                                           expect(object[@"two"]).to.equal(@3);
                                       else
                                           expect(object[@"two"]).to.equal(@2);
                                       
                                   }];
    
    objectChanged = YES;
    objectToBeObserved[@"two"] = @3;
    expect(blockCalled).to.equal(3);
});

it(@"s stalker KVO shoud be removed when it is deallocated", ^{
    
    __block NSInteger blockCalled = 0;
    
    @autoreleasepool
    {
        NSObject *objectWithStalker = [[NSObject alloc] init];
        
        [objectWithStalker.stalker whenPath:@"one"
                            changeForObject:objectToBeObserved
                                    options:(NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew |
                                             NSKeyValueObservingOptionOld)
                                       then:^(NSMutableDictionary *object, NSDictionary *change) {
                                           
                                           blockCalled++;
                                       }];
        
        expect(blockCalled).to.equal(1);
        
        objectToBeObserved[@"one"] = @3;
        expect(blockCalled).to.equal(2);
    }
    
    objectToBeObserved[@"one"] = @4;
    objectToBeObserved[@"one"] = @10;
    
    expect(blockCalled).to.equal(2);
});

it(@"should be able to listen to notifications", ^{
    
    __block NSInteger blockCalled = 0;
    
    [objectWithStalker.stalker when:testNotification
                               then:^(NSNotification *notification) {
                                   expect(notification.object).to.equal(@1);
                                   blockCalled++;
                               }];
    expect(blockCalled).to.equal(0);
    [objectWithStalker.stalker.notificationCenter postNotificationName:testNotification object:@1];
    expect(blockCalled).to.equal(1);
});

it(@"s stalker notification observing shoud be removed when it is deallocated", ^{
    __block NSInteger blockCalled = 0;
    @autoreleasepool
    {
        NSObject *objectWithStalker = [[NSObject alloc] init];
        
        [objectWithStalker.stalker when:testNotification
                                   then:^(NSNotification *notification) {
                                       blockCalled++;
                                   }];
        expect(blockCalled).to.equal(0);
        [objectWithStalker.stalker.notificationCenter postNotificationName:testNotification object:@1];
        expect(blockCalled).to.equal(1);
    }
    [objectWithStalker.stalker.notificationCenter postNotificationName:testNotification object:@1];
    expect(blockCalled).to.equal(1);
}); });
SpecEnd

如果界面UI元素中出现中文,UITest脚本报错,使用下边方法解决:

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

推荐阅读更多精彩内容