2024/7/5
laprasdrum.icon 36℃はもう真夏日ですね /icons/ひええ~.icon
/icons/hr.icon
XCTAssertの実装を読む
do-try-catchでテスト成否を判定し、成功しない場合はエラーをストックする。
code:XCTAssert.swift
private func _XCTEvaluateAssertion(_ assertion: _XCTAssertion, message: @autoclosure () -> String, file: StaticString, line: UInt, expression: () throws -> _XCTAssertionResult) {
let result: _XCTAssertionResult
do {
result = try expression()
} catch {
result = .unexpectedFailure(error)
}
switch result {
case .success:
return
default:
if let currentTestCase = XCTCurrentTestCase {
currentTestCase.recordFailure(
withDescription: "\(result.failureDescription(assertion)) - \(message())",
inFile: String(describing: file),
atLine: Int(line),
expected: result.isExpected)
}
}
}
Assersion結果の定義は成功・失敗に分かれ、失敗の中でも意図通りとそうでないパターンがある。
code:XCTAssert.swift
private enum _XCTAssertionResult {
case success
case expectedFailure(String?)
case unexpectedFailure(Swift.Error)
意図通りでない失敗は先のdo-try-catchで使われている。
じゃぁ何が意図通りな失敗なのかというと、try expression()がthrowしない上でAssertionに失敗した場合である。
例を挙げると、XCTAssertEqual(1, 2) で正しく失敗するときに expectedFailure が出力される。
code:XCTAssert.swift
private func _XCTAssertEqual<T: Numeric>(_ expression1: @autoclosure () throws -> T, _ expression2: @autoclosure () throws -> T, accuracy: T, _ message: @autoclosure () -> String, file: StaticString, line: UInt) {
_XCTEvaluateAssertion(.equalWithAccuracy, message: message(), file: file, line: line) {
let (value1, value2) = (try expression1(), try expression2())
if areEqual(value1, value2, accuracy: accuracy) {
return .success
} else {
return .expectedFailure("(\"\(value1)\") is not equal to (\"\(value2)\") +/- (\"\(accuracy)\")")
}
}
}
最近テストやリファクタリング、ドキュメント化など、機能開発のコーディング以外のエンジニアリング業務に関する目的の言語化を「理解できる人に伝わればいい」レベルを「よく分からない人にも腹落ちできる」レベルまで引き上げたいと思うようになった。
この本に書かれている序章が自分のほしい表現を持っていた。
我々が提案するのは、「ソフトウェアエンジニアリング」とは単にコードを書く行為のみならず、組織が時間の経過に応じてコードを構築し保守するために用いるツールとプロセス全てをも包含するということである。
長期間にわたりコードを価値ある状態に保守することを最もうまく行うためのプラクティスとしてソフトウェア組織が導入できるのは、どのようなものか。
エンジニアたちはどのようにして、コードベース(codebase)をさらに持続可能にしつつ、ソフトウェアエンジニアリングの規律自体を厳格化できるだろうか。
信頼を多く寄せられて任されることが多々あった反面、このあたりの説得力ある言語化の向上が自分はまだまだ甘いなと感じていた。
この本を読み込んでその能力を伸ばしておきたい。
今Cosenseで日記を続けている理由を書いた。
元々アウトプットが枯渇している状況を変えたいなーというのもあり、アウトプットを習慣化させるために整理したのもある。