`
taowen
  • 浏览: 192201 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

测试写到什么程度算足够?

阅读更多
100%的测试覆盖率
这是一个很显而易见的答案。但是我不认为这是正确的答案。下面是一个小例子:
private int[] map = new int[] {
  1, 3, 5, 8};
public int oddNumber(int index) {
  return map[index - 1];
}

写一个简单的测试
@Test
public void first_odd_number_should_be_one() {
  assertEquals(1, oddNumber(1));
}

这个测试是不是覆盖了100%的代码呢?我认为是覆盖了的。但是是不是真的测试了所有的执行路径呢?显然没有。oddNumber(4)应该是7,但是这个程序会返回8。我们改一个写法:
public int oddNumber(int index) {
  switch(index) {
    case 1: return 1;
    case 2:return 3;
    case 3: return 5;
    case 4: return 8;
  }
  throw new UnsupportedOperationException();
}

换了一种写法之后,测试覆盖率立马就下去了。差别就在于,在第二种写法把执行路径对应到了字面的静态路径上了。所以说,测试应该覆盖是否完全的标准,应该是以动态路径为准,而不是以静态路径为准。同时,也提醒我们,想要靠最后根据测试覆盖率来补测试,是不能让你做到TDD时同等程度的自信的。
在TWU上学的时候,老师给了一个简单的准则:
代码增一行太多,减一行太少
当然,老师是用英文教课的,我是把意思用中文翻译了一下。这句话是说,代码不能多不能少,以恰好让所有测试通过为最佳。为了验证这个道理,据老师说,ThoughtWorks UK有一个开发人员写了一个工具用来“删代码”。如果有一行代码是能够删掉之后还能让所有测试都通过的,那么就删掉它。我觉得,这个准则很有务实,也很有用。同时,也回答了另外一个问题,是不是要给所有的类写对应的测试类来覆盖其所有的行为?我认为没有根据这个准则,答案应该是没有必要。只要你的测试覆盖了这个类的所有执行路径就可以了。至于这个测试是不是针对这个类独立进行测试的,是单元测试还是功能测试,是黑盒测试还是白盒测试,都不重要。重要的是,你删掉这个类中一行或者几行,都会让所有测试中至少一个测试失败。这就能说明,你的测试是写到位了。
当然,再加一些怀疑和批评的态度。对于上面那个放之四海皆准的准则,有一个例外:那就是这个准则只关心程序的正确性,但是我要说程序的行为是由正确性和效率共同组成的。举一个空泛的例子:
if (a) {
 doSomethingUnderConditionA();
} else if (b) {
 doSomethingUnderConditionB();
}

条件A和B可能在匹配的集合上是包含关系,也就是说一个是另外一个的强条件。假设A是更强的条件,那么在条件更强的情况下,我们往往可以给一个更有效率的解。但是有可能,如果没有条件A这个分支,所有情况都走条件B的分支,解仍然是正确的。所有说,A的存在不影响程序的正确性,只影响了程序在特定条件下的效率。那么,在这种情况下,就不能说代码增一行太多了。
分享到:
评论
4 楼 taowen 2006-11-20  
抛出异常的爱 写道
引用

,ThoughtWorks UK有一个开发人员写了一个工具用来“删代码”。


那么在写代码后再删代码?
那么测试的作用就比代码要重要的多了
PS:为什么精华的帖子没什么人看呢?

据我猜想这个工具应该是一个玩笑。举这个例子的目的是说,只要你的测试没有覆盖到你写的某一块代码,这一块代码任何人都有权利删除。
3 楼 Tin 2006-11-20  
代码增一行太多,减一行太少是很难。
因为那样要写一个正确、健壮、有效的测试,这太难了。不是说不要对你的测试进行测试么?
这样,对于自动删程序判断是否还可以通过测试这种方式来说,没有自动化的测试保证是不可以的。但是如果是手动,凭人脑……那么就……

所以,是不是说测试应该保证主干正确性,或者像Rod说的那样代码覆盖率不能说明一切。对于稀的测试path,应该尽量凭经验,没法强求吧。
2 楼 dongbin 2006-11-20  
所以TDD中Test First是前提。任何后补上的Test都很难驱动简单设计,也就不能随意“删代码”。

有人说TDD和Pair Programming是XP的两个最难的门槛,所以初学者可以先绕行。但问题是没有这两者,根本就不是XP。
1 楼 抛出异常的爱 2006-11-20  
引用

,ThoughtWorks UK有一个开发人员写了一个工具用来“删代码”。


那么在写代码后再删代码?
那么测试的作用就比代码要重要的多了
PS:为什么精华的帖子没什么人看呢?

相关推荐

    软件测试的有效方法(第3版 英文版)WorkPaper

    另外,管理层是否对测试理论、过程和工具有足够的了解,以便有效地管理测试计划和执行,并理解测试结果?这要求管理层不仅要提供资源,还要具备相应的专业知识,才能做出正确的决策。 ### 测试过程的应用 测试过程...

    按照业务流和数据流写测试用例

     作为一个完整的详细设计书,它应该写清楚数据的增删改查,当然很多详细设计书没有写到这种程度,可是我们换个角度想,开发人员也是在这种不是很详细的设计下进行开发的,他们要根据式样的理解,写出满足条件的SQL...

    测试用例设计参考文档

    测试用例的数量和深度直接影响了测试的质量和覆盖率,从而影响到软件的可靠性。 测试用例的重要性在于它们为测试活动提供了基础,确保测试的全面性和一致性。每个需求至少应有两个测试用例:一个是正向测试用例,...

    软件/系统测试记录模板

    测试记录模板的设计应尽可能简洁明了,同时包含足够的信息,以支持高效的缺陷管理和问题解决流程。通过规范化的记录,测试团队能够更有效地协作,提高软件和系统的整体质量。在实践中,不断优化和调整模板,使其适应...

    软件测试经典面试题

    2. **测试驱动开发(TDD)**:先写测试用例再编写代码,确保代码质量。 3. **边界值分析**:测试边界条件下的行为,如数组的首尾元素。 4. **错误推测**:根据经验预测容易出错的地方,并针对性地设计测试用例。 5. **...

    menu测试模板

    - **测试目标**:明确测试的目的是什么,例如验证菜单功能的正确性或优化用户体验。 - **测试环境**:列出测试所需的硬件、软件和网络条件。 - **测试步骤**:详述如何执行每个测试用例,包括操作步骤和预期结果。 -...

    华为——测试用例模板

    8. **优先级和关联性**:测试用例的重要程度和与其他用例的关系,帮助确定测试顺序。 9. **负责人**:指定负责执行该测试用例的人员。 10. **状态**:如新建、待执行、执行中、通过、失败等,表示用例的生命周期...

    测试用例和测试报告管理

    测试用例的设计和管理直接影响到测试的效率和有效性,而测试报告则为项目的各方提供了一个评估软件质量的依据。 首先,测试用例设计的基础是基于对软件需求的全面了解,这通常以软件需求分析文档为蓝本。测试用例...

    软件测试 面试题大全

    - **白盒测试**:基于对代码结构的理解来设计测试用例,确保每个逻辑路径都被测试到。 - **黑盒测试**:只关注接口行为,不考虑内部实现细节。 - **边界值测试**:重点测试边界值和异常情况,以发现潜在的错误。 - *...

    软件测试的有效方法(第3版)英文版

    - **政策制定的重要性**:明确组织对软件测试的态度和支持程度。 - **关键问题**: - 组织是否有明确的软件测试政策? - 测试策略是否已经建立? - 是否有支持该策略所需的软件过程和工具? **知识点2:测试策略...

    软件测试规范

    1.什么是软件测试 .................................................................................................................................. 2 2.软件测试的目标 ....................................

    如何写有效的软件测试Bug报告

    - **影响评估**:分析该缺陷对用户及测试过程的影响程度。 - **辅助调试**:提供可能有助于开发人员调试的信息,如截图、日志等。 - **证据支持**:提供证据证明问题的存在,增强报告的可信度。 #### 四、案例分析 ...

    网上购物系统测试计划书

    - **硬件配置**: 测试服务器的具体硬件配置未给出,通常需要足够的CPU、内存、存储空间等。 - **人员**: 包括测试审核人3名和测试实施人员30名。 - **工具**: - 缺陷管理工具: Mantis,用于记录和跟踪缺陷。 - ...

    软件测试报告 和试题

    综合以上内容,我们可以了解到软件测试涉及的广泛知识,包括测试文档编写、测试策略制定、测试工具应用以及如何针对不同类型的系统进行有效的测试。这些资料对于学习和实践软件测试的人来说是宝贵的资源,能够提升...

    软件测试-测试覆盖率

    测试覆盖率是衡量软件测试有效性的重要指标,它反映了测试用例对程序代码执行程度的覆盖。在软件测试过程中,测试覆盖率通常包括逻辑覆盖率和功能覆盖率两个主要方面。 1. 逻辑覆盖率(Code Coverage): - 语句...

    测试你的C语言掌握程度

    ### 测试你的C语言掌握程度 #### C语言基础与字符串操作 **字符串处理函数:** - **`strlen()`**:该函数用于计算一个字符串的实际长度(不包括结尾的空字符`\0`)。例如,对于字符串"hello",其长度为5。 - **`...

    软件测试认证ISEB 试题

    这些标准通常在测试规划阶段制定,包括了测试目标的实现程度、遗留缺陷的数量等。因此,选项A“测试规划”是最合适的答案。 #### 四、定义测试预期结果 **题目**: 以下哪一项定义了测试的预期结果? - A.测试用例...

    XXX项目软件测试计划模板

    测试环境的设定是保证测试有效性的基础,它包括硬件、软件、网络环境等,应与实际运行环境一致,以最大程度地模拟真实情况。 测试方案详细描述了测试范围,包括本次改动点可能影响的领域。测试内容应涵盖功能、性能...

    报表测试的 注意事项

    - **数据的多样性**:考虑到报表可能会涉及多种业务场景,因此测试数据也应该涵盖多种业务类型和状态,以确保测试的全面性。 #### 结论 报表测试不仅仅是简单的功能验证,它涉及到对业务流程的深入理解和对数据...

Global site tag (gtag.js) - Google Analytics