JUnit3 与 JUnit4 的区别

释放双眼,带上耳机,听听看~!

本想总结下
JUnit3

JUnit4
的区别
,
方便自己的同时也方便他人
,
不想却违反了
DRY
原则
,
网上已经出现了很多的文章。

既然无须再重复造轮子

—————- begin ——————————-

JUnit 4是与JUnit3完全不同的
API
,它基于Java 5.0
中的注解、静态导入等构建而成。
JUnit 4
更简单、更丰富、更易于使用,并引入了更为灵活的初始化和清理工作,还有限时的和参数化测试用例。

代码实例最能说明问题。因此,在本文中,我将使用一个例子来展示不同的测试用例:一个计算器。该示例计算器很简单,效率并不高,甚至还有一些错误; 它仅仅操作整数,并且把结果存储在一个静态变量中。
Substract
方法并不返回一个有效的结果,而且也没有实现乘法运算,而且看上去在 
squareRoot
方法中还存在一个错误:无限循环。这些错误将帮助说明使用
JUnit 4
进行测试的有效性。你可以打开和关闭这个计算器,而且你可以清除这些结果。下面是其实现代码:

package calc; public class Calculator { //存储结果的静态变量 private static int result; public void add(int n) { result = result + n; } public void substract(int n) { result = result – 1; //错误:应该是"result = result – n" } //还没实现 public void multiply(int n) { } public void divide(int n) { result = result / n; } public void square(int n) { result = n * n; } public void squareRoot(int n) { for (; 😉 ;//错误:无限循环 } //清除结果 public void clear() { result = 0; } //打开屏幕,显示"hello",并报警 public void switchOn() { result = 0; //实现其它的计算器功能 } //显示"bye bye",报警,并关闭屏幕 public void switchOff() { } public int getResult() { return result; } }

以下代码是基于JUnit3.8
实现的单元测试
:

package junit3; import calc.Calculator; import junit.Framework.TestCase; public class CalculatorTest extends TestCase { private static Calculator calculator = new Calculator(); @Override protected void setUp() { calculator.clear(); } public void testAdd() { calculator.add(1); calculator.add(1); assertEquals(calculator.getResult(), 2); } public void testSubtract() { calculator.add(10); calculator.subtract(2); assertEquals(calculator.getResult(), 8); } public void testDivide() { calculator.add(8); calculator.divide(2); assertTrue(calculator.getResult() == 5); } public void testDivideByZero() { try { calculator.divide(0); fail(); } catch(ArithmeticException e) { } } public void notReadyYetTestMultiply() { calculator.add(10); calculator.multiply(10); assertEquals(calculator.getResult(), 100); } } 

以下代码是基于JUnit4
实现的单元测试
:

package JUnit 4; import calc.Calculator; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import static org.junit.Assert.*; public class CalculatorTest { private static Calculator calculator = new Calculator(); @Before public void clearCalculator() { calculator.clear(); } @Test public void add() { calculator.add(1); calculator.add(1); assertEquals(calculator.getResult(), 2); } @Test public void subtract() { calculator.add(10); calculator.subtract(2); assertEquals(calculator.getResult(), 8); } @Test public void divide() { calculator.add(8); calculator.divide(2); assert calculator.getResult() == 5; } @Test(expected = ArithmeticException.class) public void divideByZero() { calculator.divide(0); } @Ignore("not ready yet") @Test public void multiply() { calculator.add(10); calculator.multiply(10); assertEquals(calculator.getResult(), 100); } } 

JUnit3 
和 
JUnit4
的区别

1
、JUnit 4
使用org.junit.*包而
JUnit 3.8
使用的是junit.Framework.*;为了向后兼容,JUnit4
发行版中加入了这两种包。

2

JUnit3

,
测试类需要继承junit.framework.TestCase类,
而在
JUniy4
则不用。

3
、JUnit3
通过分析方法名称来识别测试方法:方法名必须以
“test”
为前缀,它必须返回
void,而且它必须没有任何参数
(例如 public void testDivide())
。不遵循这个命名约定的测试方法将被JUnit框架忽略,而且不抛出任何异常(指示发生了一个错误)。

在JUnit4中,测试方法不必以
'test'
为前缀,
而是使用
@Test
注解。但测试方法也必须返回
void
并且无参。在
JUnit4
中,可以在运行时控制这个要求,并且不符合要求的话会抛出一个异常:

java.lang.Exception: Method xxx should have no parameters
java.lang.Exception: Method xxx should be void

@Test
注解支持可选参数。它声明一个测试方法应该抛出一个异常。如果它不抛出或者如果它抛出一个与事先声明的不同的异常,那么该测试失败。

4
、在
JUnit3.8
中,TestCase
类定义了
assertEquals()
方法,
如果要在
JUnit
中向后兼容
,必须静态地导入
Assert
类。这样一来,就可以像以前一样使用
assertEquals
方法。

另外,在
JUnit 4
中,还引入了两个新的断言方法,它们专门用于数组对象的比较。如果两个数组包含的元素都相等,那么这两个数组就是相等的。

public static void assertEquals(String message, Object[] expecteds, Object[] actuals); public static void assertEquals(Object[] expecteds, Object[] actuals); 

由于
JDK 5.0
的自动装箱机制的出现,原先的12个
assertEquals
方法全部去掉了。

例如,原先
JUnit 3.8
中的
assertEquals(long

long)
方法在
JUnit 4
中要使用
assertEquals(Object

Object)
。对于
assertEquals(byte

byte)
、 
assertEquals(int

int)
等也是这样。这种改进将有助于避免反模式。


JUnit 4
中,新集成了一个
assert
关键字
(
见我们的例子中的
divide()
方法
)
。你可以象使用
assertEquals
方法一样来使用它,因为它们都抛出相同的异常
(java.lang.AssertionError)

JUnit 3.8

assertEquals
将抛出一个
junit.framework.AssertionFailedError
。注意,当使用
assert
时, 你必须指定
Java

"-ea"
参数;否则,断言将被忽略。

5
、预设环境
(Fixture)

Fixture
是在测试期间初始化和释放任何普通对象的方法。在
JUnit 3.8
中,你要使用
setUp()
来实现运行每一个测试前的初始化工作,然后使用
tearDown()
来进行每个测试后的清理。这两个方法在 
TestCase
类中都得到重载,因此都被唯一定义。注意,我在这个
Setup
方法使用的是
Java5.0
内置的
@Override
注解

这个注解指示该 方法声明要重载在超类中的方法声明。在
JUnit 4
中,则代之使用的是
@Before

@After
注解;而且,可以以任何命名。

6
、如果想忽略某个测试方法,在
JUnit3
中,通过注释掉该方法或者改变命名约定,这样测试运行机就无法找到它;
问题随之而来
,
如果在众多测试中忽略某些测试方法,你可能记不住重命名这个方法;

而在JUnit4

,把
@Ignore
注解添加到
@Test
的前面或者后面即可。其好处在于,测试运行机将会统计出忽略的测试方法数目、运行的测试方法数目以及运行失败的测试方法数目。
@Ignore
使用一个可选参数
(
一个
String)记录方法被忽略的原因。

7
、在
JUnit3.8
中,可以选择使用若干运行机:文本型,
AWT
或者
Swing

JUnit4
仅使用文本测试运行机。

注意,JUnit4
不会显示任何绿色条来通知你测试成功了。如果你想看到任何类型的绿色的话,那么你可能需要使用
JUnit
扩展或一种集成了
JUnit

IDE
(例如 
IDEA
或者
Eclipse
)。

JUnit4
的高级特性

@BeforeClass/@AfterClass与@Before/@After 注解比较

@BeforeClass和@AfterClass @Before和@After
在每个类中只有一个方法能被注解。 多个方法能被注解,但其执行的顺序未特别指定,且不运行重载方法。
方法名是不相关的。 方法名是不相关的。
每个类运行一次。 在每个测试方法执行前/执行后运行。
在当前类的@BeforeClass方法运行前先运行超类的@BeforeClass方法。在超类中声明的@AfterClass方法将在所有当前类的该方法运行后才运行。  超类中的@Before在所有子类的该方法运行前运行。在超类中的@After在在所有子类的该方法运行后才运行。
必须是公共和静态的。 必须是公共和非静态的。
即使一个@BeforeClass方法抛出一个异常,所有的@AfterClass方法也保证被运行。 即使一个@Before或者@Test方法抛出一个异常,所有的@After方法也保证被运行。

1
1

关于限时测试

Test
注解的timeout
参数可以指定方法执行时间(
单位毫秒
),
如果方法没有在指定时间内结束
,
则测试不通过。

关于参数化测试

当使用不同的参数对同一方法测试时,
可以使用”参数化测试”加以优化
,
可参照相关资料。

关于测试集

为了在
JUnit 3.8
的一个测试集中运行若干测试类,你必须在你的类中添加一个
suite()
方法。而在
JUnit 4
中,你可以使用注解来代之。你需要使用
@RunWith

@Suite
注解编写一个空类。

package test; import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses({AAATest.class,BBBTest.class}) public class AllTests { } 

在此,
@RunWith
注解告诉
JUnit
它使用
org.junit.runner.Suite
。这个运行机允许你手工地构建一个包含测试(可能来自许多类)的测试集。这些类的名称都被定义在
@Suite.SuiteClass
中。当你运行这个类时,它将运行
AAATest

BBBTest

关于测试运行机

JUnit4
中广泛地使用了测试运行机。如果没有指定
@RunWith,
仍会使用一个默认的运行机
(org.junit.internal.runners.TestClassRunner)
执行。带有
@Test
的方法的类都隐含地拥有一个
@RunWith

给TA打赏
共{{data.count}}人
人已打赏
安全技术

网站制作需要素材的实用网站

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索