• 12
  • 12
分享

一、单元测试的目的

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

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

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

二、单元测试做什么

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

       1.接口功能性测试

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

(1) 是否被顺利调用

(2)参数是否符合预期

       2.局部数据结构测试

       保证数据结构的正确性

(1)变量是否有初始值或在某场景下是否有默认值

(2)变量是否溢出

       3.边界条件测试

(1)变量无赋值(null)

(2)变量是数值或字符

(3)主要边界:最大值,最小值,无穷大

(4) 溢出边界:在边界外面取值+/-1

(5)临近边界:在边界值之内取值+/-1

(6)字符串的边界,引用 "变量字符"的边界

(7)字符串的设置,空字符串

(8)字符串的应用长度测试

(9)空白集合

(10) 目标集合的类型和应用边界

(11) 集合的次序

(12)变量是规律的,测试无穷大的极限,无穷小的极限

       4.所有独立代码测试

       保证每一句代码,所有分支都测试完成,主要包括代码覆盖率,异常处理通路测试

(1)语句覆盖率:每个语句都执行到了

(2)判定覆盖率:每个分支都执行到了

(3)条件覆盖率:每个条件都返回布尔

(4)路径覆盖率:每个路径都覆盖到了

       5.异常模块测试、后续处理模块测试:

       是否包闭当前异常或者对异常形成消化,是否影响结果!

三、JAVA的单元测试JUNIT4

       1.业务流程的一般是按照需求的预期效果,跑完整个业务流程,包括以前开发的流程

(1)是否实现了预期

(2) 是否影响到了以前的流程

(3)全流程是否顺利

(4)数据是否符合预期

       2.代码测试:

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

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

       注意:

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

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

       3.断言测试与及常用断言:

       assertEquals:

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

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

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

       主要常用方法 :

       断言列表:

(1)assertTrue(String message, boolean condition)

       要求condition == true

(2)assertFalse(String message, boolean condition)

       要求condition == false

(3)assertEquals(String message, XXX expected,XXX actual)

       要求expected期望的值能够等于actual

(4)assertArrayEquals(String message, XXX[] expecteds,XXX [] actuals)

       要求expected.equalsArray(actual)

(5)assertNotNull(String message, Object object)

       要求object!=null

(6)assertNull(String message, Object object)

       要求object==null

(7)assertSame(String message, Object expected, Object actual)

       要求expected == actual

(8)assertNotSame(String message, Object unexpected,Object actual)

       要求expected != actual

(9)assertThat(String reason, T actual, Matcher matcher)

       要求matcher.matches(actual) == true

(10)fail(String message)

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

       4.运行器指定

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

       5.参数化测试

@RunWith(Parameterized. class )
 public   class  TestParam {
 
     private   static  Calculator calculator  =   new  Calculator(); //需要测试的类
     private   int  param; 
     private   int  result;
 
     @Parameters
     public   static  Collection data(){
    return  Arrays.asList(new  Object[][] {{ 11 ,  17 } , { xx1 ,  xx} } );
     } 
     //有参构造,在实例的时候实现参数初始化
     public  TestParam( int  param,  int  result){
     this .param  =  param;
     this .result  =  result;
     } 
     @Test
     public  void  TestResult(){
    calculator.square(param);
     assertEquals(result, calculator.getResult()); 
     } 
}

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

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

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

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

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

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

       6.打包测试

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

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


作者:mcxbl

原文链接:https://www.cnblogs.com/mcxbl/p/13765360.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 1、添加线程组2、配置http信息头管理;使用json格式传递数据时,必须配置此项;3、添加httpcookie管理器,根据具体情况配置cookie信息,本例中未配置4、配置http请求默认值;同一个项目的接口请求放在一个线程组中,可配置请求默认值,这样无需在各接口请求中单独配置;5、配置http请求,就是具体请求的接口;本例中参数格式为json格式,使用bodydata;6、添加查看结果树,可查看接口执行情况整体的可看聚合报告Label:每个JMeter的element(例如HTTPRequest)都有一个Name属性,这里显示的就是Name属性的值#Samples:表示你这次测试中一共发出...
            13 13 1870
            分享
          •   黑盒测试的原则  依据软件需求文档设计测试用例,验证软件实现满足需求文档的情况,软件文档的正确性对于测试的有效性至关重要。  有针对性地查找问题,并能正确定位问题所在。检查功能实现是否正确,是否存在未实现,未全部实现,实现错误等情况。  根据软件功能的重要性以及时间进度安排确定测试等级以及测试重点,减少程序中出现严重缺陷的可能性。  制定合理的测试计划和测试策略,尽可能发现程序中的错误,并且尽可能的站在用户的角度去进行测试。  分析产品的应用场景、所需支持的设备,尽量模拟生产环境搭建测试环境。  黑盒测试的策略  尽量采用等价类分析法和边界值分析法,这两个方法设计的测试用例对于发现程序的错...
            0 0 474
            分享
          •   在天网查上看了一下全国软件公司有1000多万家,其中上市的公司有7万多家,也就是占比0.7%。  通过这个数据可以发现,大部分公司从实力和规模上都偏向中型或者小型,也就说其中的流程不一定很健全,甚至没有流程而言。  下图截取了两张数据的图片供参考:图1  全国软件公司数据图2  上市公司数量  为什么要指出这个问题?笔者目前在二线城市,工作10年经历过几家公司,很少有公司把流程制定得很正规和完善。  基本上的形式是:常规瀑布模式和敏捷模式相结合。赶上功能已上线再出现Bug,常见的状态开发快速定位问题进行修改,测试抓紧时间进行测试,测完后上线发布。  所以得出的结论是流程...
            0 0 1683
            分享
          • 我们使用一个电商项目进行演示,在调用登录接口完成登录之后,通过查看购物车接口获取该用户购物车中的信息。也就是说如果需要查看到购物车中的信息,则我们先要是登陆状态,这样的情况下,就需要有Cookie信息的存在了。提示:要获取购物车接口中的信息,需要使用登录后的Cookie保持登录状态。1、在HTTP信息头管理器组件中添加Cookie信息实现步骤:前提我们手动登陆电商网站,地址:http://www.testingedu.com.cn:8000/index.php/Home/user/login.html。然后通过工具获取到登陆后的Cookie数据。把Cookie数据存储到HTTP信息头管理器组件...
            9 9 4376
            分享
          •   采用人工智能、机器人和其他形式自动化的公司总会让人担心人类会被裁员。但是,正在采用 GenAI 和类人机器人的亚马逊公司的一位高管却声称,这些技术夺走人类工作岗位的说法是一种"神话"。  亚马逊全球机器人、机电一体化和可持续包装总监斯特凡诺-拉罗韦雷(Stefano La Rovere)告诉CNBC,先进的现代科技只会增强工人的作用,创造新的工作类别,而不会导致大规模裁员。  拉罗韦雷对CNBC的"欧洲街景"节目说:"技术和机器人抢走工作岗位是个神话。"亚马逊表示,在过去五年里,它已斥资 7.51 亿美元,在其欧洲l履约中心安装了...
            0 0 474
            分享
      • 51testing软件测试圈微信