我们是否有任何经验法则来估算 JUnit 测试用例的工时
Do we have any thumb rules to estimate man days for JUnit test cases
我们有一个已有 10 年历史的项目,其中包含超过 1000 万行 java 代码。现在由于某些原因,组织决定为旧代码编写 JUnit 测试用例。我们正在使用 Mockito JUnit 测试用例。作为此更改的一部分,我们必须估算人工日的工作量。很难估计现有代码,而且我是这个项目的新手。只是想知道是否有任何经验法则可以根据代码行数进行估算。
我不能给你一个现实的估计,但我可以给你一个下限估计,这将 - 希望 - 表明手头的任务不应该完成。要使行覆盖率达到 80% 以上,您需要的手工测试代码行数与您的生产代码行数大致相同;所以这是 10 mio LOTC。凭借 20 年的 TDD 经验,我认为我从未在一天内编写超过 500 LOC 的代码(实际上,大多数日子可能少于 50 行)。所以下限是 10000000/500 = 20000 天或 100 人一整年除了编写测试什么都不做。
这听起来很可笑吗?因为它是。使这种规模的系统达到合理质量的状态需要不同的方法。您可能想阅读有关处理和替换遗留系统的策略。现在获取所有(或大部分)代码进行测试是不可行的。
根据我的个人经验,您想要实现的覆盖率与编写适当测试所需的工作量相关,与以这种方式编写代码所需的工作量相比,覆盖率等于编写测试工作量的比率以及总的开发工作量。
c = t / (t + e)
哪里
- t 是开发测试所需的工作量,
- e 开发代码所花费的精力和
- t + e = 总开发工作量(测试 + 代码)
- c 覆盖率。
例如:
- 对于 0% 的覆盖率,显然需要 0% 的总开发工作量
- 对于 20% 的覆盖率,需要将总开发工作的 20% 用于编写测试
- 对于 50% 的覆盖率,编写测试需要总开发工作量的 50%
- 对于 80% 的覆盖率,编写测试需要 80% 的总开发工作
我想,你明白了。
这是一个经验法则,在较高的值 (-> 100%) 中可能会有点不精确,并且实际上取决于开发人员编写可测试代码和健壮测试的经验。它进一步基于这样的假设和观察,即工作量与覆盖率不是线性的——更高的覆盖率需要额外的努力来处理难以测试的案例,并且非平凡的测试代码,特别是对于设置,需要比测试代码更多的测试代码。
这个公式的优点是,它很容易理解和计算,只用相关的指标(工作量、覆盖率),但它不是科学方法,只是一种快速估计的方法。
对于遗留代码(可能不太好测试),您希望知道已经为此付出的努力,您可以估计需要实现的努力目标覆盖率。
所以根据花费的努力和目标覆盖率进行估算的公式是
t = e*c / (1-c)
因此,如果您已经花费了 1000 人日 (PD),则还需要再花费 1000 人日才能达到 50% 的覆盖率。或 33% 的 500 个 PD,或 20% 的 250 个 PD。或者 80% 的 4000 个 PD。
与 Johannes 的下限估计相比:
- 假设:500 LoC / PD -> 10mio LOC = 20.000 PD
- Johannes 下限估计:
- 20.000 PD 占 80%
- 我的(上限?)估计:
- 20.000 PD 50%
- 80.000 PD 为 80%(别忘了,代码可能无法很好地测试)
事实可能介于两者之间。
我们有一个已有 10 年历史的项目,其中包含超过 1000 万行 java 代码。现在由于某些原因,组织决定为旧代码编写 JUnit 测试用例。我们正在使用 Mockito JUnit 测试用例。作为此更改的一部分,我们必须估算人工日的工作量。很难估计现有代码,而且我是这个项目的新手。只是想知道是否有任何经验法则可以根据代码行数进行估算。
我不能给你一个现实的估计,但我可以给你一个下限估计,这将 - 希望 - 表明手头的任务不应该完成。要使行覆盖率达到 80% 以上,您需要的手工测试代码行数与您的生产代码行数大致相同;所以这是 10 mio LOTC。凭借 20 年的 TDD 经验,我认为我从未在一天内编写超过 500 LOC 的代码(实际上,大多数日子可能少于 50 行)。所以下限是 10000000/500 = 20000 天或 100 人一整年除了编写测试什么都不做。
这听起来很可笑吗?因为它是。使这种规模的系统达到合理质量的状态需要不同的方法。您可能想阅读有关处理和替换遗留系统的策略。现在获取所有(或大部分)代码进行测试是不可行的。
根据我的个人经验,您想要实现的覆盖率与编写适当测试所需的工作量相关,与以这种方式编写代码所需的工作量相比,覆盖率等于编写测试工作量的比率以及总的开发工作量。
c = t / (t + e)
哪里
- t 是开发测试所需的工作量,
- e 开发代码所花费的精力和
- t + e = 总开发工作量(测试 + 代码)
- c 覆盖率。
例如:
- 对于 0% 的覆盖率,显然需要 0% 的总开发工作量
- 对于 20% 的覆盖率,需要将总开发工作的 20% 用于编写测试
- 对于 50% 的覆盖率,编写测试需要总开发工作量的 50%
- 对于 80% 的覆盖率,编写测试需要 80% 的总开发工作
我想,你明白了。 这是一个经验法则,在较高的值 (-> 100%) 中可能会有点不精确,并且实际上取决于开发人员编写可测试代码和健壮测试的经验。它进一步基于这样的假设和观察,即工作量与覆盖率不是线性的——更高的覆盖率需要额外的努力来处理难以测试的案例,并且非平凡的测试代码,特别是对于设置,需要比测试代码更多的测试代码。 这个公式的优点是,它很容易理解和计算,只用相关的指标(工作量、覆盖率),但它不是科学方法,只是一种快速估计的方法。
对于遗留代码(可能不太好测试),您希望知道已经为此付出的努力,您可以估计需要实现的努力目标覆盖率。
所以根据花费的努力和目标覆盖率进行估算的公式是
t = e*c / (1-c)
因此,如果您已经花费了 1000 人日 (PD),则还需要再花费 1000 人日才能达到 50% 的覆盖率。或 33% 的 500 个 PD,或 20% 的 250 个 PD。或者 80% 的 4000 个 PD。
与 Johannes 的下限估计相比:
- 假设:500 LoC / PD -> 10mio LOC = 20.000 PD
- Johannes 下限估计:
- 20.000 PD 占 80%
- 我的(上限?)估计:
- 20.000 PD 50%
- 80.000 PD 为 80%(别忘了,代码可能无法很好地测试)
事实可能介于两者之间。