zoukankan      html  css  js  c++  java
  • 《构建之法(第三版)》第二章

    第二章:个人技术和流程

    书本内容回顾

    概述

    一个团队需要一定的流程来管理开发活动,每个工程师在软件生命周期所做的工作也应该有一个流程,在这一章里会介绍PS(Personal Software Pro-cess,个人软件开发流程)。

    单元测试

    单元测试的作用:让自己负责的模块功能定义尽量明确,模块内部的改变不会影响其他模块,而且模块的质量能得到稳定的、量化的保证。
    从书中例子可以看出创建单元测试函数的主要步骤是:

    1. 设置数据(一个假想的正确的E-mail地址)
    2. 使用被测试类型的功能(用E-mail地址来创建一个User类的实体)
    3. 比较实际结果和预期的结果(Assert.IsTrue(target != null);)

    好的单元测试的标准

    单元测试应该准确、快速地保证程序基本模块的正确性。下面是验证单元测试好坏的一系列标准:

    1. 单元测试应该在最基本的功能/参数上验证程序的正确性 。
      单元测试应该测试程序中最基本的单元—如在C++/C#/Java中的类,在此基础上,可以测试一些系统中最基本的功能点(这些功能点由几个基本类组成)。从面向对象的设计原理出发,系统中最基本的功能点也应该由一个类及其方法来表现。单元测试要测试API中的每一个方法及每一个参数。
    2. 单元测试必须由最熟悉代码的人(程序的作者)来写 。
      代码的作者最了解代码的目的、特点和实现的局限性。所以,写单元测试没有比作者更适合的人选了。最好是在设计的时候就写好单元测试,这样单元测试就能体现API的语义,如果没有单元测试,语义的准确性就不能得到保障,以后会产生歧义。
    3. 单元测试过后,机器状态保持不变 。
      这样就可以不断地运行单元测试,如果单元测试创建了临时的文件或目录,应该在Teardown阶段删掉。如果单元测试在数据库中创建或修改了记录,那么也许要删除或恢复这些记录,或者每一个单元测试使用一个新的数据库,这样可以保证单元测试不受以前单元测试实例的干扰。
    4. 单元测试要快(一个测试的运行时间是几秒钟,而不是几分钟)。
      快,才能保证效率。因为一个软件中有几十个基本模块(类),每个模块又有几个方法,基本上我们要求一个类的测试要在几秒钟内完成。如果软件有相互独立的几个层次,那么在测试组中可以分类,如数据库层次、网络通信层次、客户逻辑层次和用户界面层次,可以分类运行测试,比如只修改了“用户界面”的代码,则只需运行“用户界面”的单元测试。
    5. 单元测试应该产生可重复、一致的结果 。
      如果单元测试的结果是错的,那一定是程序出了问题,而且这个错误一定是可以重复的,单元测试不能解决所有问题,不必期望它会发现所有的缺陷。
    6. 独立性—单元测试的运行/通过/失败不依赖于别的测试,可以人为构造数据,以保持单元测试的独立性 。
      程序中的各个模块都是互相依赖的,否则它们就不会出现在一个程序中。一般情况下,单元测试中的模块可以直接引用其他的模块,并期待其他的模块能返回正确的结果。如果其他的模块很不稳定,或者其他模块运行比较费时(如进行网络操作),而且对于本模块的正确性并不起关键的作用,这时可以人为地构造数据,以保证单元测试的独立性。
    7. 单元测试应该覆盖所有代码路径 。
      单元测试应覆盖所测单元的所有代码路径,包括错误处理路径。为了保证代码覆盖率,单元测试必须测试公开的和私有的函数/方法
      注意:100%的代码覆盖率并不等同于100%的正确性!
      代码覆盖率对于“应该写但是没有写的代码”无能为力。例如代码申请了内存或其他资源,但并没有释放。又如,代码中并没有处理错误情况。就像没有处理和文件、网络相关的一些异常情况,例如文件不存在、权限有问题,等等。
    8. 单元测试应该集成到自动测试的框架中 。
      要把单元测试自动化,这样每个人都能随时、随地运行单元测试。团队一般是在每日构建之后运行单元测试的,这样单元测试的错误就能及时被发现并得到修改。
    9. 单元测试必须和产品代码一起保存和维护 。
      单元测试必须和代码一起进行版本维护。如果不是这样,过了一阵,代码和单元测试就会出现不一致,程序员要花时间来确认哪些是程序出现的错误,哪些是由于单元测试滞后造成的错误。

    回归测试

    在单元测试的基础上,我们就能够建立关于这一模块的回归测试(Regression Test)。Regress 的英语定义是:return to a worse or less developed state,是倒退、退化、退步的意思。在软件项目中,如果一个模块或功能以前是正常工作的,但是在一个新的构建中出了问题,那么这个模块就出现了一个“退步”(Regression),从正常工作的稳定状态退化到不正常工作的不稳定状态。
    回归测试的目的是:

    1. 验证新的代码的确改正了缺陷 。
    2. 同时要验证新的代码有没有破坏模块的现有功能,有没有Regression 。

    效能分析工具

    VSTS提供了方便的效能分析工具,让我们能很快地找到程序的效能瓶颈,从而能有的放矢,改进程序。
    两种分析方法:
    1.抽样(Sampling)
    简单来说,抽样就是当程序运行时,Visual Studio时不时看一看这个程序运行在哪一个函数内,并记录下来。程序结束后,Visual Studio就会得出一个关于程序运行时间分布的大致印象。这种方法的优点是不需要改动程序,运行较快,可以很快找到瓶颈,但是不能得出精确的数据,也不能准确表示代码中的调用关系树(Call Tree)。
    2.代码注入(Instrumentation)
    另一方面,代码注入就是将检测的代码加入到每一个函数中,这样程序的一举一动都被记录在案,程序的各个效能数据都可以被精准地测量。这一方法的缺点是程序的运行时间会大大加长,还会产生很大的数据文件,也相应增加了数据分析的时间。同时,注入的代码也影响了程序真实的运行情况(这有点像量子物理学中的“测试的光线干扰了被测物体本身”的现象)。

    个人开发流程

    卡内基梅隆大学(CMU)的能力成熟度模型(CMM和CMMI),是用来衡量一个团队能力的一套模型。CMU的专家们针对软件工程师也有一套模型,叫 Personal Software Process(PSP),PSP和任何其他方法论一样,也不是一蹴而就的 。
    PSP有如下的特点:
    1.不局限于某一种软件技术(如编程语言),而是着眼于软件开发的流程,这样,开发不同应用的软件工程师可以互相比较。
    2.不依赖于考试,而主要靠工程师自己收集数据,然后分析,提高。
    3.在小型、初创的团队中,很难找到高质量的项目需求,这意味着给程序员的输入质量不高。在这种情况下,程序员的输出(程序/软件)往往质量也不高,然而这并不能全部由程序员负责。
    4.PSP依赖于数据。
    5.PSP的目的是记录工程师如何实现需求的效率,而不是记录顾客对产品的满意度。

    总结

    本章主要介绍了PSP,也就是个人软件开发流程,psp就像是一个计划表一样,可以很清晰的看到一个团队的工作流程,还可以通过不同时间的不同的psp进行计较,进而看到团队的提高,一个团队的水平!
    中间还介绍了一些有关的需要了解掌握的知识,例如单元测试、回归测试、效能分析等,虽然看完了整个章节,但对书中一些调用实例并没有很好的理解,本书是基于C#语言的,还需要进行相关的学习!

  • 相关阅读:
    2015.2.27 UltraEdit中显示XML结构
    2015.1.31 DataGridView自动滚动到某行
    2015.1.15 利用函数实现将一行记录拆分成多行记录 (多年想要的效果)
    2015.1.15 利用Oracle函数返回表结果 重大技术进步!
    2015.1.15 利用Oracle函数插入表结构 Bulk collect into 不用循环,简洁高效
    2015.1.8 Left join 左连接
    2015.1.10 解决DataGridView SelectionChanged事件自动触发问题
    delphi 遍历窗口
    delphi 访问 protected 属性 哈哈
    clientdataset 读取excel 如果excel 文件不存在的时候 相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据。 这是一个bug 哈哈
  • 原文地址:https://www.cnblogs.com/aiYY/p/9938561.html
Copyright © 2011-2022 走看看