zoukankan      html  css  js  c++  java
  • 单元测试(开篇)

    前言

    要做单元测试,注定少不了单元测试框架和Mock框架.本文选择Junit +Mockito来讨论。先解释一下单元测试和Mock的简单概念.

    单元测试:测试某一个单元的程序是否和预期的一致

    Mock:Mock通常是指,在测试一个对象A时,A依赖B,我们构造一些假的对象来模拟与A之间的交互,而这些Mock对象的行为是我们事先设定且符合预期。通过这些Mock对象来测试A在正常逻辑,异常逻辑或压力情况下工作是否正常。如下图所示:

    为什么选择Junit作为单元测试框架?

     Junit是使用最广泛的单元测试工具,Junit4以后的版本,在主要的功能上,已经相差不大,相比TestNG,Junit不支持重新运行失败机制.但参数化,分组等特性目前已经支持.

    下面这个Junit4和TestNG的比较文章,虽然比较旧,但可以作为参考:

     JUnit4 与 TestNG 的对比 http://www.ibm.com/developerworks/cn/java/j-cq08296

     Junit Wiki https://github.com/junit-team/junit/wiki

     

    Junit概述 

    主要包括三大部分:

    1、用于检测预期结果:Assertions
    2、共享测试数据:Test Fixtures
    3、运行测试: Test Runners

    整体架构如下:

     
     
    相关概念:
     
    TestCase 对测试目标进行测试的方法与过程集合,可称为测试用例
    TestSuite 测试TestCase的集合,可容纳多个TestCase,将其称作测试包
    TestResult 测试结果的描述与记录
    TestListener 测试过程中的事件监听者
    TestFailure 每一个测试方法所发生的与预期不一致状况的描述,称其测试失败元素
    AssertionFailedError JUnit 中的出错异常

      

    什么选择Mockito?

    Mockito最明显的一个特点是API更人性化.详细比较如下:

    Java主流Mock框架功能比较

    语法比较:
     
    更多详情参考:
     

    Mock适用场景

    典型适合Mock的一些场景:
    1、真实对象具有不可确定的行为,产生不可预测的结果
    2、真实对象很难被创建(比如具体的web容器)
    3、真实对象的某些行为很难触发(比如网络错误)
    4、真实情况令程序的运行速度很慢
    5、真实对象有用户界面
    6、测试需要询问真实对象它是如何被调用的(比如测试可能需要验证某个回调函数是否被调用了)
    7、真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一个普遍的问题)
     

    mock点选择

    因为Mock会引入很多工作量,所以不是Mock对象越多越好
    一些常用点:
    1、网络交互:如果两个被测模块之间是通过网络进行交互的,如RPC
    2、外部资源:比如文件系统、数据源,如果被测对象对此类外部资源依赖性非常强,而其行为的不可预测性很可能导致测试的随机失败。
    3、UI:因为UI很多时候都是用户行为触发事件,系统本身只是对这些触发事件进行相应,对这类UI做Mock,往往能够实现很好的收益,很多基于关键字驱动的框架都是基于UI进行Mock的

  • 相关阅读:
    HDU Intelligence System(tarjan+缩点)
    CF Easy Tape Programming(题意)
    poj 3694 Network(边双连通+LAC)
    20121116 CF DIV.2
    poj 2942 Knights of the Round Table(点双连通)
    解决Navihelper.dll(女生宿舍)病毒的方法一则
    在C++ Builder中调用FORTRAN生成的DLL
    过去的2004
    怎么取得DLL文件中的函数名列表?
    Gmail invitations
  • 原文地址:https://www.cnblogs.com/lifepai/p/4363693.html
Copyright © 2011-2022 走看看