XCTest iOS Swiftユニットテスト
10809 ワード
iOS XCTestセルテスト
XCTest iOS 7の時に接触しましたが、ずっと役に立たなかったです.最初はセルテストは鶏の肋骨だと思いましたが、私たちは単一のクラスの関数をテストするしかなく、自分で所望の結果を判断し、検証する必要があります.依存関係が複雑ならGGです.
成長とは何か、成長とは異なる段階で一つのものを見る異なる見方である.今iOS 11になって、新しくXCTestと新しく出たXCUITestを見て、もうあの年の嫌な顔と屑ではありません.
一言が存在するのは合理的であることを覚えておく.次は私が新しく1日かけてコースを勉強しました(点開はリンク先です):
XCTestを知る
プロジェクトを新規作成するとき、XcodeはXCUnitTestとXCUITestを新規作成するかどうかを尋ねます.ではXCUnitTestは何をしているのか、どうやって使うのか、何が含まれているのか.
新規プロジェクトのTests Targetファイルは次のとおりです.
import XCTest
@testable import XCTestDemo
class XCTestDemoTests: XCTestCase {
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample() {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
func testPerformanceExample() {
// This is an example of a performance test case.
self.measure {
// Put the code you want to measure the time of here.
}
}
}
注釈からこの4つの関数の意味を知ることができます.
関数#カンスウ#
用途
setUp
XCTestCase関数とテストファイルの実行開始時に実行を継承
tearDown
継承とXCTestCaseテスト関数の実行後に実行
testExample
テストの例関数
testPerformanceExample
パフォーマンステスト
次のXCTestは簡単な例を使用します。
見てわかるはず
//
// XCTestDemoTests.swift
// XCTestDemoTests
//
// Created by Nvr on 2018/7/6.
// Copyright © 2018 ZY. All rights reserved.
//
import XCTest
@testable import XCTestDemo
class XCTestDemoTests: XCTestCase {
var f1:Float?
var f2:Float?
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
f1 = 10.0
f2 = 20.0
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testExample() {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
XCTAssertTrue(f1! + f2! == 30.0)
}
//simpale Test
func testIsPrimenumber() {
let oddNumber = 5
//There are lot XCTAssert function, you can check it
XCTAssertTrue(isPrimenumber(number: Double(oddNumber)))
}
func isPrimenumber(number:Double) -> Bool{
for No in 1...Int(sqrt(number)) {
if Int(number)/No != 0 {
return true
}
}
return false
}
func testPerformanceExample() {
// This is an example of a performance test case.
self.measure {
// Put the code you want to measure the time of here.
}
}
}
例:
関数#カンスウ#
説明
testExample
グローバル変数f 1+f 2の加算が一定の数に等しいか、等しいか否かを断言する
testIsPrimenumber
素数断言が真に戻るかどうかを判断する
まとめ:上の2つの例を通して、XCUintTestが何をしているのか、どのように使われているのかがわかるはずです.
アサーション共通API:
API
説明
XCTFail(…)
どんな試みでもテストに失敗します....は出力のヒント文字です.(後ろはこんな感じ)
XCTAssertNil(expression, …)
expressionが空の場合に合格します.そうしないと、テストに失敗します.expressionはidタイプのパラメータを受け入れます.
XCTAssertNotNil(expression, …)
expressionが空でない場合は、テストに失敗します.expressionはidタイプのパラメータを受け入れます.
XCTAssert(expression, …)
expressionがtrueの場合に合格します.そうしないと、テストに失敗します.expressionはbooleanタイプのパラメータを受け入れます.
XCTAssertTrue(expression, …)
expressionがtrueの場合に合格します.そうしないと、テストに失敗します.expressionはbooleanタイプのパラメータを受け入れます.
XCTAssertFalse(expression, …)
expressionがfalseの場合に合格します.そうしないとテストに失敗します.expressionはbooleanタイプのパラメータを受け入れます.
XCTAssertEqualObjects(expression1, expression2, …)
expression 1とexpression 1アドレスが同じ場合に合格します.そうしないとテストに失敗します.expressionはidタイプのパラメータを受け入れます.
XCTAssertNotEqualObjects(expression1, expression2, …)
expression 1とexpression 1アドレスが同じ場合に合格します.そうしないとテストに失敗します.expressionはidタイプのパラメータを受け入れます.
XCTAssertEqual(expression1, expression2, …)
expression 1とexpression 1が等しい場合に合格します.そうしないとテストに失敗します.expressionは、基本タイプのパラメータ(数値、構造体など)を受け入れます.
XCTAssertNotEqual(expression1, expression2, …)
expression 1とexpression 1が等しくない場合に合格します.そうしないとテストに失敗します.expressionは基本タイプのパラメータを受け入れます.
XCTAssertEqualWithAccuracy(expression1, expression2, accuracy, …)
expression 1とexpression 2の間の任意の値がaccuracyより大きい場合、テストに失敗します.expression 1、expression 2、accuracyはいずれも基本タイプです.
XCTAssertNotEqualWithAccuracy(expression1, expression2, accuracy, …)
expression 1とexpression 2の間の値がaccuracy以下の場合、テストに失敗します.expression 1、expression 2、accuracyはいずれも基本タイプです.
XCTAssertGreaterThan(expression1, expression2, …)
expression 1<=expression 2の場合、テストに失敗します.expressionが基本タイプ
XCTAssertGreaterThanOrEqual(expression1, expression2, …)
expression 1
expression 1>=expression 2の場合、テストに失敗します.expressionが基本タイプ
XCTAssertLessThanOrEqual(expression1, expression2, …)
expression 1>expression 2の場合、テストに失敗しました.expressionが基本タイプ
XCTAssertThrows(expression, …)
expressionは異常を投げず、テストに失敗した.expressionは式です
XCTAssertThrowsSpecific(expression, exception_class, …)
expressionは指定したクラスの異常を投げず、テストに失敗しました.expressionは式でexception_クラスは指定されたクラスです
XCTAssertThrowsSpecificNamed(expression, exception_class, exception_name, …)
expressionは指定クラス、指定名前の異常を投げず、テストに失敗しました.expressionは式exceptionです.classは指定されたクラス、exception_nameは名前を指定します
XCTAssertNoThrow(expression, …)
expressionが異常を投げ出した場合、テストに失敗します.expressionは式です
XCTAssertNoThrowSpecific(expression, exception_class, …)
expressionは指定したクラスの例外を投げ出し、テストに失敗しました.expressionは式です
XCTAssertNoThrowSpecificNamed(expression, exception_class, exception_name, …)
expressionは指定クラス、指定名前の異常を投げ出し、テストに失敗しました.
非同期テスト
次の場合は、非同期テストを使用します.
ネットワーク要求非同期Case
UIに関する非同期テストは、次のXCUITestで、ネットワーク要求のCaseが非同期テストのメカニズムを理解していると述べています.
func testAsynNetworkTest(){
let networkExpection = expectation(description: "networkDownSuccess")
Alamofire.request("http://www.httpbin.org/get?key=Xctest", method: .get, parameters: nil, encoding: JSONEncoding.default).responseJSON { (respons) in
XCTAssertNotNil(respons)
networkExpection.fulfill()
}
// waitForExpectations(timeout: 0.00000001)
// wait(for: [networkExpection], timeout: 0.00000001)
//XCTWaiter.Result
// public enum Result : Int {
//
//
// case completed
//
// case timedOut
//
// case incorrectOrder
//
// case invertedFulfillment
//
// case interrupted
// }
let result = XCTWaiter(delegate: self).wait(for: [networkExpection], timeout: 1)
if result == .timedOut {
print(" ")
}
}
説明:次の3つの関数は、XCWaiterの待ち時間を設定しますが、詳細は異なります。
関数#カンスウ#
waitForExpectations(timeout: 0.00000001)
wait(for: [networkExpection], timeout: 0.00000001)
let result = XCTWaiter(delegate: self).wait(for: [networkExpection], timeout: 0.00000001)
Mock
ポイントが来て、私はずっと