Intellij IDEA中添加JUnit单元测试
一、下载jar包
首先需要去下载JUnit的jar包以及一个依赖包hamcrest.core,例如:
junit:junit:4.13-beta-1
hamcrest.core:1.3.0.1
需要注意的是hamcrest.core包不能使用2.1版本的,因为4.13版本的JUnit和它不兼容,会抛出ClassNotFoundException异常。
推荐使用 junit-4.13.jar 和 hamcrest-core-1.3.jar ,可以使用 https://jar-download.com/ 下载
二、在Intellij IDEA项目中添加jar包
首先需要在IDEA中添加刚才下载好的包:
三、下载插件并进行设置
然后需要下载一个名为JUnitGeneratorV2.0的插件:
然后对其进行设置:
四、创建存放测试文件的目录
1.使用快捷键alt+insert创建的test类
通过 JUnitGenetor插件,使用Alt+Insert快捷键自动生成当前类的所有方法的测试单元时,自动生成的 .java 文件的存放目录,即使:
2.使用快捷键Ctrl+Shift+T创建的test类
创建文件夹指定类型为Tests
如果是使用Ctrl+Shift+T快捷键自定义需要测试的方法,则生成的文件会存放于指定的存放测试文件的目录
将图片中的$data改为$today是为了防止生成的测试类产生乱码。
五、创建Test用例
1.前提:原始类
public class Calculate {
public static int add(int a, int b) {
return a + b;
}
public static int substract(int a, int b) {
return a - b;
}
public static int multiply(int a, int b) {
return a * b;
}
public static int divide(int a, int b) {
return a / b;
}
}
2. (Junit4)使用快捷键alt+insert创建的test类
package test.com.panta;
import com.panta.Calculate;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
/**
* Calculate Tester.
*
* @author <haokun>
* @since <pre>08/11/2020</pre>
* @version 1.0
*/
public class CalculateTest {
@Before
public void before() throws Exception {
System.out.println("测试开始");
}
@After
public void after() throws Exception {
System.out.println("测试结束");
}
/**
*
* Method: add(int a, int b)
*
*/
@Test
public void testAdd() throws Exception {
assertEquals(8, Calculate.add(2, 6));
}
/**
*
* Method: substract(int a, int b)
*
*/
@Test
public void testSubstract() throws Exception {
assertEquals(7,Calculate.substract(9,2));
}
/**
*
* Method: multiply(int a, int b)
*
*/
@Test
public void testMultiply() throws Exception {
assertEquals(15,Calculate.multiply(3, 5));
}
/**
*
* Method: divide(int a, int b)
*
*/
@Test
public void testDivide() throws Exception {
assertEquals(2,Calculate.divide(4, 2));
}
}
运行结果:
3. (Junit4)使用快捷键Ctrl+Shift+T创建的test类
package com.panta;
import org.junit.*;
import static org.junit.Assert.assertEquals;
public class CalculateTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("this is beforeClasss....");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("this is afterClasss....");
}
@Before
public void before() throws Exception {
System.out.println("测试开始");
}
@After
public void after() throws Exception {
System.out.println("测试结束");
}
@Test
public void testadd(){
assertEquals(6,new Calculate().add(3, 3));
}
@Test
public void testsubstract(){
assertEquals(2,new Calculate().substract(5, 3));
}
@Test
public void testmultiply(){
assertEquals(15,new Calculate().multiply(5, 3));
}
@Test
public void testdivide() {
assertEquals(2, new Calculate().divide(6, 3));
}
@Ignore
public void testdivide1() {
assertEquals(2, new Calculate().divide(6, 3));
System.out.println("this is divideClasss....");
}
}
运行结果:
4.总结:
@BeforeClass
修饰的方法会在所有方法被调用前执行,且该方法时静态的,所以当测试类被加载后就接着运行它,而且在内存中他只会存在一份实例,他比较适合加载配置文件(针对所有测试,只执行一次 )
@AfterClass
所修饰的方法通常用来对资源管理,如关闭数据库连接(针对所有测试,只执行一次 )
@Before和@After 会在每个测试方法前后各执行一次
@Test:测试方法,在这里可以测试期望异常和超时时间
@Ignore:忽略的测试方法
----------------------------------------------------------------------------------------------
1.测试方法上必须使用@Test
2.测试方法必须使用 public void进行修饰
3.新建一个源代码目录来存放测试代码
4.测试类的包应该和被测试类的包一样
5.测试单元中的每个方法一定要能够独立测试,其方法不能有任何依赖
六、junit 测试套件Suite
1.创建2个测试函数:
package test.com.panta;
import com.panta.Calculate;
import org.junit.*;
import static org.junit.Assert.assertEquals;
public class CalculateTest1 {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("CalculateTest1:this is beforeClasss....");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("CalculateTest1:this is afterClasss....");
}
@Before
public void before() throws Exception {
System.out.println("CalculateTest1测试开始");
}
@After
public void after() throws Exception {
System.out.println("CalculateTest1测试结束");
}
@Test
public void testdivide1() {
assertEquals(2, new Calculate().divide(6, 3));
System.out.println("CalculateTest1:this is divideClasss....");
}
}
package test.com.panta;
import com.panta.Calculate;
import org.junit.*;
import static org.junit.Assert.assertEquals;
public class CalculateTest2 {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("CalculateTest2:this is beforeClasss....");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("CalculateTest2:this is afterClasss....");
}
@Before
public void before() throws Exception {
System.out.println("CalculateTest2测试开始");
}
@After
public void after() throws Exception {
System.out.println("CalculateTest2测试结束");
}
@Test
public void testdivide1() {
assertEquals(2, new Calculate().divide(6, 3));
System.out.println("CalculateTest2:this is divideClasss....");
}
}
2.把2个测试函数加入Suite:
package test.com.panta;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
@RunWith(Suite.class) //@RunWith表示这个类将以哪种形式来跑
@Suite.SuiteClasses({ //@Suite.SuiteClasses则可以包含多个test unit类
CalculateTest1.class,
CalculateTest2.class
})
public class SuiteTest {
/**
* 1.测试套件就是组织测试类一起运行的
*
* 写一个作为测试套件的入口类,这个类里不包含其他的方法
* 更改测试运行器Suite.classes,将要测试的类作为数组传入到Suite.SuiteClasses({})
*/
}
查看运行结果:
七、报告生成
1、环境准备
Intellij IDEA
JUnit4
1.1.安装 Ant
直接在官网下载最新的 Ant 即可https://downloads.apache.org/ant/binaries/
1.2.配置 Ant
在系统环境变量的 Path 中添加 Ant 路径。例如我的路径为 E:\JetBrains\apache-ant-1.10.8\bin
1.3.测试 Ant 是否配置成功
在 cmd 中输入 ant -version,显示版本信息即正确。
2、编写测试代码
2.1.在 src 目录下编写测试类
package cn;
public class Calculate {
private static int a;
private static int b;
public static int add(int a, int b) {
return a + b;
}
public static int substract(int a, int b) {
return a - b;
}
public static int multiply(int a, int b) {
return a * b;
}
public static int divide(int a, int b) {
return a / b;
}
}
2.2在 test 目录(如果没有则新建 Test ,并且将其设置为 Test Sources Root)下编写测试类
package cn;
import org.junit.Assert;
import org.junit.Test;
public class TestCalculate {
@Test
public void testAdd() throws Exception {
Assert.assertEquals(8,Calculate.add(2, 6));
}
@Test
public void substract() throws Exception {
Assert.assertEquals(7,Calculate.substract(9,2));
}
@Test
public void testMultiply() throws Exception {
Assert.assertEquals(15,Calculate.multiply(3, 5));
}
@Test
public void testDivide() throws Exception {
Assert.assertEquals(2,Calculate.divide(4, 2));
}
}
3、编写 Ant 配置文件
一般配置文件命名为 build.xml ,在项目根目录下创建配置文件 build.xml ,然后在界面右侧靠边处选择 【Ant】,点击后选择 【+】 添加该文件到 Ant 中。
build.xml 内容如下:
<?xml version="1.0"?>
<project name="ant and junit" default="test auot junit and report" basedir=".">
<!-- 定义工程依赖的jar包存放的位置 -->
<property name="lib.dir" value="lib"/>
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
<property name="output folder" value="classes"/>
<property name="src folder" value="src"/>
<property name="test folder" value="test"/>
<property name="report folder" value="report"/>
<target name="clean">
<delete dir="report"/>
<echo>清除测试报告文件 成功!</echo>
</target>
<target name="compile init">
<mkdir dir="${output folder}"/>
<echo>创建编译文件夹 成功!</echo>
</target>
<target name="report init" depends="clean">
<mkdir dir="${report folder}"/>
<echo>创建测试报告文件夹 成功!</echo>
</target>
<target name="compile" depends="compile init">
<javac srcdir="${src folder}" destdir="${output folder}" classpathref="classpath"/>
<echo>项目源文件编译 成功!</echo>
</target>
<target name="test compile" depends="report init">
<javac srcdir="${test folder}" destdir="${output folder}" classpathref="classpath"/>
<echo>项目测试文件编译 成功!</echo>
</target>
<target name="all compile" depends="compile, test compile">
</target>
<target name="test auot junit and report" depends="all compile">
<junit printsummary="on" fork="true" showoutput="true">
<classpath>
<fileset dir="${lib.dir}" includes="**/*.jar"/>
<pathelement path="${output folder}"/>
</classpath>
<formatter type="xml"/>
<batchtest todir="${report folder}">
<fileset dir="${output folder}">
<include name="**/Test*.*"/>
</fileset>
</batchtest>
</junit>
<junitreport todir="${report folder}">
<fileset dir="${report folder}">
<include name="TEST-*.xml"/>
</fileset>
<report format="frames" todir="${report folder}"/>
</junitreport>
</target>
</project>
另外:pom.xml添加信息
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>1</groupId>
<artifactId>1</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.vcplatform.test</groupId>
<artifactId>testng</artifactId>
<version>6.11</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/testng-6.11.jar</systemPath>
</dependency>
</dependencies>
</project>
4、运行结果
4.1.项目目录结构
在项目运行时需要单独的 JUnit.jar ,所以需要先在项目根目录下创建 lib 文件夹,并将 JUnit.jar 放入其中。
4.2.选择该 Ant 类,点击运行即可,如果测试正确会在终端显示正常编译结果。
4.3.在浏览器中输入 项目的路径/report/index.html 可以查看 Ant 自动化测试的报告结果。
八、Junit5
Pom.xml 添加依赖
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.5.0</version>
<scope>test</scope>
<systemPath>${project.basedir}/lib/junit-platform-launcher-1.5.0.jar</systemPath>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.6.2</version>
<scope>test</scope>
<systemPath>${project.basedir}/lib/junit-jupiter-engine-5.6.2.jar</systemPath>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>5.6.2</version>
<scope>test</scope>
<systemPath>${project.basedir}/lib/junit-vintage-engine-5.6.2.jar</systemPath>
</dependency>
并把对应的jar放在路径中,jar可以在这里下载:https://mvnrepository.com/artifact/org.junit.vintage/junit-vintage-engine/5.6.2
运行一个:
package cn;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertAll;
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
class CalculateTest5 {
@Test
void add() throws Exception{
Assert.assertEquals(8,Calculate.add(2, 6));
}
}
运行结果:
对比Junit4,有几个特点:
导入测试测试注解(@Test)和断言方法(assertEquals)的路径不同。其次,不需要手动把测试和测试方法声明为 public
没有发现有什么特别的,忽略掉