Java单元测试框架(一)——JUnit4

简介: Java单元测试框架(一)——JUnit4

1.基础架构


被测代码:Calculator.java

package JUnit.com.jerry;
public class Calculator {
    private static int result; // 静态变量,用于存储运行结果
    public void add(int n) {
        result = result + n;
    }
    public void substract(int n) {
        result = result - n;  
    }
    public void multiply(int n) {
      result = result * 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;
}
}


基本的测试代码:CalculatorTest.java

package JUnit.com.jerry;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class CalculatorTest {
    private static Calculator calculator = new Calculator();
    @Before
    public void setUp() throws Exception {
        calculator.clear();
    }
    @Test
    public void testAdd() {
        calculator.add(2);
        calculator.add(3);
        assertEquals(5, calculator.getResult());
    }
    @Test
    public void testSubstract() {
        calculator.add(5);
        calculator.substract(3);
        assertEquals(2, calculator.getResult());
    }
    @Test
    public void testMultiply() {
        calculator.add(3);
        calculator.multiply(2);
        assertEquals(6, calculator.getResult());
    }
@Test
    public void testDivide() {
        calculator.add(9);
        calculator.divide(3);
        assertEquals(3, calculator.getResult());
    }


2. JUnit4的修饰符


修饰符

含义

@Before

每个用例前执行

@Test

下面是一个测试用例

@After

每个用例后执行

@BeforeClass

类中所有用例前执行

@AfterClass

类中所有用例后执行

@Ignore

测试类或测试方法不执行

@Categories

表示单元测试类别


3. JUnit4的断言


断言方法

断言描述

assertEquals([String  message],expected,actual)

expected==actual,测试通过(用于整型数字)

assertEquals([String  message],expected,actual,tolerance)

expected==actual,测试通过,tolerance为浮点数的精度

assertTrue ([String  message],Boolean condition) 

condition条件成立,测试通过

assertFalse([String  message],Boolean condition) 

condition条件不成立,测试通过

assertNull([String  message],Object object)

object为空,测试通过

assertNotNull([String  message],Object object)

Object不为空,测试通过

assertSame ([String  message],expected,actual) 

expectedactual相同,测试通过

assertNotSame  ([String message],expected,actual) 

expectedactual相同,测试通过

fail([String  message]) 

直接直接失败


4. 延迟测试


@Test(timeout=1000 ) //1000毫秒
    Public void squareRoot()  {
        calculator.squareRoot(4);
        assertEquals(2 , calculator.getResult());
     }


由于squareRoot方法是一个死循环,为了保证测试用例不至于无限制等待,在@Test后使用(timeout=1000),意思是等待1000毫秒,如果1000毫秒内没有出结果,默认测试失败


5. 参数化测试


package JUnit.com.jerry;
import  static  org.junit.Assert.assertEquals;
import  org.junit.Test;
import  org.junit.runner.RunWith;
import  org.junit.runners.Parameterized;
import  org.junit.runners.Parameterized.Parameters;
import  java.util.Arrays;
import  java.util.Collection;
@RunWith(Parameterized.class )
public   class SquareTest {
private static final Object[] String = null;
private  static  Calculator calculator  =   new  Calculator();
private   int  param;
private   int  result;
@Parameters
public static Collection data()  {
    return  Arrays.asList( new  Object[][] {
            { 2 ,  4 } ,
            { 0 ,  0 } ,
            {-3 ,  9 } ,
            {-15 ,  225 } ,
    } );
}
// 构造函数,对变量进行初始化 
public SquareTest( int param, int result)  {
      this.param=param;
      this.result =result;
} 
@Test
public  void  square()  {
     calculator.square(param);
     assertEquals(result, calculator.getResult());
  } 
}


参数化测试必须使用Parameterized.class运行器,参数化方法使用

@Parameters装饰器。


6. @BeforeClass和@AfterClass


public class CalculatorTest {
@BeforeClass
public void setUp() throws Exception {
    db.connect();
}
@Before
@test
@After
@AfterClass
public void tearDown() throws Exception {
    db.disconnect();
}


  • 由于所有的测试用例开始都要连接数据库,结束后都要断开数据库,这个时候如果使用@Before和@After装饰符势必会测试执行的速度,JUnit4提供了@BeforeClass和@AfterClass,可以帮助解决这种情况。


7. 批量运行


import org.JUnit.runner.RunWith;
import org.JUnit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({
CalculatorTest.class,
SquareTest.class 
} )
public class  AllCalculatorTests{
}


使用Suite.class运行器,可以依次运行Suite.SuiteClasses定义类中的所有测试用例。


目录
相关文章
|
2天前
|
Java 测试技术 数据库
【JAVA基础篇教学】第十七篇:Java单元测试
【JAVA基础篇教学】第十七篇:Java单元测试
|
1天前
|
敏捷开发 开发框架 自然语言处理
深入理解软件测试中的自动化框架选择
【5月更文挑战第12天】 在现代软件开发周期中,自动化测试已成为确保产品质量和加速市场交付的关键组成部分。选择合适的自动化测试框架对于实现有效的测试策略至关重要。本文将探讨在选择自动化测试框架时应考虑的关键因素,包括框架的可扩展性、易用性、社区支持和集成能力。通过分析比较Selenium、Appium和TestNG等流行框架的特点,本文旨在为读者提供一个清晰的指南,帮助他们根据具体的项目需求做出明智的选择。
|
2天前
|
存储 安全 Java
Java一分钟之-集合框架进阶:Set接口与HashSet
【5月更文挑战第10天】本文介绍了Java集合框架中的`Set`接口和`HashSet`类。`Set`接口继承自`Collection`,特征是不允许重复元素,顺序不确定。`HashSet`是`Set`的实现,基于哈希表,提供快速添加、删除和查找操作,但无序且非线程安全。文章讨论了`HashSet`的特性、常见问题(如元素比较规则、非唯一性和线程安全性)以及如何避免这些问题,并提供了代码示例展示基本操作和自定义对象的使用。理解这些概念和注意事项能提升代码效率和可维护性。
9 0
|
2天前
|
存储 安全 算法
Java一分钟之-Java集合框架入门:List接口与ArrayList
【5月更文挑战第10天】本文介绍了Java集合框架中的`List`接口和`ArrayList`实现类。`List`是有序集合,支持元素重复并能按索引访问。核心方法包括添加、删除、获取和设置元素。`ArrayList`基于动态数组,提供高效随机访问和自动扩容,但非线程安全。文章讨论了三个常见问题:索引越界、遍历时修改集合和并发修改,并给出避免策略。通过示例代码展示了基本操作和安全遍历删除。理解并正确使用`List`和`ArrayList`能提升程序效率和稳定性。
7 0
|
2天前
|
Java 中间件 测试技术
深入理解自动化测试框架Selenium的设计与实现
【5月更文挑战第10天】 本文旨在深度剖析自动化测试工具Selenium的核心架构与实现机制,通过对其设计理念、组件结构以及在实际软件测试中的应用进行详细解读,使读者能够全面理解Selenium在现代Web应用测试中的重要性和有效性。文章首先介绍Selenium的发展背景及其解决的问题,然后详细探讨其架构设计,包括各种驱动和API的作用,最后结合实际案例分析Selenium如何提高测试效率和准确性。
|
4天前
|
测试技术
测试基础 Junit单元测试框架
测试基础 Junit单元测试框架
11 2
测试基础 Junit单元测试框架
|
4天前
|
前端开发 安全 Java
使用Spring框架加速Java开发
使用Spring框架加速Java开发
10 0
|
4天前
|
存储 安全 Java
深入理解Java集合框架
深入理解Java集合框架
10 0
|
8月前
|
SQL Java 数据库连接
Java面试题日积月累(SSM框架面试题22道)
Java面试题日积月累(SSM框架面试题22道)
54 0
|
6月前
|
缓存 Java 开发工具
Java面试题 -其他框架
Java面试题 -其他框架
39 0