C++ 代码整洁之道:C++17 可持续软件开发模式实践 (18):构建安全体系 2.5.4

阅读数:6 2019 年 12 月 4 日 18:48

C++代码整洁之道:C++17可持续软件开发模式实践(18):构建安全体系 2.5.4

(一个测试一个断言)

内容简介
本书致力于讲述 C++ 整洁代码之道!如果你想让自己写的代码更加整洁,那么这本书适合你阅读。本书需要熟悉 C++ 语言的基本概念,才能有效的掌握其中的内容。如果你只是想从 C++ 开发开始,并且没有 C++ 语言的基础知识,你应该首先选择一个好的 C++ 入门的练习项目。此外,本书也不包含任何深奥的技巧和杂乱的知识点。我知道 C++ 有很多令人兴奋的技巧,但这些通常不是整洁代码的精神,也不是现代 C++ 的代码风格。除此之外,这本书为了帮助 C++ 程序员提高技能水平,并举例说明如何编写易于理解的、灵活的、可维护的和高效的 C++ 代码。即使你是一个经验丰富的 C++ 开发人员,这本书中也有一些值得学习的地方,我认为这些值得学习的地方能够促进你的工作。书中所提出的原则和实践可以应用于新的软件系统,有时被称为“绿地项目”,以及具有悠久历史的遗留系统,通常被称为“棕地项目”。

我知道这是一个有争议的话题,但我会试着解释为什么我认为这很重要,我的建议是限制一个单元测试只使用一个断言。如下所示:

代码 2-3 一个检查 Money 类的不等运算符的单元测试

复制代码
void MoneyTest::givenTwoMoneyObjectsWithDifferentBalance_theInequalityComparison_Works() {
const Money m1(-4000.0);
const Money m2(2000.0);
ASSERT_TRUE(m1 != m2);
}

有人可能争辩说我们还可以检查其他比较运算符(例如,Money :: operator==())在该单元测试中是否正常工作,只需添加更多断言就可以轻松实现这一点,如下所示:

代码 2-4 问题:在一次单元测试中检查所有比较运算符真的是个好主意吗

复制代码
void MoneyTest::givenTwoMoneyObjectsWithDifferentBalance_testAllComparisonOperators() {
const Money m1(-4000.0);
const Money m2(2000.0);
ASSERT_TRUE(m1 != m2);
ASSERT_FALSE(m1 == m2);
ASSERT_TRUE(m1 < m2);
ASSERT_FALSE(m1 > m2);
// ...more assertions here...
}

我认为这种测试方法的问题是显而易见的:

  • 如果由于某些原因而导致测试失败了,开发人员可能很难快速找到错误原因。最重要的是,前面一个断言的错误掩盖了其他的错误,也就是说,它隐藏了后续的断言,因为测试的执行被中断了。
  • 正如单元测试的命名一节(2.5.2 节)中所述,我们应该以精确且富有表现力的方式命名测试。通过多个断言,单元测试确实可以测试很多东西(顺便说一下,这违反了单一职责原则,参见第 6 章),并且很难为它找到一个好的名字,上面的…testAllComparisonOperators() 仍然不够精确。

C++代码整洁之道:C++17可持续软件开发模式实践(18):构建安全体系 2.5.4

购书地址 https://item.jd.com/12599914.html?dist=jd

评论

发布