2017-05-03 35 views
4

assert!(a == b)assert_eq!(a, b)占用更少的字符,在我看来,它更具可读性。为什么`assert_eq`和`assert_ne`存在一个简单的`assert`就足够了?

错误消息是或多或少是相同的:

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 

实际上,这个问题不仅是锈病;我总是看到在单元测试框架这些不同的断言宏或功能:

  • Cpputest有CHECKCHECK_FALSECHECK_EQUAL等;
  • Googletest有EXPECT_GTEXPECT_EQ等等;
  • JUnit有assertEqualsassertFalse,并继续。

通常还有一些特定类型的字符串或数组声明。重点是什么?

回答

7

线程“主”在恐慌“断言失败: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"`)' 

此消息pro比前者更具洞察力。其他单元测试系统通常也是这样。

+2

对。你的测试框架应该可以帮助你。简单地说“一个测试失败”比说“由于这些原因测试失败*”没有多大帮助。还有我们为什么要首先创建名称的函数的全部方面 - 具有可读性和可理解的代码。 – Shepmaster

+0

@Shepmaster我不确定assert_eq本身更具可读性,但更多的信息性错误信息当然更好。 – Amomum

+1

@Amomum:实际上有一个改进assert_eq的RFC,同时你可能对[pretty_assertions](https://crates.io/crates/pretty_assertions)箱子感兴趣。 –

相关问题