gpt4 book ai didi

testing - 如果方法的要求(已经有很多测试)发生变化,我该怎么办?

转载 作者:行者123 更新时间:2023-11-28 21:10:13 25 4
gpt4 key购买 nike

我对TDD(测试驱动开发)有一些疑问:一个方法已经有一些测试,需求发生变化,我该怎么办?

假设有一个出租车计价器,2km 的初始票价为 $6,然后每多一公里 $0.8,并且 $0.25 每等待一分钟。我写了几个这样的测试:

public class TaximeterTest {
@Test public void testInitFare() {
assertEquals(new Taximeter().calcuate(2), 6.0, 0.00001);
}
@Test public void test3km() {
assertEquals(new Taximeter().calcuate(3), 6.8, 0.00001);
}
@Test public void test8km() {
assertEquals(new Taximeter().calcuate(8), 9.2, 0.00001);
}
@Test public void test3kmWaiting1Minute() {
assertEquals(new Taximeter().calcuate(3, 1), 7.05, 0.00001);
}
@Test public void test8kmWaiting10Minutes() {
assertEquals(new Taximeter().calcuate(8, 10), 11.7, 0.00001);
}
}

然后要求发生变化:出租车计价器应该四舍五入价格,所以 3km 应该是 $7,对于 8km,它应该是 $9

我现在该怎么办?我有两个选择:

1。修改所有受影响的现有测试,不会涉及新方法

public class TaximeterTest {
@Test public void testInitFare() {
assertEquals(new Taximeter().calcuate(2), 6.0, 0.00001);
}
@Test public void test3km() {
assertEquals(new Taximeter().calcuate(3), 7.0 /*rounded*/, 0.00001);
}
@Test public void test8km() {
assertEquals(new Taximeter().calcuate(8), 9.0 /*rounded*/, 0.00001);
}
@Test public void test3kmWaiting1Minute() {
assertEquals(new Taximeter().calcuate(3, 1), 7.0 /*rounded*/, 0.00001);
}
@Test public void test8kmWaiting10Minutes() {
assertEquals(new Taximeter().calcuate(8, 10), 12.0 /*rounded*/, 0.00001);
}
}

如果只有几个测试似乎工作正常,但如果规则足够复杂,可能需要更改几十个测试。

我也想知道四舍五入前的真实票价,如果我只知道四舍五入的价格,我觉得不安全。

所以我正在考虑选项 2

2。添加internalPricefinalPrice

的概念

internalPrice为四舍五入前的价格,finalPriceinternalPrice四舍五入后的价格。

首先我需要将calculate方法重命名为internalPrice,测试的类名也更改为TaximeterInternalPriceTest,但是所有的测试中的数据没有改变:

public class TaximeterInternalPriceTest {
@Test public void testInitFare() {
assertEquals(new Taximeter().internalPrice(2), 6.0, 0.00001);
}
@Test public void test3km() {
assertEquals(new Taximeter().internalPrice(3), 6.8, 0.00001);
}
@Test public void test8km() {
assertEquals(new Taximeter().internalPrice(8), 9.2, 0.00001);
}
@Test public void test3kmWaiting1Minute() {
assertEquals(new Taximeter().internalPrice(3, 1), 7.05, 0.00001);
}
@Test public void test8kmWaiting10Minutes() {
assertEquals(new Taximeter().internalPrice(8, 10), 11.7, 0.00001);
}
}

然后为 finalPrice 创建新的测试:

public class TaximeterFinalPriceTest {
@Test public void testInitFare() {
assertEquals(new Taximeter().finalPrice(2), 6.0, 0.00001);
}
@Test public void test3kmWaiting1Minute() {
assertEquals(new Taximeter().finalPrice(3, 1), 7.0 /*rounded*/, 0.00001);
}
@Test public void test8kmWaiting10Minutes() {
assertEquals(new Taximeter().finalPrice(8, 10), 12.0 /*rounded*/, 0.00001);
}
}

但问题是 internalPrice 实际上只在 finalPrice 中使用,应该是私有(private)的,但如果我想测试它,它是非私有(private)的:

double internalPrice(int km, int waitingMinutes)
public double finalPrice(int km, int waitingMinutes)

我现在很困惑,不确定哪个选项更好,或者是否有更好的选项。有帮助吗?

最佳答案

你可以打碎这个物体。例如:

  • 一个获取距离并返回给定距离的价格的对象。
  • 一个需要等待时间并返回等待价格的对象。
  • 一个是出租车计价器,它采用每条规则并将它们组合起来并返回最终价格。

可以单独测试每个距离对象的价格,无需担心等待时间或最终价格的逻辑变化。每个等待对象的价格可以单独测试,不用担心距离或最终价格的逻辑变化。Taximeter 可以使用 stub 进行测试,以便可以在不影响其单元测试的情况下更改规则。

关于testing - 如果方法的要求(已经有很多测试)发生变化,我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33565941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com