浅谈自动化测试

1.什么是自动化测试?

自动化测试,顾名思义,自动完成测试工作。通过一些自动化测试工具或自己造轮子实现模拟之前人工点点/写写的工作并验证其结果完成整个测试过程,这样的测试过程,便是自动化测试。自动化测试,看上去很美,感觉好像是第一次工业革命,它开创了以机器代替手工劳动的时代,实则不然.因为每一个自动化测试的case都是从手工测试做起的,如果没有手工测试的基础,是没法进行自动化测试。

2.为什么要进行自动化测试

为什么进行自动化测试,答案要从自动测试的收益和人肉测试的成本说起:

a. 自动化测试节约成本(根据项目) 毕竟自动化测试确实解放了一批人力(人力成本才是IT公司最大的成本),可以让机器没日没夜的执行一些重复劳动.

b.有些测试项目手工很难实现(手工成本较高) 比如12306的压力测试、负载测试,同时找那么多人去测试不现实可以通过机器去模拟

c.项目质量流程需要 比如版本管理需要build verify,以保证check in的code不会影响版本库。类似于smoke test

3.自动化测试的优缺点

优点: 避免测试人员因重复劳动产生厌倦 提高测试效率 保证每次测试地一致性和可重复性 更好的利用无人值守时间 进行一些手工无法进行的测试 维护成本相对比较高

缺点: 系统开发时间不一定能缩短; 没有手工测试发现缺陷多; UI布局问题不容易发现.

4.什么样的项目适合做自动化测试

有以下几个特点的项目比较适合自动化测试:

  1. 项目变动少
  2. 周期长
  3. 项目资源足够(自动化不是一个人完成的,需要一帮人长期维护)

举例说明: 互联网项目,一周内要上线,你不上线别人上线人家就不用你的,项目周期短,变动快,你自动化还没做好,项目说不定就下线了。比如某宝双12活动相关项目,一周之内就下线了。 适合做自动化测试的项目,比如某宝客户端,每个release,大部分功能都不变,并且3-5年内项目不会下线,这个就比较适合自动化.

5.自动化框架选择

目前较火的自动化工具特点对比:

1. XCTest

XCTest是苹果在iOS7和Xcode5引入的一个简单而强大的测试框架,它的测试编写起来非常简单,并且遵循XCUnit风格。

优点:与Xcode深度集成,有专门的Test导航栏
缺点:受限于官方测试API,因此功能不是很丰富
复制代码

2. UIAutomation

UIAutomation是苹果提供的UI自动化测试框架,使用Javascript编写。基于UIAutomation有扩展型的工具框架和驱动型的框架。扩展型框架以JavaScript扩展库方法提供了很多好用js工具,注入式的框架通常会提供一些Lib或者是Framework,要求测试人员在待测应用的代码工程中导入这些内容,框架可以通过他们完成对app的驱动。驱动型UIAutomation 在自动化测试底层使用了UIAutomation库,通过TCP通信的方式驱动UIAutomation来完成自动化测试,通过这种方式,编辑脚本的语言不再局限于JavaScript

3. Frank

Frank是iOS平台一款非常受欢迎的app测试框架,它使用Cucumber语言来编写测试用例, Frank包含一个强大的“app inspector”–Symbiote,可以用它来获得运行中app的详细信息,便于开发者将来进行测试回顾。 它允许使用Cucumber编写结构化英语句子的测试场景。 Frank要求测试时在应用程序内部编译,这意味着对源代码的改变是强制性的。操作方式为使用Cucumber和JSON组合命令,将命令发送到在本地应用程序内部运行的服务器上,并利用UISpec运行命令。

优点: 测试场景是在Cucumber的帮助下,用可理解的英语句子写的。强大的Symbiote实时检查工具。 活跃的社区支持。 不断扩大中的库

缺点:对手势的支持有限。 在设备上运行测试有点难。 修改配置文件需要在实际设备上运行。 记录功能不可用
复制代码

4.KIF

KIF是Keep It Functional项目的缩写,是一款iOS app功能性测试框架,使用Objective-C语言编写,对苹果开发者来说非常容易上手,更是一款开发者广为推荐的测试工具。KIF tester使用私有API来了解App中的视图层级。但缺点是运行较慢

5. Calabash

Calabash是一个适用于iOS和Android开发者的跨平台app测试框架,可用来测试屏幕截图、手势和实际功能代码。Calabash开源免费并支持Cucumber语言,Cucumber能让你用自然的英语语言表述app的行为,实现BDD(Behavior Driven Development,行为驱动开发)。 Cucumber中的所有语句使用Ruby定义。

优点: 有大型社区支持。列表项 简单,类似英语表述的测试语句支持在屏幕上的所有动作,如滑动,缩放,旋转,敲击等。 跨平台开发支持(同样的代码在Android和iOS设备中都适用)

缺点:测试步骤失败后,将跳过所有的后续步骤,这可能会导致错过更严重的产品问题。测试耗费时间,因为它总是默认先安装app。 需要Calabash框架安装在ios的ipa文件中, 因此测试人员必须要有iOS的app源码。 除了Ruby,对其他语言不友好

6.Subliminal

Subliminal是另一款与XCTest集成的框架。与KIF不同的是,它基于UIAutomation编写,旨在对开发者隐藏UIAutomation中一些复杂的细节

7.Kiwi

Kiwi是对XCTest的一个完整替代,使用xSpec风格编写测试。 Kiwi带有自己的一套工具集,包括expectations、mocks、stubs,甚至还支持异步测试。它是一个适用于iOS 开发的Behavior Driven Development(BDD)库,优点在于其简洁的接口和可用性,易于设置和使用,非常适合新手开发者。Kiwi使用Objective-C语言编写,易于IOS开发人员上手

8.Appium

Appium(适用于Android&iOS;支持多语言;不需要应用源码

Appium是一个开源的、跨平台的自动化测试工具,支持IOS、Android和FirefoxOS平台。 通过Appium,开发者无需重新编译app或者做任何调整,就可以测试移动应用,可以使测试代码访问后端API和数据库。它是通过驱动苹果的UIAutomation和Android的UiAutomator框架来实现的双平台支持,同时绑定了Selenium WebDriver用于老的Android平台测试。开发者可以使用WebDriver兼容的任何语言编写测试脚本,如Ruby,C#,Java, JS,OC, PHP,Python,Perl和Clojure 语言

6.XCTest

XCTest是Xcode5中新引入的一个测试框架,与 Xcode 的 IDE 直接集成。XCTest分为两部分:UnitTest 和 UITest,分别对应单元测试和UI测试。

一.测试函数的要求:
  • 一般我们命名的时候会根据这个方法要测试的内容命名,比如testHTTPRequest。 另外,对于每一个业务类,我们都会有一个对应的测试类,比如:netManager对应netManagerTest,如果类的内容太多,我们也可以通过Category进行分类。 如果某个方法我们暂时不想跑测试了,我们可以加一个Disable前缀

    -(void)DISABLED_testHTTPRequest;

1.必须无返回值;

2.以test开头;

3.运行单元测试的快捷键:CMD + U;

4.需要知道每个测试的断言

例如:- (void)testTodo{}

二.断言测试语句

怎样判断测试用例是否成功呢?XCTest使用断言实现,以下为常用断言

  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没有发生具体异常、具体异常名称的异常时通过测试,反之不通过
三.异步测试

异步测试用来测试一些异步操作,比如异步网络请求,需要用到XCTestExpectation类,这个类提供三个方法:

- (XCTestExpectation *)expectationWithDescription:(NSString *)description;可以理解为超时错误提示,因为只有在异步操作时间超过了预设时间时才会在Log中打印出来。

- (void)fulfill; 该方法用于表示这个异步测试结束了,每一个XCTestExpectation都需要对应一个fulfill,否则将会导致测试失败

- (void)waitForExpectationsWithTimeout:(NSTimeInterval)timeout handler:(nullable XCWaitCompletionHandler)handler; 设置异步测试的时间长度,当超过时间时,报测试错误,并打印预设的超时错误信息,超时发生时执行block中的方法

例如:

//XCTestExpectation 异步测试
- (void)testAsynchronousURLConnection {
    NSString *Url = @"http://www.baidu.com/";
    XCTestExpectation *expectation = [self expectationWithDescription:[NSString stringWithFormat:@"GET %@",Url]];
    
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionTask *task = [session dataTaskWithURL:[NSURL URLWithString:Url] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        
        NSLog(@"%@",data);
        XCTAssertNotNil(data, @"data should not be nil");
        XCTAssertNil(error,@"error should be nil");
        NSLog(@"typr:%@",response.MIMEType);
        if (response) {
            XCTAssertEqual(response.URL.absoluteString, Url, @"HTTP response URL should be equal to original URL");
            XCTAssertEqual(response.MIMEType,@"text/html", @"HTTP response content type should be text/html");
            
        }else{
            XCTFail(@"Response was not NSHTTPURLResponse");
        }
        [expectation fulfill];
    }];
    [task resume];
    [self waitForExpectationsWithTimeout:task.originalRequest.timeoutInterval handler:^(NSError * _Nullable error) {
        [task cancel];
        NSLog(@"ffffff");
    }];
    
}

复制代码
四·性能测试
//性能测试
- (void)testPerformanceExample {
    
    [self measureBlock:^{
        UIImage * image = [UIImage imageNamed:@"LOGO"];
        UIImage * resizedImage = [UIImage imageWithImage:image scaledToSize:CGSizeMake(50, 50)];
        XCTAssertNotNil(resizedImage,@"resized image should not be nil");
        CGFloat resizedWidth = resizedImage.size.width;
        CGFloat resizedHeight = resizedImage.size.height;
        XCTAssert(resizedHeight == 50 && resizedWidth == 50,@"Size is not right");
        
    }];
}
复制代码

可以看到性能测试会默认10次,可能是为了精度吧(我猜的话)

  • Baseline 计算标准差的参考值
  • MAX STDD 最大允许的标准差
  • 底部点击1…10可以看到每次运行的结果。
五.UI Testing

见demo


参考链接

官方文档

喵神笔记

转载于:https://juejin.im/post/5bd113ee5188255c3b7dcb04

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值