前言
框架作者有一个官方的说明。但是由于这个框架,国内外资料比较少且都是英文。因此,拿来分享下自己使用的思路。
链接:[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