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

junit testng_TestNG或JUnit相关推荐

  1. junit junit_穿越JUnit流

    junit junit 关于JUnit 5迁移的好处之一是,您可以在老式模式下运行JUnit 4测试,并且所有内容仍然兼容. 不利的一面是,某些注释和方法在JUnit 4和JUnit 5中具有相同的名 ...

  2. junit junit_使用junit做其他事情

    junit junit junit!=单元测试 Junit是Java单元测试框架. 通常,我们将它用于单元测试,但是很多时候我们也使用它来执行集成测试. 主要区别在于,单元测试测试单个单元,而集成测试 ...

  3. junit runner_了解JUnit的Runner架构

    junit runner 几周前,我开始创建一个小的JUnit Runner( Oleaster ),它允许您使用Jasmine方式在JUnit中编写单元测试. 我了解到,创建自定义JUnit Run ...

  4. JUnit 5 –下一代JUnit的初步了解

    2月初, JUnit 5(又名JUnit Lambda)团队发布了一个alpha版本. 由于JUnit 4是我工具箱中使用最频繁的项目之一,因此我认为值得一看下一个主要版本. 我试用了最新版本,并记下 ...

  5. JUnit 4 与 JUnit 3

    JUnit 是 Java? 语言事实上的 标准单元测试库.JUnit 4 是该库三年以来最具里程碑意义的一次发布.它的新特性主要是通过采用 Java 5 中的标记(annotation)而不是利用子类 ...

  6. JUnit 4和JUnit 5区别

    特征 JUNIT 4 JUNIT 5 声明一种测试方法 @Test @Test 在当前类中的所有测试方法之前执行 @BeforeClass @BeforeAll 在当前类中的所有测试方法之后执行 @A ...

  7. maven安装junit_JUnit安装Maven – JUnit 4和JUnit 5

    maven安装junit JUnit 4 and JUnit 5 are completely different frameworks. They both serve the same purpo ...

  8. junit5和junit4_JUnit声明异常– JUnit 5和JUnit 4

    junit5和junit4 We can test expected exceptions using JUnit 5 assertThrows assertion. This JUnit asser ...

  9. java 计算器 junit测试_Java Junit测试

    使用junit做测试目的是尽量早的发现程序的bug,一个bug隐藏的时间越久,修复他的代价就越大. 1.Junit简介: Junit最初是由Erich Gamma 和 Kent Beck 编写的一个回 ...

最新文章

  1. 路由器远程登陆配置:02多人登陆一台设备
  2. SAP GUI和Windows注册表
  3. js(Dom+Bom)第五天(1)
  4. 前端导出文件,后端返回文件流过大直接干崩溃
  5. java 异常补偿解决_第三方接口调用异常补偿机制实现实例记录
  6. 【Java】实现矩阵的转置
  7. ArrayList 和LinkedList
  8. otool介绍(转http://www.mc2lab.com/?p=68)
  9. bootmgr is missing
  10. c5 LR is at 对于空指针的定位
  11. 识别IOS和android方法
  12. 旺店助手v1.0.30 独立版
  13. mysql如何不停机迁移_如何实现真正的不停机数据迁移?
  14. linux双系统没有引导,Ubuntu双系统没有可引导设备如何解决
  15. 应用检查后台启动权限方法(小米官方给出的)
  16. Fiddler的详细介绍
  17. Scalar-multiplication算法集
  18. 量子力学 or 线性代数(四)?
  19. 怎么设置ep4ce6e22b8n引脚_利用EP4CE6E22做一块FPGA核心转接板(原理图、PCB源文件、测试程序)...
  20. MBA案例分析(行销与营销之行销五)

热门文章

  1. ssm(Spring+Spring mvc+mybatis)mybatis配置文件——mybatis-config.xml
  2. ssm(Spring+Spring mvc+mybatis)实体类——Dept
  3. ArrayList基操
  4. springboot获取多个请求参数_springboot获取URL请求参数的多种方式
  5. 系统架构设计师考试 重要的部分
  6. 转:微服务设计、拆分原则
  7. finally块不被执行的情况总结
  8. Spring boot(七):Spring boot+ mybatis 多数据源最简解决方案
  9. java 读取 文本块_Java文本块
  10. selenium 替代品_每个人都在谈论Selenium替代品-明智地选择!