免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1433 | 回复: 0
打印 上一主题 下一主题

《Junit in Action》学习笔记 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-16 22:22 |只看该作者 |倒序浏览
本文内容简介:
1.Junit概述
2.Junit相关知识点 和 test suite & testcase使用
3.软件测试分类 & 软件生命周期每阶段的任务
4.单元测试从以下几个方面进行测试
6.特定的测试用例设计
7.软件开发模型
-------------------------------------------------
正文
1.Junit概述:
    ①Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。
    ②Junit测试是自动化测试的一种方式,它使得bug容易被控制。
    ③Junit本质上是一套框架,即开发者制定了一套条条框框,遵循这此条条框框要求编写测试代码,如继承某个类,实现某个接口,就可以用Junit进行自动测试了。
    ④由于Junit相对独立于所编写的代码,可以测试代码的编写可以先于实现代码的编写,XP 中推崇的 test first design的实现有了现成的手段:用Junit写测试代码,写实现代码,运行测试,测试失败(状态条为:红色),修改实现代码,再运行测试,直到测试成功(状态条为:绿色)。以后对代码的修改和优化,运行测试成功,则修改成功。
2.Junit 相关使用
   ①概念:
    |- TestCase(测试用例)--扩展Junit的TestCase类的类。它以testXXX方法的形式包含一个或多个测试。一个testcase把具有公共行为的测试归入一组。
    |- TestSuite(测试集合)--组测试。一个test suite是吧多个相关测试归入一组的快捷方式。例如,如果没有为TestCase 定义一个test suite,那么Junit会自动提供一个test suite。包含TestCase中所有测试。
    |- TestRunner(测试运行器)--执行test suite的程序。Junit提供了几个test runner,可以用来执行你的测试。 没有TestRunner解开,只有一个所偶test runner都继承的BaseTestRunner. 因此,当我们编写TestRunner的时候,实际上指的是任何继承BaseTestRunner的test runner类。
    ②Junit成员共同产生测试结果:
        TestCase + TestSuite + BaseTestRunner =  TestResult
   ③JUnit基本框架的结构
       |- import声明引入必须的JUnit类
       |- 定义一个测试类从TestCase继承
       |- 必需一个调用super(String)的构造函数
       |- 测试类包含一些以test..开头的测试方法
       |- 每个方法包含一个或者多个断言语句
     当然还有一些其他的内容,但满足以上几条的就已经是一个JUnit测试了
   ④JUnit的命名规则和习惯
       |- 如果有一个名为ClassA的被测试函数,那么测试类的名称就是TestClassA
      |- 如果有一个名为methodA的被测试函数,那么测试函数的名称就是testMethodA
   ⑤介绍Test Case、test suite、Test Runner常规使用: (使用的Eclipse自带的Junit)。
       |-Test Case
Java代码

  • import junit.framework.*;  //导入junit.jar包   
  •   /*TestXxx继承自TestCase(命名规范:一般在类名前加Test)*/  
  •   public class TestXxx extends TestCase{      
  • /*测试方法的具体实现(命名规范:以小写的testXxx形式。否则Junt不会自动识别该方法为测试方法)*/  
  • public void testXxx(){};   
  •   }        import junit.framework.*;  //导入junit.jar包
            /*TestXxx继承自TestCase(命名规范:一般在类名前加Test)*/
            public class TestXxx extends TestCase{   
           /*测试方法的具体实现(命名规范:以小写的testXxx形式。否则Junt不会自动识别该方法为测试方法)*/
           public void testXxx(){};
            }
                   
           |-test suite
    Java代码

  • import junit.framework.Test;   
  • public static Test suite(){   
  •    TestSuite suite = new TestSuite();   //实例化   
  •      suite.addTest(new MoneyTest("testXxx"));  //添加测试方法   
  •      suite.addTestSuite(TestMoney.class);  //添加整个测试到集合中   
  • }         import junit.framework.Test;
           public static Test suite(){
              TestSuite suite = new TestSuite();   //实例化
                suite.addTest(new MoneyTest("testXxx"));  //添加测试方法
                suite.addTestSuite(TestMoney.class);  //添加整个测试到集合中
            }
                
           |- Test Runner (junit.textui.TestRunner)
    Java代码

  • public static void main(String args[]){   
  •   junit.textui.TestRunner.run(suite()); //将testsuite 执行。   
  • }          public static void main(String args[]){
              junit.textui.TestRunner.run(suite()); //将testsuite 执行。
             }
          
          
       ⑥Junit断言简介:(都继承自Assert超类)
            |- assertEquals(a, b)
              Asserts that two primitive values are equal.
              测试a是否等于b(a和b是原始类型数值(primitive value)或者必须为实现比较而具有equal方法)
            |- assertFalse(a)
              Asserts that a condition (a) is false.
              测试a是否为false(假),a是一个Boolean数值。
            |- assertTrue(a)
              Asserts that a condition is true.
              测试a是否为true(真),a是一个Boolean数值
            |- assertNotNull(a)
              Asserts that an object isn't null.
              测试a是否非空,a是一个对象或者null。
            |- assertNull(a)
              Asserts that an object is null.
              测试a是否为null,a是一个对象或者null。
            |- assertNotSame(a, b)
              Asserts that two objects do not refer to the same object.
              测试a和b是否没有都引用同一个对象。
            |- assertSame(a, b)
              Asserts that two objects refer to the same object.
              测试a和b是否都引用同一个对象。
            |- fail(message)
               当程序错误时候,输出错误消息
            |-自定义断言
               通常而言,JUnit所提供的标准断言对大多数测试已经足够了。然而,在某些环境下,我们可能更需要自定义一些断言来满足我们的需要。
               通常的做法是定义一个TestCase的子类,并且使用这个子类来满足所有的测试。新定义的共享的断言或者公共代码放到这个子类中。
         ⑦ Junit最佳实践:
            |- 一次只有一个测试对象:(当无法预计这些对象发生改变时不会造成相互影响)
           |- 选择有一个的测试方法名:testXxx命名模式(Xxx为待测方法)。若在同一个方法增添其他测试testXxxYyy的命名模式
            |- Assert调用总解释失败原因。第一个参数务必为描述文本
            |- setUp方法用来实例化DefaultController. Junit会在调用其他之前调用
            |- 一个单元测试等于一个测试方法(简介、专注)
           |- 测试任何可能失败的事务
            |- 让测试改善代码
                编写单元测试常常有助有你写出更好的代码。理由很简单:test case是你代码的用户只有在使用代码时才能发现代码的缺点。所以,不要犹豫,应当根据测试时发现的不使之处重构代码,使其易于使用。测试驱动开发(TDD)的实践就依赖于这条原则。通过先编写测试,你就可以从黛米用户的角度来开发你的类。
            |- 让异常测试易懂。把case块中异常变量命名为expected
           |- 同一个包,分离目录
    3. 软件测试分类 & 软件生命周期每阶段的任务
       |- 软件测试类型分为四类:(集成测试、功能测试、压力/负荷测试、验收测试)
       


      |- 软件生命周期每阶段的任务:
        ①制定计划
          a.确定要开发软件系统的总目标
          b .给出功能、性能、可靠性以及接口等方面的要求
          c.完成该软件任务的可行性研究
          d.估计可利用的资源(硬件、软件和人力等)、成本、效益和开发进度。
          e.制定出完成开发计划任务的实施计划,连同可行性研究报告,提交管理部门审查。
        ②需求分析和定义
          a.去用户处做需求调研,让用户提出对软件系统的所有需求
          b.对用户提出的需求进行分析、综合,并给出详细的定义
          c.编写软件需求说明书及初步的系统的用户手册,提交管理机构评审。
        ③软件设计
          a.概要设计:把个软件需求转化为软件系统的总体结构和数据结构,结构汇总每一部分都是意义明确的模块,每隔模块都和某些需求相对应。
          b.详细设计:(过程设计) 对每个模块要我昵称的工作进行具体的描述,即给出详细的数据结构和算法,为源程序的编写打下基础。
          c.编写设计说明书,提交评审
        ④编码
          a.把软件设计转换成计算机上可以接受的程序代码,即写成以某一特定程序设计的语言表示的‘源程序清单’。这一步工作陈伟编码
          b.要求写出程序应该是结构良好、清晰易读的,且与设计相一致。
        ⑤软件测试
          a.单元测试:查找各模块在功能和结构上存在的问题并加以纠正
          b.继承测试: 将已测试通过的模块按一定顺序组装起来进行测试
          c.有效性测试:按规定的各项需求,逐项进行测试,判断已开发的软件是否合格,能否交付用户使用。
        ⑥运行维护
          a.纠正性维护: 运行中发现了软件中的错误而进行的修改工作。
          b.适应性维护:为了适应变化了的软件工程环境,而做出的适当变更
          c.完善性维护:为了增强软件的功能而做出的变更
          d.预防性测试:为未来的修改与调整奠定更好的基础而进行的工作。
    4.单元测试从以下几个方面进行测试:
       1)模块接口:测试模块的数据流。如果数据不能正确地输入和输出,就谈不上其他测试。因此,对于模块借口需要如下的测试项目:
         ·调用所测模块时的输入参数与模块的形式参数在个数、属性、顺序上是否匹配
         ·是否修改了制作输入用的形式参数
         ·输出给标准函数的参数在个数、属性、顺序上是否匹配
         ·全局变量的定义在各个模块中是否一致
         ·限制是否通过形式参数来传递
       2)局部数据结构测试:模块的举办数据结构式最常见的错误来源,应设计测试用例以检查以下各种错误:
         ·检查不正确或不一致的数据类型说明
         ·使用尚未复制或尚未初始化的变量
         ·错误的初始值或错误的默认值
         ·变量名拼写或书写错误
         ·不一致的数据类型
       3)路径测试:对基本执行路径和循环进行测试会发现大量错误。根据白盒测试盒黑盒测试用例设计方法设计测试用例。设计测试用例查找由于错误的计算、不正确的比骄傲或不正常的控制流而导致的错误。
         ·常见的不正确的计算有:
           |-运算的优先次序不正确或误解了运算的优先次序
           |-运算的方式错误(预算的对象彼此都在类型上不相容)
           |-算法错误
           |-初始化不正确
           |-运算精度不够
           |-表达式的符号表示不正确等
         ·常见的比较和控制流错误哦   
           |-不同数据类型的比较
           |-不正确的逻辑运算符或优先次序
           |-因浮点云山精度问题为找茬的两值比较不等
           |-关系表达式中不正确的变量和比较符
           |-“差1错”,即不正确地多循环或少循环一次
           |-错误的或不可能的循环终止条件
           |-当遇到发散的迭代时不能终止循环
           |-不适当地修改了循环变量等
      4)错误处理测试:比较完善的模块设计要求能遇见出错的条件,并设置适当的出错处理对策,以便在程序出错时,能对出错程序重新做安排,保证其逻辑上的正确性。这种出错处理也是模块功能的一部分。表明出错处理模块有错误或缺陷的情况有:
         ·出错的描述难以理解
         ·出错的描述不足以对错误定位和确定出错的原因
         ·显示错误与实际错误不符
         ·在对错误进行处理之前,错误条件已经引起了系统的干预
         ·如果出错情况不予考虑,那么检查回复正常后模块可否正常工作
      5)边界测试:边界上出现错误上常见的。设计测试用例检查:
         ·在n次循环的第0次、1次、n次是否有错误
         ·运算或判断中取最大最小值时是否有错误
         ·数据流、控制流中刚好等于、大于、小于确定的比较值时是否出现错误
      5.用例设计
       1)测试用例的组成(单元测试中测试用例基本上由测试脚本组成)    ·用例运行前置条件
         ·被测模块/单元所需环境(全局变量赋值或初始化实体)
        ·启动测试驱动
         ·设置桩
         ·调用被测模块
         ·设置预期输出条件判断
         ·恢复环境(包括清除桩)
       2)测试用例设计原则
         ·一个好的测试用例在于能给发现至今没有发现的错误
         ·测试用例应由测试输入数据与之对应的预期输出结果这两部分组成
         ·在测试用例设计时,应当包含合理的输入条件和不合理的输入条件
         ·为系统运行起来而设计测试用例
         ·为正向/逆向而设计测试用例
         ·为满足特殊需求而设计测试用例
         ·而代码覆盖而设计测试用例
      3)用例设计方法
         ·规范(规格)导出法
         ·等价类划分法
         ·边界值分析法
         ·状态转移测试法
         ·分支测试法
         ·条件测试法
         ·数据定义-使用测试法(数据流测试法)
         ·内部边界值测试法
         ·错误猜测法
      6.特定的测试用例设计
        1)声明测试:检测模块中的所有变量是否被声明。
         2)路径测试:要求模块汇总所有可能的路径走被执行一遍,属逻辑覆盖测试
         基本测试路径集要保证:
         ·每个确定语句的每一个方向要测试到
         ·每条语句最少执行一次
        3)循环测试:重点检查循环的条件-判断不烦以及边界条件。 它是一种特殊的路径测试,因为循环比其他语句都复杂一些。循环中错误的发生机会比其他代码构成部分多。
          ·循环不执行
          ·执行一次循环
          ·执行两次循环
          ·反映执行典型的循环的执行次数
          ·如果有最大循环次数,最大循环次数-1
         ·最大循环次数
          ·大于最大循环次数
          对于增量和减量不是1的for语句,要特别注意,因此程序员习惯于增量1
        4)循环嵌套:使逻辑的次数呈几何级数增长。
          ·把外循环设置为最小值,并运行内循环所有可能情况
          ·把内循环设置为最小值,并运行外循环所有可能的情况
          ·把所有循环变量都设置为最小值运行
          ·把所有循环变量都设置为最大值运行
          ·把外循环设置为最大值,并运行内循环的所有可能情况
          ·把内循环设置为最大值,并运行外循环的所有可能情况
         5)边界值测试:(指专门设计用例测试当条件语句中引用的值处在边界或边界附近时系统的放映)把程序内部边界测试。检查确定代码在任何边界情况下都不会出差错。重点检查小于、等于、大于边界条件的情况。被测 语句最好是"if-then...else-end if"
         6)接口测试:检查模块中数据流(输入、输出)是否正确。检查输入的参数和声明的变量的个数,数据类型和输入顺序是否一致。检查全局变量是否被正确的定义和使用等。
          7)确认测试:是否接受有效的输入数据(操作),拒绝无效的数据(操作)
         8)事务测试:输入-->输出,错误处理


    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/99392/showart_1998633.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP