iOS进阶指南IOSiOS开发技术分享

LayoutTest-iOS 使用

2016-02-24  本文已影响125人  c5f8c453b41e

前言

框架作者有一个官方的说明。但是由于这个框架,国内外资料比较少且都是英文。因此,拿来分享下自己使用的思路。
链接:[GitHub] (https://github.com/linkedin/LayoutTest-iOS)
(http://linkedin.github.io/LayoutTest-iOS/pages/000_gettingStarted.html)

这个框架能做什么?

具体使用

1. 集成CocoaPods
target :DemoTests do
 pod 'LayoutTestBase'
 pod 'LayoutTest'
end
2. 写自动测试 (两步)
@interface yourTestClass (test) <LYTViewProvider>
@end

@implementation yourTestClass(test)

 //实现LYTViewProvider中的方法

@end

2.1 实现LYTViewProvider
这个协议规定了view的创建和根据data的变化view的相应变化。其中需要要实现下面两个方法

A + (NSDictionary *)dataSpecForTest;
B  + (UIView *)viewForData:(NSDictionary *)data reuseView:(UIView *)reuseView size:(LYTViewSize *)size context:(id  _Nullable __autoreleasing *)context;

注:A方法为测试编造数据;B方法通过数据,返回对应的view。具体参考测试类全部代码。

**2.2 编写测试代码 **

- (void)testExample {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
    [self runLayoutTestsWithViewProvider:[ADTableViewCell class] validation:^(id  _Nonnull view, NSDictionary * _Nonnull data, id  _Nullable context) {
        ADTableViewCell *cell = (ADTableViewCell *)view;
        if ([data[@"buttonEnable"] isEqualToString:@"0"]) {
            XCTAssertTrue(cell.btn.hidden == YES);
        }
    }];
}

3.0 属性含义

注:在测试的时候,我们需要设置部分属性的值,才能保证顺利的进行。如果遇到那种报错上百的情况,基本是默认属性要修改。一般情况是约束布局相关错误

interceptsAutolayoutErrors 是否拦截布局错误。默认yes,一般设置为NO
accessibilityTestsEnabled 是否允许不可访问的控件。默认yes,一般设置为NO
viewOverlapTestsEnabled 是否允许子view能重叠 
ambiguousAutolayoutTestsEnabled 是否允许view模糊布局
recursivelyIgnoreOverlappingSubviewsOnView:这个方法会添加所有子view,自动测试子View是否重叠


美中不足

需要把要测试的view的内部属性暴漏出来。不过我们可以在view的类别里定义属性,在外面只需要暴漏readonly就可以了。
这样就防止外部随意改变自己的属性。

测试类完整代码

//
//  ADTableViewCellTests.m
//  Demo
//
//  Created by Adolph on 16/2/24.
//  Copyright © 2016年 Adolph. All rights reserved.
//

#import <XCTest/XCTest.h>
#import "LYTLayoutTestCase.h"
#import "ADTableViewCell.h"
#import "LYTViewProvider.h"
#import "LYTStringValues.h"
#import "LYTViewSize.h"
#import "LYTDeviceConstants.h"

@interface ADTableViewCellTests : LYTLayoutTestCase

@end

@implementation ADTableViewCellTests


- (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.
    [self runLayoutTestsWithViewProvider:[ADTableViewCell class] validation:^(id  _Nonnull view, NSDictionary * _Nonnull data, id  _Nullable context) {
        ADTableViewCell *cell = (ADTableViewCell *)view;
        
        if ([data[@"buttonEnable"] isEqualToString:@"0"]) {
            XCTAssertTrue(cell.btn.hidden == YES);
        }
    }];
}

- (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

//ADTableViewCell 需要测试的view的子类,实现协议
@interface ADTableViewCell (test) <LYTViewProvider>

@end

@implementation ADTableViewCell(test)

+ (NSDictionary *)dataSpecForTest
{
    return @{ 
               @"evaScoreNew":[[LYTDataValues alloc] initWithValues:@[@(0),@(2.1),@(4.7)]],
             @"poiName":[[LYTDataValues alloc] initWithValues:@[@"",@"阳光地带"]],
             }
}

+ (UIView *)viewForData:(NSDictionary *)data reuseView:(UIView *)reuseView size:(LYTViewSize *)size context:(id  _Nullable __autoreleasing *)context
{
    ADTableViewCell *cell = (ADTableViewCell *)reuseView?:[[[NSBundle mainBundle] loadNibNamed:@"ADTableViewCell" owner:nil options:nil] lastObject];
   //在下面配置你构建cell数据方法
  //这里需要注意的是:这个测试次数是你在设置data数据是相乘的结果 依照这个例子:上面会测试3 * 2次
    return cell;
}
@end
上一篇下一篇

猜你喜欢

热点阅读