2018年09月25日 10:11:18 琼歌 阅读数 5192
 
版权声明:禁止转载 https://blog.csdn.net/qq_36505948/article/details/82797240
 
 

一、单元测试的目的?
      单元测试是编写测试代码,用以检测特定的、明确的、细颗粒的功能!  严格来说,单元测试只针对功能点进行测试,不包括对业务流程正确性的测试。现在一般公司都会进行业务流程的测试,这也要求测试人员需要了解需求! 测试人员也不好过啊~~

目前开发所用的单元是Junit框架,在大多数java的开发环境中已经集成,可以方便开发自己调用!

注意:单元测试不仅仅是要保证代码的正确性,一份好的单元测试报告,还要完整地记录问题的所在和缺陷以及正确的状态,方便后面代码的修复,重构和改进!


二、单元测试做什么?

一般来说,一份单元测试主要包括以下几个方面:

==============================================================================================
1.接口功能性测试: 接口功能的正确性,即保证接口能够被正常调用,并输出有效数据!

------------------> 是否被顺利调用

------------------> 参数是否符合预期

==============================================================================================
2.局部数据结构测试:保证数据结构的正确性
------------------> 变量是否有初始值或在某场景下是否有默认值
------------------> 变量是否溢出
==============================================================================================
3.边界条件测试:测试
------------------> 变量无赋值(null)
------------------> 变量是数值或字符
------------------> 主要边界:最大值,最小值,无穷大
------------------> 溢出边界:在边界外面取值+/-1
------------------> 临近边界:在边界值之内取值+/-1
------------------> 字符串的边界,引用 "变量字符"的边界
------------------> 字符串的设置,空字符串
------------------> 字符串的应用长度测试
------------------> 空白集合
------------------> 目标集合的类型和应用边界
------------------> 集合的次序
------------------> 变量是规律的,测试无穷大的极限,无穷小的极限
==============================================================================================

4.所有独立代码测试:保证每一句代码,所有分支都测试完成,主要包括代码覆盖率,异常处理通路测试
------------------> 语句覆盖率:每个语句都执行到了
------------------> 判定覆盖率:每个分支都执行到了
------------------> 条件覆盖率:每个条件都返回布尔
------------------> 路径覆盖率:每个路径都覆盖到了

==============================================================================================
5.异常模块测试,后续处理模块测试:是否包闭当前异常或者对异常形成消化,是否影响结果!


三、JAVA的单元测试JUNIT4

(1):业务流程的一般是按照需求的预期效果,跑完整个业务流程,包括以前开发的流程
-----------------> 是否实现了预期
-----------------> 是否影响到了以前的流程
-----------------> 全流程是否顺利
-----------------> 数据是否符合预期

==============================================================================================

(2):代码测试:

  1. @BeforeClass 全局只会执行一次,而且是第一个运行
  2. @Before 在测试方法运行之前运行
  3. @Test 测试方法
  4. @After 在测试方法运行之后允许
  5. @AfterClass 全局只会执行一次,而且是最后一个运行
  6. @Ignore 忽略此方法

JUNIT4是以org.junit为框架进行的测试,以注解的形式来识别代码中需要测试的方法!

注意:

对于每一个测试,我们都应该保持独立测试,以确保测试结果是有意义的。在程序中,经常会出现,当测试完一个方法后,其参数已经被系统保持或持久化下来。无疑会造成下一次的测试测试数据或者状态的不合理性!为了解决问题,对于此类场景,我们的测试代码必须具备初始化和收尾的能力。也即是@Before和@After的意义所在!

同理@AfterClass和BeforeClass即是为了满足测试中,那些体积非常大,但只要一次初始化的代码块!

(3):断言测试与及常用断言:

---------->assertEquals:

  1. Assert.assertEquals("此处输出提示语", 5, result);
  2.  
  3. ===================================================================================================================
  4. 解析:"此处输出提示语" 为错误时你个人想要输出的错误信息; 5 是指你期望的值;result 是指你调用程序后程序输出给你的结果
  5.  
  6. @Test(expected = NullPointerException.class)
  7. 解析:在注解的时候添加expected 为忽略此异常
  8. @Test(timeout  =   5000 ):超时设置
  9. @Test(expected  =  XXXXException. class):期望出现异常,如果出现该异常则成功,否则测试失败
  10. @Ignore() :用户方法之上,被注解的方法会被成功需忽略
  11. ===================================================================================================================
  12.  
  13. fail("Not yet implemented")
  14. 解析:放在方法中,如果我顺利地执行,我就报失败出来。就是说按道理不应该执行到这里的,但是偏偏执行了,说明程序有问题
  15. ===================================================================================================================
  16. Assert.assertTrue("msg",boolean)与Assert.assertFalse("msg",boolean)
  17. 解析:如果和预期一样为true则成功,否则失败输出msg;如果和预期一样为false则成功,否则失败并输出

----------> assertNull("msg",boolean)与assertNotNull("msg",boolean)

解析:assertNull与assertNotNull可以验证所测试的对象是否为空或不为空,如果和预期的相同则测试成功,否则测试失败!

========================================主要常用方法============================================

断言列表:
-------------->assertTrue(String message, boolean condition)             要求condition == true
-------------->assertFalse(String message, boolean condition)            要求condition == false
-------------->assertEquals(String message, XXX expected,XXX actual) 要求expected期望的值能够等于actual
-------------->assertArrayEquals(String message, XXX[] expecteds,XXX [] actuals) 要求expected.equalsArray(actual)
-------------->assertNotNull(String message, Object object)          要求object!=null
-------------->assertNull(String message, Object object)             要求object==null
-------------->assertSame(String message, Object expected, Object actual)     要求expected == actual
-------------->assertNotSame(String message, Object unexpected,Object actual) 要求expected != actual
-------------->assertThat(String reason, T actual, Matcher matcher)  要求matcher.matches(actual) == true

-------------->fail(String message) 要求执行的目标结构必然失败,同样要求代码不可达,即是这个方法在程序运行后不会成功返回,如果成功返回了则报错

(4):运行器指定?

单元测试中,每个类都是由于JUNIT4框架中的Runner运行器来执行的。一般情况下,在没有指定运行器的时候,是由系统默认选择(TestClassRunner)的运行器执行。包括类中的所有方法都是由该运行器负责调用和执行。当我们需要指定的时候,则通过类级别注解
@Run Wirth(xxxxxx)进行选择,一般是根据不同类型选择不同执行器,可以提高效率也可以应用于某种特殊场景!

(5):参数化测试?

  1.  @RunWith(Parameterized. class )
  2.  public   class  TestParam {
  3.  
  4.       private   static  Calculator calculator  =   new  Calculator(); //需要测试的类
  5.       private   int  param; 
  6.       private   int  result;
  7.  
  8. @Parameters
  9. public   static  Collection data(){
  10.  
  11.    return  Arrays.asList(new  Object[][] {{ 11 ,  17 } , { xx1 ,  xx} } );
  12.  
  13.  
  14. //有参构造,在实例的时候实现参数初始化
  15. public  TestParam( int  param,  int  result){
  16.   this .param  =  param;
  17.  this .result  =  result;
  18.  
  19. @Test
  20. public  void  TestResult(){
  21.    calculator.square(param);
  22.    assertEquals(result, calculator.getResult()); 
  23.  

解说:参数化测试的目标是为了一次性完成同类型测试,将相同类型的数据按照一定的顺序批量地传入测试方法,并得出结论!其本质是一个批量的化的操作,只是为了方便我们测试而进行了封装。我们只有提供测试的方法以及按照一定的顺序进行设置则可以。

--------->进行类注解:@RunWith(Parameterized.class),为了测试类指定一个ParameterizedRunner运行器

--------->进行参数设置:将测试结果和期望结果,以每一组都是一个数组的形式存放以形成二维数组,转化为list返回并注解。

--------->参数初始化:设置测试方法要入参的参数,并按照"参数设置"的顺序利用构造方法进行初始化的赋值!

--------->测试调用:写一个测试方法进行调用,将参数传递到要测试的类的方法中并返回数据

注意:参数化测试需要创建一单独用于测试的测试类。并定义两个变量用于接受测试结果和预期目标。数据存放以二维数组的方式,两个为一组。接着便是通过构造方法进行数据初始化。 构造方法入参的顺序要和二维数组中国每一组存放的数据顺序保持一致。


(6):打包测试?

  1. @RunWith(Suite. class )
  2. @Suite.SuiteClasses( {CalculatorTest. class ,SquareTest. class } )
  3. public   class  AllCalculatorTests  {
  4. //to do something;
  5. ==========================================================================================================================
  6. 解析:将有需要的一起执行程序一起打包,然后执行
  7. 运行器:Suite. class

解析:我们把需要打包一起测试的测试类作为参数传递给该注解。然后直接运行代码,此处的测试类可以直接设置为空,只需要添加注解便OK;

JAVA单元测试的用法和要点的更多相关文章

  1. JAVA单元测试的用法和要点(入门篇)

    一.单元测试的目的?      单元测试是编写测试代码,用以检测特定的.明确的.细颗粒的功能!  严格来说,单元测试只针对功能点进行测试,不包括对业务流程正确性的测试.现在一般公司都会进行业务流程的测 ...

  2. Java单元测试(Junit+Mock+代码覆盖率)

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...

  3. 原!!关于java 单元测试Junit4和Mock的一些总结

    最近项目有在写java代码的单元测试,然后在思考一个问题,为什么要写单元测试??单元测试写了有什么用??百度了一圈,如下: 软件质量最简单.最有效的保证: 是目标代码最清晰.最有效的文档: 可以优化目 ...

  4. 有效使用Mock编写java单元测试

    Java单元测试对于开发人员质量保证至关重要,尤其当面对一团乱码的遗留代码时,没有高覆盖率的单元测试做保障,没人敢轻易对代码进行重构.然而单元测试的编写也不是一件容易的事情,除非使用TDD方式,否则编 ...

  5. Java单元测试(Junit+Mock+代码覆盖率)---------转

    Java单元测试(Junit+Mock+代码覆盖率) 原文见此处 单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测 ...

  6. Java Web编程技术学习要点及方向

    学习编程技术要点及方向亮点: 传统学习编程技术落后,应跟著潮流,要对业务聚焦处理.要Jar, 不要War:以小为主,以简为宝,集堆而成.去繁取简 Spring Boot,明日之春(future of ...

  7. Java单元测试技术1

    另外两篇关于介绍easemock的文章:EasyMock 使用方法与原理剖析,使用 EasyMock 更轻松地进行测试 摘要:本文针对当前业软开发现状,先分析了WEB开发的技术特点和单元测试要解决的问 ...

  8. 转载-使用 Feed4JUnit 进行数据与代码分离的 Java 单元测试

    JUnit 是被广泛应用的 Java 单元测试框架,但是它没有很好的提供参数化测试的支持,很多测试人员不得不把测试数据写在程序里或者通过其它方法实现数据与代码的分离,在后续的修改和维护上有诸多限制和不 ...

  9. Java单元测试工具:JUnit4(一)(二)(三)(四)

    Java单元测试工具:JUnit4(一)--概述及简单例子 Java单元测试工具:JUnit4(二)--JUnit使用详解 Java单元测试工具:JUnit4(三)--JUnit详解之运行流程及常用注 ...

随机推荐

  1. 9. Java分支语句之if...else

    if...else条件语句 一个if语句包含一个布尔表达式和一条或者多条语句. 语法运用有三种 //第一种 if(布尔表达式){ //如果布尔表达式为true将执行的语句 } //第二种 if(布尔表 ...

  2. 解决npm ERR!Unexpected end of JSON input while paring near (解析附近时JSON输入意外结束)'...."^2.0.0-rc.0","glob"'等npm install错误

    摘要 最近更新了一次node,但是更新后npm的命令总是会报 npm WARN deprecated fsevents@2.0.6: Please update: there are crash fi ...

  3. ES6入门:数据劫持、Proxy、Reflect

    什么是数据劫持 Object数据劫持实现原理 Array数据劫持的实现原理 Proxy.Reflect 一.什么是数据劫持 定义:访问或者修改对象的某个属性时,在访问和修改属性值时,除了执行基本的数据 ...

  4. Vue移动端焦点状态跳转页面,焦点和键盘不消失的问题

    问题:input搜索,在移动端焦点状态跳转页面,焦点不失焦,还在跳转后的页面闪烁,且键盘不消失 //主动隐藏键盘 document.getElementById('inputSearch').blur ...

  5. pip install win32api报错解决方法

    在安装pywinauto模块,导入模块后,提示缺少:win32api 但是在使用pip install安装win32api后,居然报错 错误信息如下: Could not find a version ...

  6. Delphi 类类型

  7. Dart的导包

    Dart中的库主要有三种: 1.我们自定义的库 import 'lib/xxx.dart'; 2.系统内置库 import 'dart:math'; import 'dart:io'; import ...

  8. STM32——CAN协议帧的标准格式和扩展格式与优先级的关系

    一.CAN数据帧的标准格式和扩展格式 我们知道CAN总线上的数据帧都可以配置一个ID号,其可以为11位(标准ID格式)或者29位(扩展ID格式),这也是数据帧的标准格式和扩展格式的区别所在. 这个ID ...

  9. kubernetes之node隔离与恢复

    需求: 在硬件升级, 硬件维护等情况下, 我们需要将某些node隔离, kubectl cordon <node_name> #禁止pod调度到该节点上, 在其上运行的pod并不会自动停止 ...

  10. 04_Redis_Hash命令

    一:Redis 哈希(Hash) 1.1:Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象. 1.2:Redis 中每个 hash 可以存储 ...