LayoutTest-iOS 使用

作者: c5f8c453b41e | 来源:发表于2016-02-24 19:31 被阅读125次

    前言

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

    这个框架能做什么?

    • 自动化测试继承UIView的子类
    • 自动化测试属性
    • 自动化测试viewController

    具体使用

    1. 集成CocoaPods
    target :DemoTests do
     pod 'LayoutTestBase'
     pod 'LayoutTest'
    end
    
    2. 写自动测试 (两步)
    • (一) 确保你的view实现LYTViewProvider的方法
    • (二) 编写你的测试,并通过(貌似废话)
      注:这里确保你的view实现LYTViewProvider的方法。建议直接把扩展写到你的测试类中。写法如下:
    @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
    

    相关文章

      网友评论

        本文标题:LayoutTest-iOS 使用

        本文链接:https://www.haomeiwen.com/subject/oajikttx.html