1. junit
JUnit是一个Java语言的单元测试框架(回归测试框架)。它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。
Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。
Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。
2. junit 3. 和 junit 4区别
简言之: JUnit4最大的特点是引入了Java5的注释Annotation
因jdk5中的新特性,JUnit4也因此有了很大的改变。确切的说,Junit4简直就不是3的扩展版本,而是一个全新的测试框架。
分类 | junit 3 | junit4 |
继承类 | 需要继承TestCase类 | 已经不需要继承TestCase |
初始化/释放资源 | 需要覆盖TestCase中的setUp和tearDown方法 | 只需要在方法前加上@Before,@After |
对某个方法进行测试时 | 必须让这个方法以testXX开头 | 在方法的前面加上@Test |
仅调用一次 | 如果想仅调用一次setUp()和tearDown() for all test cases, 使用TestSetup类 | @BeforeClass 和 @AfterClass |
断言 | junit3中由于继承了TestCase, 这个TestCase就可以直接assert | junit4需要先引入Assert类, 这个类中有大量的静态方法进行断言的处理 添加了新的断言assertEquals |
异常处理 | 旧式的异常测试是在抛出异常的代码中放入 try 块, 然后在 try 块的末尾加入一个 final() 语句 | 添加@Test,使用参数“expected”, 并指明抛出异常的Exception类 |
暂时不进行的test case (junit 3 ,4相同) | 在该方法前添加@Ignore @Ignore("Not Ready to Run") @Test | 在该方法前添加@Ignore @Ignore("Not Ready to Run") @Test |
设置超时 (junit 3 ,4相同) | 在@Test,使用"timeout"参数(毫秒) @Test(timeout=3000) | 在@Test,使用"timeout"参数(毫秒) @Test(timeout=3000) |
参数化测试 | 不具备 | junit的参数化是在类级别的, 即,每循环一次都将要执行整个类,包括@before和@after |
为了能够在JUnit3环境下run JUnit4 test | 提供了JUnit4Adapter public static junit.framework.Test suite() { return new JUnit4TestAdapter(SimpleMathTest.class); } |
参考:
3. junit 4 实例
(1) 在Eclipse中使用JUnit4进行单元测试
(2)junit 测试 dao-service-controller 视频
(3) junit 数据 驱动测试 (参数化测试)
参数化测试编写流程如下:
a.为参数化测试类用@RunWith注释指定特殊的运行器:Parameterized.class;
b.在测试类中声明几个变量,分别用于存储期望值和测试用的数据,并创建一个使用者几个参数的构造函数;
c.创建一个静态(static)测试数据供给(feed)方法,其返回类型为Collection,并用@Parameter注释以修饰;
d.编写测试方法(用@Test注释)。
a.为参数化测试类用@RunWith注释指定特殊的运行器:Parameterized.class;
b.在测试类中声明几个变量,分别用于存储期望值和测试用的数据,并创建一个使用者几个参数的构造函数;
c.创建一个静态(static)测试数据供给(feed)方法,其返回类型为Collection,并用@Parameter注释以修饰;
d.编写测试方法(用@Test注释)。
注:
junit的参数化是在类级别的,即,每循环一次都将要执行整个类,包括@before和@after;
TestNG的参数化是在测试级别的。
对Calculator类进行参数化测试:
<span style="font-size:14px;">package com.mengdd.junit4;
public class Calculator
{
public int add(int a, int b)
{
return a + b;
}
public int subtract(int a, int b)
{
return a - b;
}
public int multiply(int a, int b)
{
return a * b;
}
public int divide(int a, int b) throws Exception
{
if (0 == b)
{
throw new Exception("除数不能为0");
}
return a / b;
}
}</span>
测试加法的测试类:
<span style="font-size:14px;">package com.mengdd.junit4;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
// 指定运行器runner:使用参数化运行器来运行
public class ParametersTest
{
private int expected;// 期待的结果值
private int input1;// 参数1
private int input2;// 参数2
private Calculator calculator = null;
@Parameters
public static Collection prepareData()
{
// 测试数据
Object[][] objects = { { 3, 1, 2 }, { -4, -1, -3 }, { 5, 2, 3 },
{ 4, -4, 8 } };
return Arrays.asList(objects);// 将数组转换成集合返回
}
@Before
public void setUp()
{
calculator = new Calculator();
}
public ParametersTest(int expected, int input1, int input2)
{
// 构造方法
// JUnit会使用准备的测试数据传给构造函数
this.expected = expected;
this.input1 = input1;
this.input2 = input2;
}
@Test
public void testAdd()
{
Assert.assertEquals(this.expected,
calculator.add(this.input1, this.input2));
}
}</span>
参数化测试参考: