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

时间:2017-05-03 18:30:14

标签: unit-testing rust assert

assert!(a == b)占用的字符少于assert_eq!(a, b),在我看来,它更具可读性。

错误消息或多或少相同:

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

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

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

  • Cpputest有CHECKCHECK_FALSE以及CHECK_EQUAL等等;
  • Googletest有EXPECT_GTEXPECT_EQ等等;
  • JUnit有assertEqualsassertFalse并且可以继续。

通常还有一些特定类型的断言,如字符串或数组。有什么意义?

1 个答案:

答案 0 :(得分:9)

  

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

您的示例太简单了,无法看到使用assert_eq!有很大的优势。请考虑以下代码:

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

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

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

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

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

消息:

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

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