iOS单元测试/自动化测试32

1.什么是单元测试
单元测试: 单元测试⼜称为模块测试,Unit Testing, 是对程序模块进⾏正确性检验的测试⼯作。

2.为什么要做单元测试

● 单元测试作为敏捷开发实践的组成之⼀,⽬的是提⾼软件开发的效率,维持代 码的健壮性。
● 单元测试也有⼀些⾼级的作⽤,⽐如⾃动发布、⾃动测试。
注:单元测试的⽬标是证明软件能够正常运⾏,⽽不是发下bug。他是对软件质量的⼀种保证,列如重构之后我们需要保证软件产品的正常运⾏。

3.iOS单元测试⽅案
测试框架:
⽅案⼀:XCTest + OCMock (mock对象、桩程序) + OCHamcrest(断⾔扩展,⾮必要)
⽅案⼆:Kiwi(Kiwi 与 OCMock相互不兼容)

测试对象:
⽹络请求接⼝
⼯具类⽅法
部分可测试视图逻辑
私有⽅法

测试工具:
1.XCTest
XCTest是Xcode集成的⼀套单元测试框架,以下是⼀些基本使⽤ :

基本⽅法:

  • (void)setUp {
    [super setUp];
    // 每个test⽅法执⾏前调⽤,在这个测试⽤例⾥进⾏⼀些通⽤的初始化⼯作
    // Put setup code here. This method is called before the invocation of each test method in the class.
    }
  • (void)tearDown {
    [super tearDown];
    // 每个test⽅法执⾏后调⽤
    // Put teardown code here. This method is called after the invocation of each test method in the class.
    }
  • (void)testExample {
    // 测试⽅法样例 // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
    }
  • (void)testPerformanceExample {
    //这个⽅法主要是做性能测试的,所谓性能测试,主要就是评估⼀段代码的运⾏时间。该⽅法就是性能测试⽅法的样例。
    // This is an example of a performance test case.
    [self measureBlock:^{
    // Put the code you want to measure the time of here.
    }];
    }

断⾔:
XCTAssert(expression, ...) XCTAssert(条件, 不满⾜条件的描述) eg.
XCTAssert(a == 0, @“a不能等于0”)

⽆条件报错:
XCTFail(format...) eg. XCTFail(@“⽆条件报错”)

等价测试:
XCTAssertEqualObjects(expression1, expression2, format...) 当expression1不等于expression2时报错
XCTAssertNotEqualObjects(expression1, expression2, format...) 当expression1 等于expression2时报错
XCTAssertEqual(expression1, expression2, format...) 当expression1不等于 expression2时报错,这个测试⽤于C语⾔的标量
XCTAssertNotEqual(expression1, expression2, format...) 当expression1等于 expression2时报错,这个测试⽤于C语⾔的标量
XCTAssertEqualWithAccuracy(expression1, expression2, accuracy, format...) 当 expression1和expression2之间的差别⾼于accuracy将报错。这种测试适⽤于 floats和doubles这些标量,两者之间的细微差异导致它们不完全相等,但是对所有 的标量都有效
XCTAssertNotEqualWithAccuracy(expression1, expression2, accuracy, format...) 当expression1和expression2之间的差别低于accuracy将产⽣失败。这 种测试适⽤于floats和doubles这些标量,两者之间的细微差异导致它们不完全相 等,但是对所有的标量都有效

空测试:
XCTAssertNil(expression, format...) 当expression参数⾮nil时报错
XCTAssertNotNil(expression, format...) 当expression参数为nil时报错
XCTAssertTrue(expression, format...) 当expression计算结果为false时报错
XCTAssert(expression, format...) 当expression计算结果为false时报错,与 XCTAssertTrue同义
XCTAssertFalse(expression, format...) 当expression计算结果为true报错异常测试:
XCTAssertThrows(expression, format...) 当expression不抛出异常时报错
XCTAssertThrowsSpecific(expression, exception_class, format...) 当expression 针对指定类不抛出异常时报错
XCTAssertThrowsSpecificNamed(expression, exception_class, exception_name, format...) 当expression针对特定类和特定名字不抛出异常时报错。对于AppKit框 架或Foundation框架⾮常有⽤,抛出带有特定名字的NSException(NSInvalidArgumentException等等)
XCTAssertNoThrow(expression, format...) 当expression抛出异常时报错
XCTAssertNoThrowSpecific(expression, exception_class, format...) 当 expression针对指定类抛出异常时报错。任意其他异常都可以;也就是说它不会报 错
XCTAssertNoThrowSpecificNamed(expression, exception_class, exception_name, format...) 当expression针对特定类和特定名字抛出异常时报错。
对于AppKit框架或Foundation框架⾮常有⽤,抛出带有特定名字的 NSException(NSInvalidArgumentException等

2.OCMock
我们要测试的⽅法会引⽤很多外部依赖的对象,⽽我们没法控制这些外部依赖的对 象。为了解决这个问题,我们需要⽤到Stub和Mock来模拟这些外部依赖的对象,从 ⽽控制它们。单独依靠XCTest难以完成Mock或者Stub但,是结合OCMock可以在 测试代码中实现这以下功能:
● Stub --- 桩程序, ⼈为地让⼀个对象对某个⽅法返回我们事先规定好的值
eg.
OCMStub([mockCar getCarBrand:[OCMArg any]]).andReturn(@"XXX");
[OCMArg any]表示可以为任意参数,若改为具体参数(如:张三),表示只有参数 为张三时才会触发stup,否则不会触发

● Mock --- 模拟对象, ⼀个对象, 它是对现有类的⾏为⼀种模拟(或是对现有接⼝ 实现的模拟), 它只能响应那些你添加了期望或者 stub 的⽅法
eg.
// 1.nice mock - 不会在⼀个没有被stub的⽅法被调⽤时抛出异常
Car *mockCar = OCMClassMock([Car class]);
// 2.vanilla mock - 在mock的⽣命周期中每⼀个⽅法调⽤都必须是stub过的⽅ 法。当调⽤⼀个没有stub的⽅法的时候会抛出⼀个异常
Car *mockCar = OCMStrictClassMock([Car class]);
// 3.partial mock - 当⼀个没有stub过的⽅法被调⽤了,这个⽅法会被转发到真 实的对象上。
Car *mockCar = OCMPartialMock([Car class]);

 

0人点赞

 

iOS

 



作者:http://www.hbfzb.com/news.php
链接:http://www.autono1.com/
来源:http://szgc.glodon.com/news.php
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页