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定义类中的所有测试用例。


目录
相关文章
|
5月前
|
测试技术 C# 数据库
C# 单元测试框架 NUnit 一分钟浅谈
【10月更文挑战第17天】单元测试是软件开发中重要的质量保证手段,NUnit 是一个广泛使用的 .NET 单元测试框架。本文从基础到进阶介绍了 NUnit 的使用方法,包括安装、基本用法、参数化测试、异步测试等,并探讨了常见问题和易错点,旨在帮助开发者有效利用单元测试提高代码质量和开发效率。
233 64
|
4月前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
774 2
|
5月前
|
Java 流计算
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
74 1
Flink-03 Flink Java 3分钟上手 Stream 给 Flink-02 DataStreamSource Socket写一个测试的工具!
|
5月前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
93 5
|
5月前
|
存储 人工智能 Java
将 Spring AI 与 LLM 结合使用以生成 Java 测试
AIDocumentLibraryChat 项目通过 GitHub URL 为指定的 Java 类生成测试代码,支持 granite-code 和 deepseek-coder-v2 模型。项目包括控制器、服务和配置,能处理源代码解析、依赖加载及测试代码生成,旨在评估 LLM 对开发测试的支持能力。
164 1
|
6月前
|
SQL JavaScript 前端开发
基于Java访问Hive的JUnit5测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下
121 6
|
5月前
|
分布式计算 Java 大数据
大数据-122 - Flink Time Watermark Java代码测试实现Tumbling Window
大数据-122 - Flink Time Watermark Java代码测试实现Tumbling Window
68 0
|
6月前
|
Java 数据库连接 数据格式
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
IOC/DI配置管理DruidDataSource和properties、核心容器的创建、获取bean的方式、spring注解开发、注解开发管理第三方bean、Spring整合Mybatis和Junit
【Java笔记+踩坑】Spring基础2——IOC,DI注解开发、整合Mybatis,Junit
|
5月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
96 0
|
6月前
|
IDE 测试技术 持续交付
Python自动化测试与单元测试框架:提升代码质量与效率
【9月更文挑战第3天】随着软件行业的迅速发展,代码质量和开发效率变得至关重要。本文探讨了Python在自动化及单元测试中的应用,介绍了Selenium、Appium、pytest等自动化测试框架,以及Python标准库中的unittest单元测试框架。通过详细阐述各框架的特点与使用方法,本文旨在帮助开发者掌握编写高效测试用例的技巧,提升代码质量与开发效率。同时,文章还提出了制定测试计划、持续集成与测试等实践建议,助力项目成功。
132 5

热门文章

最新文章