当一个简单的`assert`足够时,为什么`assert_eq`和`assert_ne`存在?

Amo*_*mum 7 unit-testing assert rust

assert!(a == b)assert_eq!(a, b)我更少的字符,在我看来,更具可读性.

错误消息或多或少相同:

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

要么

thread 'main' panicked at 'assertion failed: 1 == 2', src\main.rs:41
Run Code Online (Sandbox Code Playgroud)

实际上,这个问题不仅仅是关于Rust; 我一直在单元测试框架中看到这些不同的断言宏或函数:

  • Cpputest具有CHECKCHECK_FALSECHECK_EQUAL等;
  • Googletest有EXPECT_GTEXPECT_EQ等;
  • JUnit的拥有assertEqualsassertFalse做的.

通常还有一些特定类型的断言,如字符串或数组.重点是什么?

E_n*_*ate 10

线程'主'惊慌于'断言失败:1 == 2',

你的例子太简单了,看不出使用它有很大的优势assert_eq!.考虑以下代码:

let s = "Hello".to_string();
assert!(&s == "Bye");
Run Code Online (Sandbox Code Playgroud)

这是由此产生的恐慌消息:

'assertion failed: &s == "Bye"'    
Run Code Online (Sandbox Code Playgroud)

现在让我们看看当我们使用时会发生什么assert_eq!:

let s = "Hello".to_string();
assert_eq!(&s, "Bye");
Run Code Online (Sandbox Code Playgroud)

消息:

'assertion failed: `(left == right)` (left: `"Hello"`, right: `"Bye"`)'
Run Code Online (Sandbox Code Playgroud)

此消息提供了比前者更多的洞察力.其他单元测试系统通常也这样做.

  • 对.您的测试框架应该可以帮助您.简单地说"测试失败"比说"由于这些原因导致测试失败*"没那么有用.还有为什么我们首先使用名称创建函数的整个方面 - 具有可读和可理解的代码. (2认同)
  • 现在的问题是:为什么要明确地说`assert_eq(<expr>,<expr>)`?不能模式匹配`assert!(<expr> == <expr>)`并只做正确的事情™? (2认同)