Java 单元测试及JUnit的使用

Java 单元测试:
 单元测试是开发者编写的一小段代码,用于检测被测代码的一个很小的、很明确的功能是否正确。
 
 单元测试的方法:
 人工静态分析:人工阅读检测代码
 自动静态分析:使用代码复查工具检查
 自动动态测试:用工具自动生成测试用例并执行被测程序
 人工动态测试:人工设定程序的输入和预期输出,执行程序。
 
 
 
 Junit 单元测试:
 它是人工动态测试
 支持语言C++、Java,支持的IDE: Eclipse
 功能:用单独的classloader来运行每个单元测试
 标准的资源初始化和回收方式(setUp、tearDown)
 
 
 Eclipse 使用Junit测试的方法
 1、导入 Junit Jar包,可以在Java Build Path 中添加,最好直接使用Eclipse 自带的JUnit套件
 2、为单元测试代码创建单独的目录,单元测试代码和被测试代码建议使用一样的包层结构。比如src\com\lls\Person.java 和 testSrc\com\lls\PersonTest.java
 3、创建单元测试类,可以直接通过Eclipse的Junit Test Case 功能进行添加,这样就只需修改Source folder即可
 下面内容为Junit 4.0之后内容
 4、Junix 包所定义的注解及其意义
 方法注解
 @Before - 它所修饰的方法在每个测试方法执行之前都要执行一次。 之前没有注解的版本叫做setUp方法
 @After  - 它所修饰的方法在每个测试方法执行之后都要执行一次。  tearDown方法
 @Test   - 测试用的方法,他可以添加参数来对特定的情况进行验证
 比如@Test(expected=*.class)  表示的是异常的类型,如果没有产生异常则失败
 @Test(timeout = xxx) 表示的是测试的最大时间,超时则认为失败
 @ignore - 它所修饰的测试方法会被忽略
 
 其中@Before 和@After 被称为Fixture,也就是每个测试之前都必须要执行的内容
 
 
 5、测试方法使用要求
 @Test
 public void xxx(无参)
 
 6、使用Eclipse的 Run as Juit来执行测试用例
 如果与测试结果不符,则结果为 失败 failure
 如果测试时,直接产生异常,则结果为error
 
 
 7、测试套件
 也就是一次执行多个测试用例
 方法:创建一个空类作为测试套件的入口。使用注解RunWith和SuiteClasses修饰这个空类。
 将org.junit.runners.Suite 作为参数传入注解RunWith,表示使用套件运行器执行。
 将测试类组成数组作为注解SuiteClasses的参数
 
 比如:
 @RunWith(Suite.class) 
 @Suite.SuiteClasses({xx1.class, xx2.class})
 public class RunAllUtilTestsSuite {
 }

原理及框架说明
 8、Runner 运行器
 在运行测试代码的时候是通过Runner来运行(也就是Runner的子类),比如,默认的JUnit4ClassRunner(不过这个已经废弃了,看来有了新的)
 它可以用@RunWith 注解来说明,需要注意的是它修饰的是类
 
 里面包含两个特殊的测试,参数化测试、套件打包测试
 参数化测试:
 @RunWith(Parameterized.class)
 首先应该为这种测试专门生成一个新的类,因为他要用一个新的运行器。然后指定运行器为Parameterized。
 然后在测试类中定义两个变量,一个用于存放参数,另一个存放期待的结果。接下来定义测试数据的集合,用@Parameters标注进行修饰。
 构造函数中对变量进行初始化,顺序需要与集合中的顺序一致,比如{参数,预期结果}。
 打包测试:
 通常在一个项目中,我们需要写很多个测试类,打包测试就是一次执行多个或所有的测试类.
 @RunWith(Suite.class) // 指定运行器
 @Suite.SuiteClass({..,..,..}) // 指定需要同时测试的类

待测试的类:
package com.test;
public class Calculator {
 private static int result;// 静态变量,用于存储运行结果
 public void add(int n) {
  result = result + n;
 }
 public void substract(int n) {
  result = result - 1;
  // Bug: 正确的应该是 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 (;;)
   ;
  // Bug : 死循环
 }
 public void clear() {
  // 将结果清零
  result = 0;
 }
 
 public int getResult(){
  return result;
 }
 
}

// -------------  基本测试
package com.test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;

import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;

public class CalculatorTest {
 private static Calculator calculator = new Calculator();
 
 @Before
 public void setUp() throws Exception {
  calculator.clear();
 }
 @After
 public void tearDown() throws Exception {
   
 }
 @Test
 public void testAdd() {
  calculator.add(2); 
  calculator.add(3);  
  assertEquals(5, calculator.getResult()); 
 }
 @Test
 public void testSubstract() {
  calculator.add(2); 
  calculator.add(3); 

  assertEquals(5, calculator.getResult()); 
 }
 @Ignore("not implemented yet") 
 @Test 
 public void testMultiply() {
  fail("Not yet implemented");
 }
 @Test
 public void testDivide() {
  calculator.add(8);
  calculator.divide(2);
  assertEquals(4, calculator.getResult());
 }
 @Test(expected = Exception.class)
 public void DivideByZero(){
  calculator.divide(0);
 }
 
}

// -----------------  多个参数测试
package com.test;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Collection;
import org.junit.After;
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)
public class SquareTest {
 Calculator calculator;
 private int param;
 private int result;
 
 public SquareTest(int param,int result) {
  this.param = param;
  this.result = result;
 }
 
 @Before
 public void setUp() throws Exception {
  calculator = new Calculator();
 }
 @After
 public void tearDown() throws Exception {
 }
 
 @Parameters
 public static Collection data(){
  return Arrays.asList( new Object[][]{{2,4},{0,0},{-2,4}});
 }
 
 @Test
 public void testSquare() {
  calculator.square(param);
  assertEquals(calculator.getResult(),result );
  
 }
}

// ---------------  打包测试
@RunWith(Suite.class)
@Suite.SuiteClasses({CalculatorTest.class, SquareTest.class })
public class AllCalculator {

}
时间: 2025-01-02 16:52:05

Java 单元测试及JUnit的使用的相关文章

Java单元测试框架 JUnit

Java单元测试框架 JUnit JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于KentBeck的sUnit的xUnit家族中为最成功的一个. JUnit有它自己的JUnit扩展生态圈.多数Java的开发环境都已经集成了JUnit作为单元测试的工具. 在线Javadoc:http://ww...更多JUnit信息 最近更新: JUnit 4.12 发布,Java 单元测试框架 发布于4个月前 C++模拟测试框架 Google Mock

java单元测试(Junit)

JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework),供Java开发人员编写单元测试之用. 对不同性质的被测对象,如Class,Jsp,Servlet,Ejb等,Junit有不同的使用技巧.以下以Class测试为例讲解. 测试步骤: 1 导入junit4相关的jar包 (选中java工程,点击鼠标右键--->选择properties---->在窗口中选Java Build Path---->在右

Java单元测试(Junit+Mock+代码覆盖率)

原文见此处 单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复.改进或重构之后的正确性. 一般来说,单元测试任务包括 接口功能测试:用来保证接口功能的正确性. 局部数据结构测试(不常用):用来保证接口中的数据结构是正确的 比如变量有无初始值 变量是否溢出 边界条件测试 变量没有赋值(即为NULL) 变量是数值(或字符) 主要边界:最小值,最大值,无穷大(

Java 单元测试Junit

@Test @Before @After 测试方法运行前执行Before动作(比如创建资源),运行后执行After动作(比如销毁资源) @BeforeClass @AfterClass 测试类运行前执行Before动作(比如创建资源),运行后执行After动作(比如销毁资源) Assert 对方法结果进行判断,是否等于希望值,是否为空等 表示测试通过不通过 Java 单元测试Junit,布布扣,bubuko.com

Junit Java单元测试

Junit是一种java单元测试的工具,让我们的测试提高效率 入门篇 我们先来看一个测试加法add的例子 先创建一个AddOperation的类(我们要测试的类) package work; publicclass AddOperation { publicint add(int x,int y){ return x+y; } } 给该类添加测试类 详细请看图 选择你要测试的类 package work; importstatic org.junit.Assert.*; import org.j

Java知识积累——单元测试和JUnit(一)

说起单元测试,刚毕业或者没毕业的人可能大多停留在课本讲述的定义阶段,至于具体是怎么定义的,估计也不会有太多人记得.我们的教育总是这样让人“欣 慰”.那么什么是单元测试呢?具体科学的定义咱就不去关心了,其实每个写代码的人都在时刻进行着单元测试,除非你从来不验证自己写的代码能否达到预期目 的,而是直接写完就完事儿了,连run一下都不进行. 单元测试说的直白一点,就是验证写得一段代码是否正确,可能是一个类,可能是一个函数,甚至可能是一个循环.为了测试的方便,我们一般直接就在写好的可运 行代码中直接进行

Java单元测试Junit的Annotation介绍

单元测试是开发者的业界良心 Java开发中常以Junit作为测试框架,而且Junit也成为Java社区测试方面的事实标准,可以百度一些看看Junit的相关介绍.目前Junit发展到了Junit4.x版本,相对之前的Junit3.x版本有着明显的变化就是使用了Annotation的方式来注解测试用例. 下面是关于Junit4.x的常用注解说明图: Java单元测试Junit的Annotation介绍

Java单元测试(Junit+Mock+代码覆盖率)---------转

Java单元测试(Junit+Mock+代码覆盖率) 原文见此处 单元测试是编写测试代码,用来检测特定的.明确的.细颗粒的功能.单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的. 单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复.改进或重构之后的正确性. 一般来说,单元测试任务包括 接口功能测试:用来保证接口功能的正确性. 局部数据结构测试(不常用):用来保证接口中的数据结构是正确的 比如变量有无初始值 变量是否溢出 边界条件测试 变量没有赋值(即为NULL) 变

JUnit(4)单元测试利器 JUnit 4

引言 毋庸置疑,程序员要对自己编写的代码负责,您不仅要保证它能通过编译,正常地运行,而且要满足需求和设计预期的效果.单元测试正是验证代码行为是否满足预期的有效手段之一.但不可否认,做测试是件很枯燥无趣的事情,而一遍又一遍的测试则更是让人生畏的工作.幸运的是,单元测试工具 JUnit 使这一切变得简单艺术起来. JUnit 是 Java 社区中知名度最高的单元测试工具.它诞生于 1997 年,由 Erich Gamma 和 Kent Beck 共同开发完成.其中 Erich Gamma 是经典著作