junit testng_TestNG或JUnit

junit testng

多年以来,无论何时使用Java代码进行单元测试,我始终会回到TestNG。 每当我拿起TestNG时,人们都会问我为什么要继续使用TestNG,尤其是默认开发环境(例如Eclipse或Maven)提供的JUnit时。

继续进行同样的战斗,昨天我开始研究Spring的测试支持 。 它还建立在JUnit之上。 但是,在使用相同功能的几分钟后,我一直在寻找JUnit中一直找不到的功能。 TestNG使用DataProviders提供参数化测试 。 考虑到我再次问自己一个熟悉的问题– TestNG或JUnit,我决定对此进行记录,以便下次可以确定是哪个以及为什么。

基本上一样

如果您只是要进行一些基本的单元测试,那么这两个框架基本上是相同的。 这两个框架都允许您快速有效地测试代码。 他们在Eclipse和其他IDE中具有工具支持。 他们还在Ant和Maven等构建框架中获得了支持。 对于初学者来说,JUnit一直是首选,因为它是第一个用于单元测试的框架,并且一直可用。 我谈论的许多人直到我们谈论它之前都没有听说过TestNG。

灵活性

让我们来看两个简单的测试用例。

package com.kapil.itrader;
import java.util.Arrays;
import java.util.List;
import junit.framework.Assert;
import org.junit.BeforeClass;
import org.junit.Test;public class FibonacciTest
{private Integer input;private Integer expected;@BeforeClasspublic static void beforeClass(){// do some initialization}@Testpublic void FibonacciTest(){System.out.println("Input: " + input + ". Expected: " + expected);Assert.assertEquals(expected, Fibonacci.compute(input));assertEquals(expected, Fibonacci.compute(input));}
}

好吧,这是示例展示,我正在使用4.x +版本,并且正在使用注释。 优先于4.0版本; JUnit不支持注释,这是TestNG相对于竞争对手的主要优势; 但是JUnit很快就适应了。 您可能会注意到,JUnit还支持静态导入,并且像以前的版本一样,我们可以省去更多麻烦的代码。

package com.kapil.framework.core;
import junit.framework.Assert;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;public class BaseTestCase
{protected static final ClassPathXmlApplicationContext context;static{context = new ClassPathXmlApplicationContext("rootTestContext.xml");context.registerShutdownHook();}@BeforeSuiteprivate void beforeSetup(){// Do initialization}@Testpublic void testTrue(){Assert.assertTrue(false);}
}

首先看一下这两个代码,可以推断两者几乎相同。 但是,对于那些已经完成足够的单元测试的人,我会同意TestNG可以提供更大的灵活性。 JUnit要求我将初始化方法声明为static; 因此,我将在该方法中编写的任何内容也必须是静态的。 JUnit还要求我将初始化方法公开。 但是TestNG不会。 我也可以在测试课程中使用OOP的最佳做法。 除了@ BeforeClass,TestNG还允许我声明测试套件,组,方法,并使用@ BeforeSuite,@ BeforeMethod,@ BeforeGroups之类的批注。 当编写需要访问公共数据集的任何级别的集成测试或单元测试用例时,这非常有用。

测试隔离和依赖性测试

在进行隔离测试时,Junit非常有效。 从本质上讲,这意味着您无法控制测试的执行顺序。 并且,因此,如果由于某种依赖关系而有两个要按特定顺序运行的测试,则无法使用JUnit进行。 但是,TestNG允许您非常有效地执行此操作。 在Junit中,您可以解决此问题,但它并不整齐,也不那么容易。

基于参数的测试

TestNG提供的一个非常强大的功能是“参数化测试”。 JUnit在4.5+版本中为此添加了一些支持,但是它不如TestNG有效。 您可能与FIT合作过,您会知道我在说什么。 但是,JUnit中添加的支持非常基础,并且效果不佳。 我已经修改了我以前的测试用例,以包括参数化测试。

package com.kapil.itrader;import static org.junit.Assert.assertEquals;import java.util.Arrays;
import java.util.List;import junit.framework.Assert;import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;@RunWith(Parameterized.class)
public class FibonacciTest
{private Integer input;private Integer expected;@Parameterspublic static List data(){return Arrays.asList(new Integer[][] { { 0, 0 }, { 1, 1 }, { 2, 1 }, { 3, 2 }, { 4, 3 }, { 5, 5 }, { 6, 8 } });}@BeforeClasspublic static void beforeClass(){System.out.println("Before");}public FibonacciTest(Integer input, Integer expected){this.input = input;this.expected = expected;}@Testpublic void FibonacciTest(){System.out.println("Input: " + input + ". Expected: " + expected);Assert.assertEquals(expected, Fibonacci.compute(input));assertEquals(expected, Fibonacci.compute(input));}}

您会注意到,我已经使用@RunWith批注来对测试用例进行参数化。 在这种情况下,将使用已用@Parameters注释的内联方法– data()将数据提供给该类。 但是,最大的问题是将数据传递给类构造函数。 这使我只能在此类中编写逻辑绑定的测试用例。 而且,我最终将对一个服务拥有多个测试用例,因为该服务中的所有各种方法都需要不同的数据集。 好消息是,有各种开放源代码框架扩展了此方法,并添加了自己的“ RunWith”实现,以允许与CSV,HTML或Excel文件等外部实体集成。

TestNG提供了开箱即用的支持。 不支持读取CSV或外部文件,但支持数据提供程序。

package com.kapil.itrader.core.managers.admin;import org.testng.Assert;
import org.testng.annotations.Test;import com.uhc.simple.common.BaseTestCase;
import com.uhc.simple.core.admin.manager.ILookupManager;
import com.uhc.simple.core.admin.service.ILookupService;
import com.uhc.simple.dataprovider.admin.LookupValueDataProvider;
import com.uhc.simple.dto.admin.LookupValueRequest;
import com.uhc.simple.dto.admin.LookupValueResponse;/*** Test cases to test {@link ILookupService}.*/
public class LookupServiceTests extends BaseTestCase
{@Test(dataProvider = "LookupValueProvider", dataProviderClass = LookupValueDataProvider.class)public void testGetAllLookupValues(String row, LookupValueRequest request, LookupValueResponse expectedResponse){ILookupManager manager = super.getLookupManager();LookupValueResponse actualResponse = manager.getLookupValues(request);Assert.assertEquals(actualResponse.getStatus(), expectedResponse.getStatus());}
}

上面的代码片段展示了我已经将dataProvider用作批注的值,然后提供了一个类,该类负责创建在调用时提供给方法的数据。 使用这种机制,我可以轻松地以分离的方式编写测试用例及其数据提供程序,并非常有效地使用它。

为什么我选择TestNG

对我来说,参数化测试是我选择TestNG而不是Junit的最大原因。 但是,上面列出的所有内容都是为什么我总是要花几分钟的时间在新的Eclipse安装程序或maven项目中设置TestNG的原因。 当运行大型测试套件时,TestNG非常有用。 对于小型项目或培训活动,JUnit很好; 因为任何人都可以很快开始使用它; 但不适用于我们需要数千个测试用例的项目,并且在大多数测试用例中,您将涵盖各种方案。

参考: Scratch Pad博客上来自我们的JCG合作伙伴 Kapil Viren Ahuja的TestNG或JUnit 。


翻译自: https://www.javacodegeeks.com/2012/01/testng-or-junit.html

junit testng

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/356525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

背单词

背单词 (word.c/cpp/pas) 【题目描述】 fqk 退役后开始补习文化课啦, 于是他打开了英语必修一开始背单词。 看着满篇的单词非常头疼, 而每次按照相同的顺序背效果并不好,于是 fqk 想了一种背单词的好方法!他把单词抄写到一个 n 行…

vue 字符串分割_嗯哼vue组件taginput包教不包会

5分钟实现一个Tag-Input(标签)组件前言本文是wo写组件设计的第一篇文章(处女作),之所以会写组件设计相关的文章,是因为作为一名优秀的前端工程师,面对各种繁琐而重复的工作,我们不应该按部就班的去辛(dao)勤(gen)劳(huo)动(zhong)&#xff0c…

一元操作符——递增和递减操作符(第一次写博客,紧张.)

一元操作符,即只能操作一个值的操作符,是JS中最简单的操作符。 1.递增和递减操作符 分为2个版本:前置型和后置型。若使用前置递增操作符给一个数值加1,要把()放在数值前面: var a 1;a; > va…

Spring 4.2中由注释驱动的事件侦听器

介绍 在应用程序内交换事件已成为许多应用程序中必不可少的部分,幸运的是,Spring为瞬态事件(*)提供了完整的基础结构。 最近对事务绑定事件的重构为我提供了一个借口,以在实践中检查Spring 4.2中引入的新的注释驱动事件…

mysql插入数据不成功_mysql插入数据失败原因分析

今天在做一个项目时,就是把一个数据库里面的资料导入到另一个数据库里面。想想很简单啊,就是用sql语句,把一个数据库里面数据select读取出来,然后循环update到另一个数据库里面。其实操作起来也很简单的,但是中途出现了问题&#…

SpringBoot项目部署与服务配置

spring Boot 其默认是集成web容器的,启动方式由像普通Java程序一样,main函数入口启动。其内置Tomcat容器或Jetty容器,具体由配置来决定(默认Tomcat)。当然你也可以将项目打包成war包,放到独立的web容器中&a…

mysql排序两位数_MySQL_Mysql row number()排序函数的用法和注意,虽然使用不多,但是也有情况 - phpStudy...

Mysql row number()排序函数的用法和注意虽然使用不多,但是也有情况是需要在mysql 里面写语句开发功能的。在sql server 使用惯了,习惯了使用row_number() 函数进行排序,但是mysql 确没有这样一个函数。然后找到了po主写的一篇 文章。通过变量…

UIView动画效果

UIView是iOS系统中界面元素的基础, 所有的界面元素都是继承自它.它本身完全由CoreAnimation来实现的.它真正的绘图部分,是由一个CALayer类来管理.UIView本身更像一个CALayer的管理器,访问它的跟绘图和坐标有关的相关属性. iOS的画面切换效果的API主要通过调用系统已定义的动画效…

mysql bin.000047_mysql-bin.0000X 日志文件处理

一、清除文件[rootjiucool var]# /usr/local/mysql/bin/mysql -u root -pEnter password: (输入密码)Welcome to the MySQL monitor. Commands end with ; or /g.Your MySQL connection id is 264001Server version: 5.1.35-log Source distributionType ‘help;’ or ‘/h’…

向导页设计_向导设计模式

向导页设计我们都喜欢巫师……。 (我的意思是软件向导)。 我们总是很高兴跳到那些“下一步”按钮上,就像我们在我们的时髦的小鸡上跳舞一样。。。 因此,今天我们将您心爱的向导带入您的编码体验。 让我们跳入一个例子。 假设您要设…

Java第十天

线程间通讯: 多个线程在处理同一资源,但是任务却不同。 多生产者,多消费者的问题: if判断标记,只有一次,会导致不该运行的线程运行了。出现了数据错误的情况。 while判断标记,解决了线程获取执行…

使用Apache Drill深入研究当今的大数据

自2014年9月首次提供Beta版以来, Apache Drill一直在获得广泛的用户采用和社区动力。2015年5月发布了Drill的通用版本-Drill 1.0,此后,许多客户已在生产中部署和使用了Drill。 在此博客文章中,我将简要总结客户在Drill中发现的宝贵…

mysql grep 提取错误日志_详解grep获取MySQL错误日志信息的方法

为方便维护MySQL,写了个脚本用以提供收集错误信息的接口。这些错误信息来自与MySQL错误日志,而 通过grep mysql可以获取error-log的路径。以下是全部相关代码:#!/usr/bin/env python2.7#-*- encoding: utf-8 -*-"""该模块用于…

微信小程序需要https后台的创业机会思考

最近比较关注微信小程序,而且微信小程序的后台必须强制要求https, https相对http成本要高很多了。 这里我感觉有2个商机 (1)提供https 中转服务器 ,按流量来收费 (2) 微信小程序https 云后台 对于很多人学…

aspx是什么语言_什么是网页

第一个问题,什么是网页?我们通常在网上浏览的所有网页都是网页,一个网站由一页到50页不等的网页组成,一些大型网站可能包含数千万页,是第一个打开网站的网站。这些页面被称为主页。专有名词:这里简要介绍网页、网站和主…

[Intel Edison开发板] 04、Edison开发基于nodejs和redis的服务器搭建

一、前言 intel-iot-examples-datastore 是Intel提供用于所有Edison开发板联网存储DEMO所需要的服务器工程。该工程是基于nodejs和redis写成的一个简单的工程。针对nodejs和redis会在后面介绍。 It is a Node.js* application written using Express* (https://github.com/stro…

将Lucene搜索集成到应用程序中

本文是我们名为“ Apache Lucene基础知识 ”的学院课程的一部分。 在本课程中,您将了解Lucene。 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式。 此外,您将学习如何将Lucene Search集成到您自己的应用程序中,以…

mysql运算结果放入表中_MySQL表1新增数据,计算开始、结束日期之间所有时间,插入到表2中...

新建表c3#id设置自增量,kk是要同步的一些数据值,dd是开始时间,dde是结束时间CREATE TABLE c3 (id int(11) NOT NULL auto_increment PRIMARY KEY,kk varchar(255),dd datetime,dde datetime)新建表c4#id也设置自增量,kk是要同步…

git-svn — 让git和svn协同工作

git-svn — 让git和svn协同工作svn作为一个优秀源码版本的管理工具,可以适合绝大多数项目。但是因为它的采用中心化管理,不可避免的存在本地代码的备份和版本管理问题。也就是说对于尚未或暂无法提交到Subversion服务器的本地代码来说,存在着…

longtext长度为0是什么意思_为什么 HashMap 中链表长度大于 8 才转化为红黑树?

Java 中的 HashMap 采用链表法来解决哈希冲突(HashMap 原理),即具有相同桶下标的键值对使用一个链表储存。当链表变长时,查找和添加(需要确定 key 是否已经存在)都需要遍历这个链表,速度会变慢。…