【问题标题】:Rough estimate of test cases粗略估计测试用例
【发布时间】:2012-10-05 15:22:19
【问题描述】:

我很好奇其他人有多少测试用例用于类似于我的网站。这是您的基本 CRUD 与业务工作流网站。 3 个用户角色、几个输入页面、几个搜索页面、一个业务规则引擎等。也许 50k 行 .NET 代码(工作流和持久性一共)。具有大约 10 个主表和大约 100 个支持表(查找、日志等)的数据库。输入数据的主 UI 相当大,大约 100 个数据字段,多个网格,大约 5 个操作/提交类型的按钮。

我知道这很模糊,我只希望得到数量级的数字。我也在考虑基本的测试用例,而不是代码覆盖类型的用例。但是就像我告诉你我们有 25 个测试用例一样,我敢肯定你会说 WAY 还不够。所以我只是在寻找球场数据。

TIA

【问题讨论】:

  • 您总共需要 420 个测试用例,每个用例有 3 个测试。对此投赞成票并接受 Chris Lively 的答案,因为这是正确的答案。 ;-)
  • 我会给你一个+1,因为我认为这是一个值得探讨的话题,但如果招聘经理问这个,这意味着要么a)他并不真正了解测试,要么b)这是一个技巧问题,旨在引发包含短语“代码覆盖率”的响应。我理解作为一名饥渴的顾问,但这类问题确实没有好的整数答案。
  • 我猜没有人真正阅读我的帖子。我要的是一个球场数字,而不是一个确切的数字。另外,我问的是基本测试用例,而不是代码覆盖率用例。如果一位客户要求您提供一些合理的估计,而您甚至无法提出一个,那么您将永远不会被召回。想象一下,如果您要购买汽车,而销售人员甚至无法为您提供有关成本的大致数字。你会去别的地方。

标签: testing


【解决方案1】:

我将拥有尽可能多的测试用例,以确保对系统的高度信任。

表格、规则、代码行等的数量实际上并不重要。

您应该进行适当的单元测试,以确保您的域对象和业务规则正确触发。您应该进行测试以确保您的查询正确执行(这是一个更难的)。

您甚至可能希望拥有通过软件的路径的测试用例。换句话说,点击这里,获取这个页面,点击那里,编辑一个字段,保存页面,返回......这种类型是最困难的,因为测试通常是记录并且在页面更改时必须重新记录(即: 添加或删除字段)。

一般来说,覆盖率比测试次数更多。您希望您的测试涵盖尽可能多的应用程序功能可行。请注意,我没有说可能。您可以使用测试用例覆盖整个应用程序(100%),但是对于每一个小的更改、错误修复等,您都必须重新编码这些测试。这是一个成熟的应用程序更需要的。对于较新的应用程序,您不希望以这种方式束缚您的开发人员和 QA 团队,因为他们会花费大量时间修复/更改单元测试...


对于任何系统,您都可以轻松地花费与开发系统本身一样多的时间来开发自动化测试。在某些情况下,甚至更多。

对于我们的团队,我们倾向于进行大量的单元测试。然而,为了测试通过系统的路径,我们仅在特定区域进入“维护”类型模式时才记录这些路径。这意味着我们预计该领域在很长一段时间内几乎不会发生变化,而路径测试只是为了确保没有人顶起它。


更新:这里的 cmets 将我带到了以下内容:

再进一步:让我们检查一小段代码:

Int32 AddNumbers(Int32 a, Int32 b) {
  return a+b;
}

从表面上看,您只需一次测试即可逃脱:

Int32 result = AddNumbers(1,2);
Assert.Equals(result, 3);

但是,这可能还不够。如果你这样做会发生什么:

Int32 result = AddNumbers(Int32.MaxValue, 1);
Assert.Equals(result, (Int32.MaxValue+1));

现在我们失败了。这是另一个:

Int32 result = AddNumbers(Int32.MinValue, -1);
Assert.Equals(result, (Int32.MinValue-1));

所以,我们有一个非常简单的方法,至少需要 3 次测试。初始看它是否可以给出任何结果,然后 2 进行边界检查。基本上是两行代码(方法定义和一行计算)的 3 次测试。

随着您的代码变得越来越复杂,事情变得非常危险:

Decimal DivideThis(Decimal a, Decimal b) {
  result = Decimal.Divide(a,b);
}

这个微小的变化引入了另一个超出范围的异常条件:DivideByZero。所以现在我们最多需要 2 行代码进行 4 次测试。

现在,让我们稍微简化一下:

String AppendData(String data, String toAppend) {
  return String.Format("{0}{1}", data, toAppend);
}

我们这里的测试用例是:

String result = AppendData("Hello", "World");
Assert.Equals(result, "HelloWorld");

这只是代码块的一个测试用例,不需要其他的。

这告诉我们什么:对于初学者来说,2 行代码可能会导致我们需要 1 到 4 个测试用例。您提到了 50,000 行...使用该逻辑,您将需要 50,000 到 200,000 个测试用例...

当然,生活很少如此简单。在你拥有的 50k 行代码中,将有大量输入非常有限的代码块。例如,抵押贷款利息计算器可能采用 3 个参数,并返回 1 个值(APR)。代码本身可能会运行 100 行左右(已经有一段时间了,请与我一起工作)。测试用例的数量将由边缘用例确定,以确保正确处理舍入。

所以,假设它是 5 个案例:这使我们得到 20 行代码 = 1 个案例。计算出 50k 行可能会产生 2,500 个测试用例。显然比我们上面预期的要小得多。

最后,我要再添一个皱纹。一些测试系统可以处理来自数据文件的输入和断言。考虑到我们的第一个,我们可以有一个数据文件,其中包含我们要测试的每个参数组合的一行。在这种情况下,我们只需要 1 个测试用例即可涵盖 3 个(或更多..)可能的条件。

测试用例可能看起来像(伪代码):

read input file.  
parse expected result, parameter 1, parameter 2
run method
assert method result = parsed result
repeat for each line of the file

借助该功能,我们可以将每个场景减少到 1 个测试用例。我会说每个方法 1 个,但现实情况是大多数方法很少是独立的,并且完全有可能通过对其他方法的显式测试来隐式测试许多方法;因此不需要他们自己的单独测试。


这使我想到:如果不完全了解您的代码库,就不可能确定正确的测试用例数量。根据测试的复杂性,5 个 UI 级别的案例可能足以完全覆盖;或者可能需要数千个。因此,最好将其基于代码覆盖率。您正在测试多少百分比的代码和分支逻辑?

【讨论】:

  • 我同意你所说的大部分内容。我想我的问题是,其他人在 # 测试用例方面提出了什么来提供足够的覆盖率。所以如果我说“我按照你说的 Chris 做了,并且有 5 个测试用例”,你可能会说好吧,无论如何,这太低了。
  • @KaneJeeves:我不能说。如果 5 个测试用例的覆盖率达到 100%,那么这就是您需要的数字。这与测试用例的数量无关;这是关于代码覆盖率的。为此,我会说 70% 的覆盖率是好的;而 80% 到 90% 则很棒。虽然理解在积极开发的应用程序中可能无法达到 100%。
  • 首先感谢您的意见。我会让这笔交易变得更甜蜜。假设您是我想聘请的顾问,为我所描述的系统编写测试用例。我采访了另外 4 个人,他们都给了我一个粗略的 #。你的会是什么? (哦,你破产了,你真的需要穆拉)
  • @KaneJeeves:哈哈。我想说的是,任何说 x 个案例是您需要的人可能不是您想要雇用的人。 ;)
  • @KaneJeeves:查看更新。我想你会明白为什么它是徒劳的......以及为什么我会成为那个得到这份工作的人。
【解决方案2】:

如果你向汽车推销员询问汽车的大致价格,他会给我这个价格,我不会在那里买车,因为他忘了问我一些重要问题。你想要什么样的车?你想在车上添加哪些额外的东西?等等

测试用例的数量也是如此......如果招聘经理问我这个问题,我可能会给他以下答案。

#test case = 在#Requirements*2 和#Requirements*infinite 之间(某些要求可能会导致大量可能性)

我还要说,根据我的经验,这个数字实际上是#Requirements*5(这是我在初始阶段使用的数字,用于具有新功能、更改功能和省略功能的项目)

根据我进行此估计的阶段,必须采用以下误差范围:

启动阶段:误差幅度 = 400% ... 测试阶段:误差幅度 = 10%

当您开始测试阶段时,详细的需求/规范已经可用,需求波动稳定,需求蠕变几乎为零,等等。

到时候我也能给出更好的估计……

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    • 2018-08-26
    • 1970-01-01
    • 2010-11-06
    • 2010-12-02
    • 2020-01-21
    相关资源
    最近更新 更多