77百科网
当前位置: 首页 生活百科

junit测试主要特征(单元测试结束JunitVS)

时间:2023-07-04 作者: 小编 阅读量: 1 栏目名: 生活百科

所以,单元测试主要包括以下几点:测试范围:单元测试测的是一个单元内部的逻辑,而不是各个模块之间的交互,模块之间的交互应该被称作集成测试。系统间异步交互通知消息。JUnit4的使用限制比TestNG多,并且TestNG使用更加灵活。

前言

在软件开发流程中,单测是非常重要的一环,保证代码质量和效率。但是,实际开发过程中很少有同学会花时间去写单测。一方面,由于项目节奏等原因没时间去写单测代码,另一方面,单测框架太多,找到一个好用其效率高的单测工具也需要一定的成本。

然而,单测除了能验证本身代码的逻辑外,还能对一些特殊场景进行验证,保证代码的健壮性,不会因为日后的需求迭代,结构变更而导致或者新增风险。所以,单测的好处很明显,需要大家在单测和代码直接做一个平衡。

单测的概念

先看一个概念,什么是单元测试:

单元测试(又称为模块测试, Unit Testing)是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在过程化编程中,一个单元就是单个程序、函数、过程等;对于面向对象编程,最小单元就是方法,包括基类(超类)、抽象类、或者派生类(子类)中的方法。

所以,单元测试主要包括以下几点:

  • 测试范围:单元测试测的是一个单元内部的逻辑,而不是各个模块之间的交互,模块之间的交互应该被称作集成测试。
  • 环境依赖:单元测试不应该依赖运行环境,哪怕整体环境无法在跑起来也可以进行测试。
  • 测试效率:单元测试的效率应该足够高,能方便、快速的运行测试代码。

单测技术介绍

|通常单测分为三个部分

Runner:

Runner的目的是为了帮助我们做资源加载等事情,定制单元测试的模板,让我们能够专注于单测case本身的书写,Runner可以理解为单元测试的基础框架。

常用的Runner:junit4,TestNG,IntlTest(IntlTestBlockJUnit4ClassRunner),springTest & springbootTest & SpringContainer4Test(SpringJunit4ClassRunner)等

Mocks:

代理被测试对象,真正对被测试的代码进改造,屏蔽其他外部依赖,让我们的测试用例能够调到我们的测试代码而不是真正的代码。

常用的Mock工具:Mockito,此外还有JMockit、EasyMock、jMock、PowerMock等。

Mock常用的场景:

  1. 外部依赖的应用的调用,比如WebService等服务依赖。
  2. DAO层(访问MySQL、Oracle、Emcache等底层存储)的调用等。
  3. 系统间异步交互通知消息。
  4. methodA里面调用到的methodB。
  5. 一些应用里面自己的Class(abstract,final,static)、Interface、Annotation、Enum和Native等。
Assert:

对测试的结果进行断言判断。

常用的断言工具:AssertJ,JSONassert

单测技术选型

1、Runner选择

目前比较流行的测试框架主要有两种:Junit4和TestNG,对比如下:

主要关注的差别点:

【1】参数化测试

参数化测试是指给单元测试传多种参数值,验证接口对多种不同参数的处理是否正确。

对于n个不同参数组合的测试,JUnit 4要写n个测试用例。每个测试用例完成的任务基本是相同的,只是受测方法的参数有所改变。TestNG的参数化测试只需要一个测试用例,然后把所需要的参数加到TestNG的xml配置文件中。这样的好处是参数与测试代码分离,非程序员也可以修改参数,同时修改无需重新编译测试代码。

JUnit4的使用限制比TestNG多,并且TestNG使用更加灵活。

Junit4 :

测试注解:@RunWith、@Parameter

问题:测试每一个方法都需要新建一个类,并且得按照下面Demo中的方式传参:写一个@Parameters方法返回List的参数,并通过构造函数的方式进行传参。

@RunWith(value = Parameterized.class)public class JunitTest6 {private int number;public JunitTest6(int number) {this.number = number;}@Parameterspublic static Collection<Object[]> data() {Object[][] data = new Object[][] { { 1 }, { 2 }, { 3 }, { 4 } };return Arrays.asList(data);}@Testpublic void pushTest() {System.out.println("Parameterized Number is : "number);}}

TestNG

用XML文件或者注解的方式进行传参:

XML文件:(只支持基础数据类型)

public class TestNGTest6_1_0 {@Test@Parameters(value="number")public void parameterIntTest(int number) {System.out.println("Parameterized Number is : "number);}}

参数化测试(支持复杂数据类型)

@Test(dataprovider = "Data-Provider-Function")public void parameterIntTest(Class clzz, String[] number) {System.out.println("Parameterized Number is : "number[0]);System.out.println("Parameterized Number is : "number[1]);}//This function will provide the patameter data@DataProvider(name = "Data-Provider-Function")public Object[][] parameterIntTestProvider() {return new Object[][]{{Vector.class, new String[]{"java.util.AbstractList","java.util.AbstractCollection"}},{String.class, new String[] {"1", "2"}},{Integer.class, new String[] {"1", "2"}}};}

【2】依赖测试

JUnit 4测试的依赖性非常强,测试用例间有严格的先后顺序。前一个测试不成功,后续所有的依赖测试都会失败。TestNG 利用@Test 的dependsOnMethods属性来应对测试依赖性问题。某方法依赖的方法失败,它将被跳过,而不是标记为失败。

TestNG在依赖测试场景上更加的灵活

@Testpublic void method1() {System.out.println("This is method 1");}@Test(dependsOnMethods={"method1"})public void method2() {System.out.println("This is method 2");}

【3】其他差别

1. JUnit只能进行单元测试,TestNG可以进行单元测试,功能测试,端到端测试,集成测试等。

2. TestNG需要一个额外的xml配置文件,配置测试的class、method甚至package。

3. TestNG的运行方式更加灵活:命令行、ant和IDE,JUnit只能使用IDE。

4. TestNG的annotation更加丰富,比如@ExpectedExceptions、@DataProvider等。

5. 测试套件运行失败,JUnit 4会重新运行整个测试套件。TestNG运行失败时,会创建一个XML文件说明失败的

综上:Runner的选型,我们选用TestNG。

Mocks的选择

Mock是我们代码中使用最多的一种操作了,Mock工具的好坏直接影响了我们单测的效率。

Mock工具有很多,常见的有JMockit、EasyMock、jMock、PowerMock等,几种Mock工具的原理大同小异

|Jmockit

中文网网址:http://jmockit.cn/

(推荐)jmockit Tutorial :https://zhuanlan.zhihu.com/p/24719968

Assert选择

assert工具在这里推荐使用AssertJ

选择AssertJ的原因:

  • 流式断言,代码即用例,直观易懂

举个例子:

判断一个字符串包不包括a跟b两个字符。要这么写

//junit或testngassertTrue(stringbuffer.contains("a") && stringbuffer.contains("b"))//AssertJassertThat(stringbuffer).contains("a").contains("b").as("判断字符串是否包括a|b")

相比之下,显然后者更加容易理解,而且as的注释更是让断言清晰。

  • 强大的API支持
  1. api库更强大。除了以上基础类型和异常、日期、类属性、soft断言api,更突出的优势是扩展了对以下领域的支持:DB(据说适配myBatis, Hibernate, JOOQ等多种DB框架)、Guava、Swing;Uri、xml、file;jdb8如:Future,Stream, Optional, Java 8 Date等
  2. api可读性更好,更加贴近自然语义,AssertJ中封装了海量的api,基本都可以从名字中明确理解含义
  • 可读性更好
  • 可自定义断言器

具体可看AssertJ官网地址:http://joel-costigliola.github.io/assertj/

    推荐阅读
  • 专注恋爱的快穿文(快穿耽美文推荐)

    ]楚宴每次穿越,都会被系统提高100%的美貌值。主角的亲人or朋友or兄弟在后面追着求灭,蓝田疯狂逃跑:不要过来啊。结果现在——主角抱着他天天喊:亲爱的~蓝田:???再次找到小皇帝。

  • 如懿传舒妃来历(如懿传舒妃扮演者是谁)

    乾隆十三年孝贤皇后去世后,叶赫那拉氏被晋升为舒妃,开始步入乾隆后宫上层。如若不然,以舒妃的出身,她至少也会获得贵妃的名分,乾隆四十二年,舒妃叶赫那拉氏香消玉殒,终年49岁。《如懿传》中,舒妃扮演者是陈昊宇。1992年04月07日生于福建省福州市,中国内地女歌手、演员。2013年,参加在台湾政治大学举办的“全台湾校园歌唱比赛”并夺得冠军。

  • outlook自动回复怎么设置(设置步骤介绍)

    打开OutLook软件,登录自己的账号确定状态为已连接到MicrosoftExchange,接下来我们就来聊聊关于outlook自动回复怎么设置?以下内容大家不妨参考一二希望能帮到您!确定状态为已连接到MicrosoftExchange。点击“文件”,选择“信息”,点击“自动答复”。在“我的组织外”进行规则编辑,完成后点击“确定”即可。

  • 黑芝麻麻薯吐司怎么做(黑芝麻麻薯吐司zf)

    黑芝麻麻薯吐司怎么做?用料:高筋粉112克,麻糬粉12克,细砂糖19克,盐1.5克,干酵母2克,蛋12克,水62克,黄油12克,黑芝麻10克。继续揉至拉膜,加入芝麻,揉匀。滚圆,放入大碗,进行基础发酵。面团长大至两倍。取出,排气,分割成三等分,滚圆,松弛15分钟,擀成椭圆形,卷起。收口向下,放入抹油的模具中。面团长至模具上沿,表面刷蛋液,放入烤箱,中下层,上下火180度,烤约25分钟左右。

  • 十二星座最想和另一半接吻(12星座肯这样吻你才是真正爱你)

    12星座肯这样吻你才是真正爱你,TA是这样的吗?面对最爱的人,你喜欢什么样的亲吻方式呢?欢迎和大家一起探讨哦。文中所用配图均来源于网络

  • 最强蜗牛华夏怎么刷威望(华夏刷威望攻略)

    下面希望有你要的答案,我们一起来看看吧!最强蜗牛华夏怎么刷威望进华夏图之后直接刷人气到4500解锁幽州的战斗事件。然后第一次进图加速出貂蝉。探索点要开死武将给威望那个,然后优先开武将开到十个以上武将之后控制自己战力。然后无限进图刷幽州的战斗事件死了就出去再进来一次大概20s左右能刷1000左右的威望,威望刷到自己觉得差不多了,优先拉满甄姬大小乔和貂蝉然后再开始推图。

  • 比较有创意的wifi名字(比较有创意的wifi名字大全)

    长得好看的才能连嘀嘀咕咕的猪,下面我们就来说一说关于比较有创意的wifi名字?我们一起去了解并探讨一下这个问题吧!两包辣条约么三岁就会撩妹密码是叫爸爸全拼关晓彤和鹿晗分手了吗叫爸爸没对象省流量穷屌丝我发誓再也不发誓了连wifi都喜欢易烊千玺梅川酷子痴槑ル僮这个名字好搞笑

  • 野鸡养殖过程中如何使野鸡开食

    开食的早晚直接影响雏野鸡的成活率,开食过早,野鸡大部分不会采食,影响野鸡的整齐度,即使能够采食也会造成消化不良,引起各种疾病。开食过晚,又会影响生长发育,增大死亡率。开食可喂粗蛋白为25%以上的全价配合饲料。野鸡最好采用湿喂法,1日龄在垫纸上撒饲料。任其自由采食,第2天开始,逐渐改用食槽料桶,让野鸡自由采食。

  • 秋天对应的美食味道(自在宁国秋天吃啥好)

    落户在宁国市的安徽天行健农业股份有限公司目前拥有全球最大的乌骨羊种群,纯种数量占世界种群四分之三以上。最适合寻找的美味九月黄农历九月,九月黄就熟了。九月黄是一种野果,又称预知子、九月炸、牛腰子、狗腰子。槠栗苦槠又名槠栗,苦槠树是农村人最爱的树。

  • 电热水器只加热到35度不加热了(电热水器只加热到35度不加热的原因)

    电热水器只加热到35度不加热了电热水器只加热到35度不加热的原因是因为感应装置封闭了,接收不到需要加热的信号,所以就不会自动加热。根据国际标准,在4升出水量的情况下,每1000瓦能温升4-5摄氏度。比如洗澡需要用40摄氏度,进水温度是10摄氏度,但即热式电热水器只有5000瓦,那么4升水量的出水温度只能达到35摄氏度。