A useful failure message explains the expected and actual values.

Build a clear message

actualName
failure_messages.swift
Replay: real traced execution (multi-file project)
let actualName = "swift"
let expectedName = "Swift"
let passed = actualName == expectedName
let message = passed ? "names match" : "expected \(expectedName), got \(actualName)"

print(message)
let actualName = "Swift"
let expectedName = "Swift"
let passed = actualName == expectedName
let message = passed ? "names match" : "expected \(expectedName), got \(actualName)"

print(message)
let actualName = "trace"
let expectedName = "Swift"
let passed = actualName == expectedName
let message = passed ? "names match" : "expected \(expectedName), got \(actualName)"

print(message)
  1. actualName ← swift, expectedName ← Swift, passed ← false, message ← expected Swift, got swift

    1let actualName→ swift = "swift"  //@actualName="Swift", "trace"2let expectedName→ Swift = "Swift"3let passed→ false = actualNameswift == expectedNameSwift4let message→ expected Swift, got swift = passedfalse ? "names match" : "expected \(expectedNameSwift), got \(actualNameswift)"56print(messageexpected Swift, got swift)
    outputexpected Swift, got swift
  1. actualName ← Swift, expectedName ← Swift, passed ← true, message ← names match

    1let actualName→ Swift = "Swift"2let expectedName→ Swift = "Swift"3let passed→ true = actualNameSwift == expectedNameSwift4let message→ names match = passedtrue ? "names match" : "expected \(expectedNameSwift), got \(actualNameSwift)"56print(messagenames match)
    outputnames match
  1. actualName ← trace, expectedName ← Swift, passed ← false, message ← expected Swift, got trace

    1let actualName→ trace = "trace"2let expectedName→ Swift = "Swift"3let passed→ false = actualNametrace == expectedNameSwift4let message→ expected Swift, got trace = passedfalse ? "names match" : "expected \(expectedNameSwift), got \(actualNametrace)"56print(messageexpected Swift, got trace)
    outputexpected Swift, got trace
failure message Failure messages make a broken check easier to understand.