zoukankan      html  css  js  c++  java
  • 构建之法 第二章 个人技术和流程

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

    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 = "someone@somewhere.com"; 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并不是万能的(事实上也不存在万能的方法论);只是在前人实践的基础上总结出的通用方法集】

     

  • 相关阅读:
    oracle安装
    Jmeter入门篇
    DOS常用命令
    SpringBoot中使用JNnit4(一)之Mockito的使用
    SpringBoot中使用JNnit4(入门篇)
    SpringBoot搭建
    SpringBoot中集成Swagger2
    jpa使用过程中出现问题记录[持续更新]
    Python逆向(五)—— Python字节码解读
    Python逆向(四)—— Python内置模块dis.py源码详解
  • 原文地址:https://www.cnblogs.com/setname/p/6683661.html
Copyright © 2011-2022 走看看