测试驱动的代码审查

资料来源: Wikimedia

一年前,我与最好的朋友Alex进行了有趣的代码审查讨论。 他说,在进行代码审查时,他总是从测试开始 。 他使用此技术来了解代码的实际功能,行为方式以及所涵盖的功能。

在检查了测试之后,他接着继续检查生产代码。 生产代码应该是有意义的,并遵循团队设定的原则/准则和模式(团队用“干净代码”表示的所有含义),这样每个人都可以遵循。

当您要实现功能时,可以将单个需求转换为用例。 您将单个用例转换为测试用例。 您可以在生产代码中实现这些测试用例。

如果您正在练习TDD,那么您将遵循TDD三定律 。 这三个定律是:

  • 在编写任何生产代码之前,必须编写失败的测试。
  • 您编写的测试不得超过失败或无法编译的数量。
  • 您编写的生产代码不得超过足以使当前失败的测试通过的代码。

这里真正有趣的是第三定律,因为它意味着如果测试通过,则不允许添加更多的生产代码,如果要添加更多的代码,则必须添加更多的测试用例。 换句话说,您的生产代码仅覆盖测试用例描述的内容。 只需查看需求并对照测试用例对它们进行检查,您就可以很好地理解实现的形式,实现的功能以及开发人员是否省略了任何用例并且不满足需求。

代码的行为受测试用例的限制

由于测试是API的第一个客户端,因此它们可以帮助您暴露设计问题,例如封装问题或组件之间的紧密耦合。

如果测试模拟了许多组件,那么您需要检查是否违反了封装,以及是否可以将其中某些组件设置为包保护或私有的。 封装是最重要的OOP概念之一,但也是开发人员最常使用的概念。

如果测试花费太多时间来模拟单个对象的方法调用链,那么您可以肯定地确定违反了Demeter法则 。 如果违反了Demeter法则,那么您可以确定该代码存在封装问题。 但是我知道,即使不看代码,我也只是看测试的结构就知道。

此外,您可以猜测开发人员没有实践TDD,因为测试对实现的内部知识了解太多。 只有在编写生产代码之后编写测试,才可能发生这种情况。

如果您知道测试是在实现之后编写的,则需要检查生产代码是否包含隐藏的功能,并且没有描述这些功能的测试。 这确实很糟糕,您不能让它发生,因为您将对测试套件失去信任。 提交该代码几个月后的一天,您将对其进行重构,并且由于没有描述该功能的测试用例,因此可以删除整个功能而无需注意。 这真是太糟糕了!

顺便说一句,测试也是代码

测试是您唯一拥有消除更改生产代码的担心的工具。 随着代码复杂度的增加(无论是否偶然),您都将重构代码,并且测试可以确保代码的行为相同。 马丁·福勒Martin Fowler)有一本很棒的书叫 您应该阅读“重构:改善现有代码的设计”

因此,请花费相同或更多的时间来确保您的测试始终处于良好状态。 您需要进行代码审查并重构测试。 测试应遵循与生产代码相同的标准。

进一步阅读

  1. TDD的周期
  2. 微服务时代的得墨meter耳定律
  3. 团队文化的重要性
  4. 重构:改进 Martin FowlerKent Beck 的现有代码设计

From: https://hackernoon.com/test-driven-code-review-3f05f6cee400

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
测试驱动的编程是 XP 困扰程序员的一个方面。对于测试驱动的编程意味着什么以及如何去做,大多数人都做出了不正确的假设。这个月,XP 方面的讲师兼 Java 开发人员 Roy Miller 谈论了测试驱动的编程是什么,它为什么可以使程序员的生产力和质量发生巨大变化,以及编写测试的原理。请在与本文相随的 论坛中提出您就本文的想法,以飨笔者和其他读者。(您也可以单击本文顶部或底部的“讨论”来访问该论坛。) 最近 50 年来,测试一直被视为项目结束时要做的事。当然,可以在项目进行之中结合测试测试通常并不是在 所有编码工作结束后才开始,而是一般在稍后阶段进行测试。然而,XP 的提倡者建议完全逆转这个模型。作为一名程序员,应该在编写代码 之前编写测试,然后只编写足以让测试通过的代码即可。这样做将有助于使您的系统尽可能的简单。 先编写测试 XP 涉及两种测试: 程序员测试和 客户测试测试驱动的编程(也称为 测试为先编程)最常指第一种测试,至少我使用这个术语时是这样。测试驱动的编程是让 程序员测试(即单元测试 ― 重申一下,只是换用一个术语)决定您所编写的代码。这意味着您必须在编写代码之前进行测试测试指出您 需要编写的代码,从而也 决定了您要编写的代码。您只需编写足够通过测试代码即可 ― 不用多,也不用少。XP 规则很简单:如果不进行程序员测试,则您不知道要编写什么代码,所以您不会去编写任何代码测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量。本文从开发人员使用的角度,介绍了 TDD 优势、原理、过程、原则、测试技术、Tips 等方面。 背景 一个高效的软件开发过程对软件开发人员来说是至关重要的,决定着开发是痛苦的挣扎,还是不断进步的喜悦。国人对软件蓝领的不屑,对繁琐冗长的传统开发过程的不耐,使大多数开发人员无所适从。最近兴起的一些软件开发过程相关的技术,提供一些比较高效、实用的软件过程开发方法。其中比较基础、关键的一个技术就是测试驱动开发(Test-Driven Development)。虽然TDD光大于极限编程,但测试驱动开发完全可以单独应用。下面就从开发人员使用的角度进行介绍,使开发人员用最少的代价尽快理解、掌握、应用这种技术。下面分优势,原理,过程,原则,测试技术,Tips等方面进行讨论。 1. 优势 TDD的基本思路就是通过测试来推动整个开发的进行。而测试驱动开发技术并不只是单纯的测试工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值