您的位置:首页 > 编程语言 > Java开发

Java单元测试框架-JUnit4

2017-08-13 00:00 411 查看
毋庸置疑,程序员要对自己编写的代码负责,您不仅要保证它能编译,正常运行,而且要满足需求和设计的预期的效果。单元测试正是验证代行为是否满足预期的有效手段之一,单元测试工具JUnit使得这一切变得简单艺术起来。

JUnit的最佳实践:单元测试代码和被测试代码使用一样的包,不同的目录(与Maven推荐的目录结构一致)

开发过程中进行单元测试的目的:

减少排错时间

提升代码质量

JUnit4快速入门

JUnit4是xUnit的子集,xUnit是一套基于测试驱动开发的测试框架

JUnit4提过一系列判断测试结果是否正确的静态断言方法-Assert

测试类的规范:

测试方法必须使用注解@Test修饰

测试方法必须使用public void 修饰,而且不能带有任何参数

需要测试的类:

public class Calculate {
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) {
return a / b;
}
}

在Eclipse中建立相应类的测试单元很简单:

第一步



第二步



第三步



单元测试类:

public class CalculateTest {
@Test
public void testAdd() {
assertEquals(6, new Calculate().add(3, 3));//使用断言测试期望输出与实际输出是否一致
}
@Test
public void testSubtract() {
assertEquals(3, new Calculate().subtract(6, 3));
}
@Test
public void testMultiply() {
assertEquals(9, new Calculate().multiply(3, 3));
}
@Test
public void testDivide() {
assertEquals(3, new Calculate().divide(9, 3));
}
}

JUnit4使用详解

JUnit最佳实践:测试任何可能的错误,单元测试不是证明你是对的,而是用来证明你没有错。

单元测试的范围要全面,比如对边界值,正常值,错误值的测试;对代码可能出现的问题全面预测,而这也是需求分析,详细设计环节要考虑的。

JUnit测试失败的情况分两种:failure 和 error

failure 一般由单元测试使用的断言方法判断失败引起的,它表示在测试点发现了问题



error则是由代码异常引起的,这是测试目的之外的发现,它可能产生与测试代码本身的错误(测试代码也是代码,也有可能出错),也可能是被测试代码的一个隐藏bug。



单元用例用来表达想要的预期结果,但对于逻辑错误无能为力

JUnit4的运行流程

@BeforeClass修饰的方法会在所有方法被调用前被执行,而且该方法是静态的,所以当测试类被加载后接着就会运行它,而且在内存中它只会存在一份实例,它比较适合加载配置文件。

@AfterClass所修饰的方法通常用来对资源的清理,如关闭数据库的连接

@Before和@After会在每个测试方法的前后各执行一次。

类级别的运行流程



方法级别的运行流程



JUnit4的常用注解

@Test:将一个普通的方法修饰为一个测试方法

​ @Test(expected=异常类.class)

​ 显示了测试方法会出现的异常后,当测试方法抛出此异常后会,该测试方法依然能通过测试

​ @Test(timeout = 毫秒)

​ 作用于测试方法的执行是否超时,若超时则测试不通过

@BeforeClass:它会在所以方法运行前被执行,static修饰

​ 用于引入一些资源文件等

@AfterClass:它会在所以方法运行结束后被执行,static修饰、

​ 用于方法执行完毕以后关闭资源,例如数据库连接等

@Before: 会在每个测试方法被运行前执行一次

@After: 会在每个测试方法运行后执行一次

@Ignore: 所修饰的测试方法会被测试运行器忽略

@RunWith:可以更改测试运行器,自定义的运行器需继承org.junit.runner.Runner



JUnit4的深入使用

JUnit4中的测试套件,运行多个测试类,测试套件是一个空类,使用@RunWith(测试套件类.class)

@RunWith(Suite.class)
@Suite.SuiteClasses({TaskTest1.class,TaskTest2.class,TaskTest3.class})
public class SuiteTest {
/*
* 1.测试套件就是组织测试类一起运行的
*
* 写一个作为测试套件的入口类,这个类里不包含其他的方法
* 更改测试运行器Suite.class
* 将要测试的类作为数组传入到Suite.SuiteClasses({})
*/
}

JUnit4的参数化测试

@RunWith(Parameterized.class)
public class ParameterTest {
/*
* 1.更改默认的测试运行器为RunWith(Parameterized.class)
* 2.声明变量来存放预期值 和结果值
* 3.声明一个返回值 为Collection的公共静态方法,并使用@Parameters进行修饰
* 4.为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值
*/
int expected =0;
int input1 = 0;
int input2 = 0;
@Parameters
public static Collection<Object[]> t() {
return Arrays.asList(new Object[][]{
{3,1,2},
{4,2,2}
}) ;
}
public ParameterTest(int expected,int input1,int input2) {
this.expected = expected;
this.input1 = input1;
this.input2 = input2;
}
@Test
public void testAdd() {
assertEquals(expected, new Calculate().add(input1, input2));
}
}

JUnit4在web项目中的使用

Web项目中测试类的整合,测试运行器也用spring框架的运行器

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/spring-dao.xml",
"classpath:spring/spring-service.xml"})
public class SeckillServiceTest {
//.......
}

总结

测试用例建立在业务逻辑的正确性上,需要对业务有深刻的理解,才能写出有效的测试用例。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java EE JUnit