构建之法 第二章 个人技术和流程

这一章重点介绍的是以前了解过但未曾注重过的单元测试&回归测试;个人技术素养是团队协作的基础。

1.VSTS单元测试

  1. 源代码

    public Class User() { public User(string userEmail) { memail = userEmail; } private string memail;//private变量拒绝外部类访问(除非用get/set方法) }

  2. 测试代码1

    public void ConstructorTest() { string userEmail = "[email protected]"; User target = new User(userEmail); Assert.IsTrue(target != null);//测试制定条件为真时测试成功 } 测试E-mail是否确实保存在了User类中。关于Assert:在工程之中可以使用该类对特定的功能进行验证,单元测试方法执行开发代码中的方法代码,但只有包含该语句的时候才能报告代码行为方面的内容。

  3. 测试代码2

    [ExpectedException(typeof(ArgumentNullException))] public void ConstructorTestNull() { User target = new User(null); }

    [ExpectedException(typeof(ArgumentException))] public void ConstructorTestEmptty() { User target = new User(""); }

    [ExpectedException(typeof(ArgumentNullException))] public void ConstructorTestBlank() { User target = new User(" "); }

第三处测试的时候会出错。why?因为ArgumentNullException与ArgumentException是system中不同的类(参见https://msdn.microsoft.com/zh-cn/library/system.argumentnullexception(VS.80).aspx),前者是由于空参数传递给不接受它的方法中引发的异常,后者是由于向方法中提供的一个参数无效而引发的。

2.单元测试标准

  1. 单元测试的基础性:在最基本的功能之上进行测试,覆盖API中的每一个方法【个人认为这样应该是极大地刺激了代码的简洁性革命】但是100%的代码覆盖率并不等于100%的正确性
  2. 单元测试不受以前单元测试实例的干扰
  3. 某个单元测试的成功与否不依赖于别的测试
  4. 单元测试必须和产品代码一起保存和维护

3.回归测试(regression test)

在新版本上运行所有已经通过的测试用例,以验证是否有“退化”的情况发生。单元测试是回归测试的基础。

4.效能分析实践

  • 源代码(伪代码)

    //分析一个文本文件中各个词出现的概率,然后把出现频率最高的10个单词打印出来
    DoIt()
    {
        ProcessFile()
        ProcessBuffer()
        OutputResult()
    }
    ProcessBuffer()
    {
        GetOneWord()
        FreqOneWord()
    }
    FreqOneWord(word)
    {
        Find the word in the array list,
        if(found)
            Update the frequency
        if(not found)
            Add the word in the array list with frequency = 1
    }
    OutputResult()
    {
        Arraylist.Sort();
        Output Top 10 entry;
    }
    
  • step 1 进行分析方法的选择:抽样(sampling)or 代码注入(instrumentation)

【抽样】得到运行时间的函数分布的大致抽样,速度快但是不能得到精确数据;

【代码注入】将检测的代码注入每一个函数中,速度慢但是各个效能数据可以被精确测量

  • step 2 理解必要的名词:

【调用关系树(call tree)】从mainh函数开始,调用者与被调用者函数形成的树型关系

【消逝时间(elapsed time)】用户角度看程序运行所花的时间

【本函数时间(exclusive time)】所有在本函数花费的时间,不包括被调用者花费的时间

【应用程序时间(application time)】应用程序占用CPU的时间,不包括CPU在核心态时花费的时间

  • step 3 抽样分析(利用效能浏览器 Performance Explorer)

耗时最高的前三个函数:FreqOneWorld,EqualsHelper,ArrayList.get_Item

举例来说明耗时时间的长短:

for(i = 0;i<m_worldList.Count;i++)
{
    ......
}

验证表明,mworldList.Count被调用了1 600 000次以上。也就是说,如果将for循环中的mworldList.Count用一个变量代替,将极大地节省时间。

【一些寻常的习惯可能极大地拖慢程序代码的整体时间性能。效能分析是给我们一种“强迫式”改善思维方式的外力】

5.PSP

个人开发流程(personal software process)又叫PSP,是指导软件工程师进行开发的方法论;一般包括计划、开发(含测试)、报告。PSP目的是记录工程师如何实现需求的效率,而不是记录顾客对产品的满意度。

【也就是说,PSP并不是万能的(事实上也不存在万能的方法论);只是在前人实践的基础上总结出的通用方法集】

时间: 2024-12-07 23:07:51

构建之法 第二章 个人技术和流程的相关文章

构建之法第二章个人技术和流程

如果说第一章我还有点概念,那么第二章我可以说一窍不通,什么是VSTS,什么是单元测试,什么是回归测试,还是什么是效能分析--好多的新名称,第一次看见,是那么的没有头绪.要不是百度了,仅仅看书,我完全不知VSTS--Visual Studio Team System,是由微软开发的一套具有高生产力.高集成性.可扩展的生命周期开发工具. 2.1.1节图文并茂的告诉我,单元测试重要作用,可能是自己的能力不足,相关知识了解的太少了,一边看还一边想,单元测试怎么写?写在哪里?什么时候写?就算是按照书本上的

读构建之法 第二章:个人技术和流程

绝大部分软件都是由多人合作完成的,大家的工作相互有依赖关系.某人负责的模块的功能被其他人调用,但如何让自己负责的模块功能定义尽量明确,模块内部的改变不会影响其他模块,而且模块的质量能得到稳定的.量化的保证???单元测试就是一个很有效的解决方案. 创建单元测试函数的主要步骤是: 1.设置数据(一个假象的正确的E-mail地址) 2.使用被测试类型的功能(用E-mail地址来创建一个User类的实体) 3.比较实际结果和预期的结果(Assert.IsTrue(target!=null) 创建完就可以

构建之法(第二章个人技术和流程)

在第二章的学习之中,了解到第二章主要讲:单元测试,回归测试,效能分析,个人软件开发流程(PSP) 1.单元测试 软件是由多人合作完成的,不同的工作有相互依赖的关系.单元测试应该准确,快速地保证程序基本模块的正确性. 单元测试好坏的标准如下: 1.单元测试应该在最低功能/参数上验证程序的正确性.        2.单元测试必须由最熟悉代码的人(程序的作者)来写        3.单元测试后,机器状态保持不变        4.单元测试要快(一个测试的运行时间是几秒钟,而不是几分钟)       

构建之法第二章

本章为个人技术和流程,主要介绍了单元测试.回归测试.效能分析和个人软件开发流程等内容. 单元测试:如何能让自己负责的模块功能定义尽量明确,模块内部的改变不会影响其他模块,而且模块的质量能得到稳定的.量化的保证,单元测试就是一个很有效的解决方案. 1.用VSTS写单元测试:在写技术模块的规格说明书的时候,要越详细越好,最好各项要求都可以表示为一个单元测试用例. 2.好的单元测试的标准: 1>单元测试应该在最基本的功能/参数上验证程序的正确性 2>单元测试必须由最熟悉代码的人(程序的作者)来写 3

构建之法第二章读书心得

通过阅读第二章的内容,了解到了为什么要进行单元测试.因为软件是由多个人共同完成的,如果某个模块出现问题,那么整个软件都会出错.那么怎么样才能做好测试呢?1.要在功能和参数上验证程序的正确性.2.单元测试最好由代码的作者来写.3.保证测试之后,机器状态保持不变.4.速度要快.5.重复测试结果应该一致.我们还要对程序进行效能分析,保证程序运行的又快又好,占用资源少.效能分析可以通过抽样或代码注入来完成.我们还应该对个人开发流程进行如下所示的规划:预估任务所需时间.分析需求.生成设计文档.设计复审.代

&lt;构建之法&gt;第二章读后感

本章的实质是在说明,一个合格的软件工程师是怎样的,他应该具备哪些技能. 总结下来,一个合格的工程师在开发时需要同时考虑质量和效率,与之同时需要具备的技能包括:单元测试.效能分析.个人研发流程(PSP): 单元测试能让自己负责的模块功能定义尽量明确,模块内部的改变不会影响其他模块,而且模块的质量能得到稳定的.量化的保证. 创建单元测试函数的主要步骤是: 1.设置数据 2.使用被测试类型的功能 3.比较实际结果和预期结果 怎样才算一个好的单元测试:单元测试应该准确.快速的保证程序基本模块的正确性.

完成构建之法第二章后面的小实践~

练习数值计算.找出一个整数数组中子数组之和的最大值,例如:数组[1,-2,3,5,-1],返回8,因为符合要求的子数组是[3,5]: 程序代码如下,使用的是C语言: #include<stdio.h>int Serch(int a[],int n){ int i,temp; for(i=1;i<n;i++) { if(a[0]<a[i]) { temp=a[0]; a[0]=a[i]; a[i]=temp; } } for(i=2;i<n;i++) { if(a[1]<

第二章 个人技术和流程

2.1 单元测试 大部分软件是由多人合作完成,不同工作人员相互有依赖关系.例如,一个人负责的模块功能被别人调用.软件的很多错误都来源于程序员对模块功能的误解.疏忽或不了解模块的变化.怎样能让自己负责的模块功能定义尽量明确,模块内部的改变不会影响其他模块,而且模块的质量能得到稳定的.量化的保证?单元测试是一个很有效的解决方法. 好的单元测试标准:a.单元测试应该在最基本的功能/参数上验证程序的正确性. b.单元测试必须由最熟悉代码的人(程序的作者)来写.  c.单元测试过后,机器状态保持不变.  

第二章个人技术和流程课后题

1.软件工程和程序设计大调查 专业         用时                代码                用工具 16计本     两天                500行             Java c语言 16数本     两天                200行             SQ  c语言 说明软件开发是一项繁重的工作,一个人做的话需要耗费大量时间经历,所以需要团队合作,不同的人有不同的想法,开发需要顾虑到每个人的想法,因此团队配合很重要,整合意