22

快速了解iOS单元测试 - 简书

 3 years ago
source link: https://www.jianshu.com/p/966eb3425a5b?
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

快速了解iOS单元测试

0.0942020.07.27 10:43:24字数 1,293阅读 78
webp
快速了解iOS单元测试

XCTestCase

进入xxUITests.m文件,会看到继承自XCTestCase:Xcode集成的一套单元测试框架

XCTestCase
The primary class for defining test cases, test methods, and performance tests.

## Overview

A test case is a group of related test methods, with optional setup and teardown before and after tests are run. See [Defining Test Cases and Test Methods](apple-reference-documentation://tc2870870) for more information.

每个测试用例在运行前都会执行setup方法(Provides an opportunity to customize initial state before a test case begins.),并且在运行后会执行teardown方法(Provides an opportunity to perform cleanup after a test case ends.)。我们可以在此时做一些初始化、销毁回收等操作。
testExample作为逻辑测试,测试逻辑是否有问题;testPerformanceExample作为性能测试,测试当前用例的性能,耗时等操作,先看一个逻辑测试的demo。

每个测试用例都要以test开头,比如testExampl

- (void)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.
}

- (void)testExample {
    // This is an example of a functional test case.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
    int a = 10;
    int b = 20;
    int c = a + b;
    XCTAssertEqual(c, 30, @"计算正确");
}

- (void)testPerformanceExample {
    // This is an example of a performance test case.
    [self measureBlock:^{
        // Put the code you want to measure the time of here.
    }];
}

在此测试用例demo运行时,当c等于30的时候直接通过,否则这里会报错!这里使用XCTAssertEqual断言来进行判断条件是否成立。

XCTAssertEqual:Asserts that two expressions have the same value.
XCTAssertEqualObjects:Asserts that two objects are considered equal.
XCTAssertNotEqual:Asserts that two expressions do not have the same value.
XCTAssertNotEqualObjects:Asserts that two objects are not considered equal.
XCTAssertEqualWithAccuracy:Asserts that two expressions have the same value within a certain accuracy.
XCTAssertNotEqualWithAccuracy:Asserts that two expressions do not have the same value within a certain accuracy.
XCTAssertNil:Asserts that an expression is nil.
XCTAssertNotNil:Asserts that an expression is not nil.

检验平等和不平等(Testing for Equality and Inequality )

  • XCTAssertEqual(expression1, expression2, format...):当expression1不等于expression2时报错,这个测试用于C语言的标量。
  • XCTAssertEqualObjects(expression1, expression2, format...):当expression1不等于expression2时报错(或者一个对象为空,另一个不为空)。
  • XCTAssertNotEqual(expression1, expression2, format...):当expression1等于expression2时报错,这个测试用于C语言的标量。
  • XCTAssertNotEqualObjects(expression1, expression2, format...):当expression1等于expression2时报错。

在给定精度内测试是否相等

  • 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时报错。

//性能测试方法,通过测试block中方法执行的时间,比对设定的标准值和偏差觉得是否可以通过测试

 // Measures the performance of a block of code.
- measureBlock:
 // Measures the performance of a block of code, optionally deferring the starting point for measurement.
- measureMetrics:automaticallyStartMeasuring:forBlock:
 // Starts the measurement of performance metrics within a block of code.
 - startMeasuring
 // Ends the measurement of performance metrics within a block of code.
- stopMeasuring
// Identifies the performance metrics measured when [`measure<wbr style="margin-bottom: 0px;">Block:`](apple-reference-documentation://hcnJonuUfI) is invoked.
defaultPerformanceMetrics
 // Performance metrics that can be measured by XCTest.
XCTPerformanceMetric

- measureBlock主要是通过block内部代码块的执行时间来测试性能,通过设置baseline(基准)和stddev(标准偏差)来判断方法是否能通过性能测试。
- measureMetrics:automaticallyStartMeasuring:forBlock测量代码块的性能,可以选择推迟测量的起点。
- startMeasuring在代码块中开始性能度量。
- stopMeasuring结束代码块内的性能度量。
defaultPerformanceMetrics标识在调用measureBlock:时度量的性能指标。
XCTPerformanceMetricXCTest可以测量的性能指标。

创建异步测试期望

要创建异步测试期望,请使用下面的方便方法,或者手动创建XCTestExpectation及其子类的实例。

// Creates a new expectation with an associated description.
- expectationWithDescription:
// Creates an expectation that is fulfilled if the predicate returns YES when evaluated with the given object.
- expectationForPredicate:evaluatedWithObject:handler:
// Creates an expectation that is fulfilled when a specific [`NSNotification`](apple-reference-documentation://hcmB87CArc) is received for a given object.
- expectationForNotification:object:handler:
// Creates an expectation that uses Key Value Observing to observe a value until it matches an expected value.
- keyValueObservingExpectationForObject:keyPath:expectedValue:
// Creates an expectation that uses Key Value Observing to observe a value and respond to changes in that value by calling a provided handler.
- keyValueObservingExpectationForObject:keyPath:handler:

- expectationWithDescription:创建带有关联描述的新期望,比如操作出错的原因描述。
- expectationForPredicate:evaluatedWithObject:handler:创建一个期望,如果predicate在对给定对象进行计算时返回YES,则该期望将被满足。
- expectationForNotification:object:handler:创建期望,该期望在接收到给定对象的特定NSNotification时被实现。该方法监听一个通知,如果在规定时间内正确收到通知则测试通过。
- keyValueObservingExpectationForObject:keyPath:expectedValue:创建一个期望,该期望使用键值观察来观察一个值,直到它与期望的值匹配为止。
- keyValueObservingExpectationForObject:keyPath:handler:创建一个期望,该期望使用键值观察来观察值,并通过handler来响应该值中的更改。

等待的期望

可以使用下面的方法实现等待异步测试期望,或者创建XCTWaiter的实例。

// Waits on a group of expectations for up to the specified timeout.
- waitForExpectations:timeout:
// Waits on an array of expectations and specifies whether they must be fulfilled in the given order.
- waitForExpectations:timeout:enforceOrder:
// Waits until all expectations are fulfilled or the timeout is reached.
- waitForExpectationsWithTimeout:handler:
// A block to be called when a call to waitForExpectationsWithTimeout:handler: has all of its expectations fulfilled, or times out.
XCWaitCompletionHandler
// Error codes for errors that can occur while waiting for expectations to be fulfilled.
XCTestErrorCode
// Error domain for errors that can occur while waiting for expectations to be fulfilled.
XCTestErrorDomain

- waitForExpectations:timeout:等待一组期望,直到指定的超时。
- waitForExpectations:timeout:enforceOrder:等待一系列期望,并指定它们是否必须按照给定的顺序实现。
- waitForExpectationsWithTimeout:handler:等待,直到所有期望都满足或达到超时,执行handler。设置延迟时间(秒),如果没有满足测试条件就报错。
XCWaitCompletionHandler:当waitForExpectationsWithTimeout:handler:的调用完成了所有的期望或超时时的回调。
XCTestErrorCode:在等待期望实现时可能发生的错误的错误代码。
XCTestErrorDomain:在等待期望实现时可能发生的错误的错误域。

该文章为记录本人的学习路程,也希望能够帮助大家,知识共享,共同成长,共同进步!!!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK