2017-05-03 1 views
4

assert!(a == b) dauert weniger Zeichen als assert_eq!(a, b) und meiner Meinung nach ist lesbarer.Warum existieren `assert_eq` und` assert_ne`, wenn ein einfaches `assert` genügt?

Die Fehlermeldungen sind mehr oder weniger das gleiche:

thread 'main' panicked at 'assertion failed: `(left == right)` (left: `1`, right: `2`)', src\main.rs:41 

oder

thread 'main' panicked at 'assertion failed: 1 == 2', src\main.rs:41 

Eigentlich ist diese Frage nicht nur über Rust ist; Ich halte diese verschiedenen assert Makros oder Funktionen in Unit-Test-Frameworks zu sehen:

  • Cpputest hat CHECK und CHECK_FALSE und CHECK_EQUAL und so weiter;
  • Googletest hat EXPECT_GT und EXPECT_EQ und so weiter;
  • JUnit hat assertEquals und assertFalse und tun auf.

Häufig gibt es auch Assert für einen bestimmten Typ wie String oder Array. Was ist der Punkt?

Antwort

7

Thread 'main' in Panik geraten bei 'Behauptung fehlgeschlagen: 1 == 2',

Ihr Beispiel ist zu einfach, um zu sehen, dass es ein großer Vorteil bei der Verwendung von assert_eq! ist. Betrachten Sie diesen Code:

let s = "Hello".to_string(); 
assert!(&s == "Bye"); 

Dies ist die resultierende Panik Nachricht:

'assertion failed: &s == "Bye"'  

Nun wollen wir sehen, was passiert, wenn wir verwenden assert_eq!:

let s = "Hello".to_string(); 
assert_eq!(&s, "Bye"); 

Die Botschaft:

'assertion failed: `(left == right)` (left: `"Hello"`, right: `"Bye"`)' 

Diese Nachricht pro viel mehr Einblick als das erstere. Andere Einheitentestsysteme machen oft dasselbe.

+2

Rechts. Dein Test-Framework soll dir helfen. Einfach zu sagen, dass ein Test fehlgeschlagen ist, ist viel weniger hilfreich, als zu sagen: "Ein Test ist aus diesen Gründen * fehlgeschlagen". Es gibt auch den ganzen Aspekt, warum wir Funktionen mit Namen überhaupt erst schaffen - um lesbaren und verständlichen Code zu haben. – Shepmaster

+0

@Shempmaster Ich bin mir nicht sicher, dass assert_eq von selbst besser lesbar ist, aber eine aussagekräftigere Fehlermeldung ist natürlich besser. – Amomum

+1

@Amomum: Es gibt tatsächlich einen RFC, um assert_eq zu verbessern, in der Zwischenzeit könnten Sie an der Kiste [pretty_assertions] (https://crates.io/crates/pretty_assertions) interessiert sein. –

Verwandte Themen