TDD(测试驱动开发)死了吗?(2)

简介: TDD(测试驱动开发)死了吗?
public class Ticket {
  private final static int PRICE = 99;
  public BigDecimal sale(int count) {
    if (count == 1) {
      return new BigDecimal(PRICE);
    }
    return BigDecimal.ZERO;
  }
}

重构完后再运行一下测试用例,确保测试通过的情况下,再增加几个测试用例,比如说门票销量为负数、零甚至一千的情况。

public class TicketTest {
  private Ticket ticket;
  @Before
  public void setUp() throws Exception {
    ticket = new Ticket();
  }
  @Test
  public void testOne() {
    BigDecimal total = new BigDecimal("99");
    assertEquals(total, ticket.sale(1));
  }
  @Test(expected=IllegalArgumentException.class)
  public void testNegative() {
    ticket.sale(-1);
  }
  @Test
  public void testZero() {
    assertEquals(BigDecimal.ZERO, ticket.sale(0));
  }
  @Test
  public void test1000() {
    assertEquals(new BigDecimal(99000), ticket.sale(1000));
  }
}


重构完后再运行一下测试用例,确保测试通过的情况下,再增加几个测试用例,比如说门票销量为负数、零甚至一千的情况。

public class TicketTest {
  private Ticket ticket;
  @Before
  public void setUp() throws Exception {
    ticket = new Ticket();
  }
  @Test
  public void testOne() {
    BigDecimal total = new BigDecimal("99");
    assertEquals(total, ticket.sale(1));
  }
  @Test(expected=IllegalArgumentException.class)
  public void testNegative() {
    ticket.sale(-1);
  }
  @Test
  public void testZero() {
    assertEquals(BigDecimal.ZERO, ticket.sale(0));
  }
  @Test
  public void test1000() {
    assertEquals(new BigDecimal(99000), ticket.sale(1000));
  }
}

销量为负数的时候,王二希望功能代码能够抛出异常;销量为零的时候,功能代码的计算结果应该为零;销量为一千的时候,计算结果应该为 99000。


重新运行一下测试用例,结果如下图所示:



有两个测试用例没有通过,那么王二需要继续修改功能代码,调整如下:

public class Ticket {
  private final static int PRICE = 99;
  public BigDecimal sale(int count) {
    if (count < 0) {
      throw new IllegalArgumentException("销量不能为负数");
    }
    if (count == 0) {
      return BigDecimal.ZERO;
    }
    if (count == 1) {
      return new BigDecimal(PRICE);
    }
    return new BigDecimal(PRICE * count);
  }
}


再运行一下测试用例,发现都通过了。又到了重构的时候了,销量为零、或者大于等于一的时候,代码可以合并,于是重构结果如下:


public class Ticket {
  private final static int PRICE = 99;
  public BigDecimal sale(int count) {
  if (count < 0) {
    throw new IllegalArgumentException("销量不能为负数");
  }
  return new BigDecimal(PRICE * count);
  }
}


重构结束后,再运行测试用例,确保重构后的代码依然可用。


04、最后


从上面的实践过程可以得出如下结论:


TDD 想要做的就是让我们对自己的代码充满信心,因为我们可以通过测试代码来判断这段代码是否正确无误。

也就是说,TDD 流程比较关键的一环在于如何写出有效的测试代码,这里有 4 个原则可以参考:


1)测试过程应该尽量模拟正常使用的过程。


2)应该尽量做到分支覆盖。


3)测试数据应该尽量包括真实数据,以及边界数据。


4)测试语句和测试数据应该尽量简单,容易理解。


注意,这 4 个原则不仅适用于 TDD,同样适用于任何流程下的单元测试。


最后,我想说的是,不管 TDD 有没有死,TDD 都不是银弹,不可能适合所有的场景,但这不应该成为我们拒绝它的理由。


相关文章
|
8月前
|
Devops Java 测试技术
软件测试/测试开发|常见软件测试框架类型:TDD、BDD、DDD、ATDD、DevOps介绍
软件测试/测试开发|常见软件测试框架类型:TDD、BDD、DDD、ATDD、DevOps介绍
|
8月前
|
监控 前端开发 JavaScript
如何测试前端代码? 知道 BDD, TDD, Unit Test 么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)?
如何测试前端代码? 知道 BDD, TDD, Unit Test 么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)?
152 0
|
3月前
|
测试技术 C# 数据库
C# 一分钟浅谈:测试驱动开发 (TDD) 实践
【10月更文挑战第18天】测试驱动开发(TDD)是一种软件开发方法论,强调先编写测试代码再编写功能代码,以确保代码质量和可维护性。本文从 TDD 的基本概念入手,详细介绍了其核心步骤——编写测试、运行测试并失败、编写代码使测试通过,以及“红绿重构”循环。文章还探讨了 TDD 的优势,包括提高代码质量、促进设计思考、减少调试时间和文档化。此外,文中分析了常见问题及解决方案,如测试覆盖率不足、测试代码过于复杂、忽视重构和测试依赖过多,并通过一个简单的计算器类的代码案例,展示了 TDD 的实际应用过程。
49 1
|
5月前
|
Java 测试技术 开发者
提高代码质量:深入实践测试驱动开发(TDD)
【8月更文挑战第14天】测试驱动开发是一种强大的软件开发方法,它通过先写测试再编写代码的方式,显著提高了代码质量。通过实践TDD,开发者可以编写出更可靠、更易于维护的代码,并加速开发进程。虽然TDD需要一定的学习和适应过程,但其带来的长期收益是不可估量的。如果你还没有尝试过TDD,现在就开始吧!
|
5月前
|
测试技术 Go
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
|
5月前
|
测试技术 开发者 Ruby
探索Ruby中测试驱动开发(TDD)的实践及其对传统开发模式的挑战
【8月更文挑战第31天】测试驱动开发(TDD)是一种重要的软件开发方法论,强调先编写测试再编写代码,确保每一步开发都基于测试。在灵活且表达力强的Ruby语言中,TDD尤为适用。本文通过对比传统开发模式与TDD,探讨如何在Ruby中有效实践TDD。传统模式下,测试常被视为次要步骤;而在TDD中,先编写失败的测试用例,再编写通过该测试的代码。以Ruby on Rails项目为例,介绍如何为用户模型添加邮箱验证功能。
36 0
|
8月前
|
敏捷开发 测试技术
深入理解并应用测试驱动开发(TDD)
【5月更文挑战第30天】测试驱动开发(TDD)是一种先编写测试用例再写代码的方法论,核心是&quot;先测试,后开发&quot;。通过&quot;红-绿-重构&quot;的循环,确保代码正确性,提升简洁性和可维护性。TDD步骤包括编写测试用例、运行测试、编写实现代码、重构及循环迭代。它能提高代码质量,促进团队合作,降低维护成本,并适应敏捷开发。在开发实践中,应用TDD能有效提升效率和代码质量。
|
6月前
|
Java 测试技术
Java中的测试驱动开发(TDD)实践
Java中的测试驱动开发(TDD)实践
|
8月前
|
监控 前端开发 JavaScript
如何测试前端代码? 知道 BDD, TDD, Unit Test 么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)?
如何测试前端代码? 知道 BDD, TDD, Unit Test 么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)?
80 0
|
8月前
|
算法 测试技术 开发者
测试驱动开发(TDD)实战:从理论到实践
【5月更文挑战第8天】TDD实战指南:先测试后开发,确保代码质量与可维护性。核心思想是编写测试用例→实现代码→验证→重构。优点包括提高代码质量、促进设计思考和增强可测试性。实战步骤包括编写独立、明确的测试用例,遵循最小可用原则编写代码,运行测试并分析失败原因,以及在验证通过后进行代码重构与优化。通过TDD,开发者能提升编程技能和项目成功率。