JUnit 是一个 Java 编程语言的单元测试框架。
xUnit是一套基于测试驱动开发的测试框架,包括PythonUnit、CppUnit、JUnit等。
JUnit4的作用:减少后期测试的时间;提升代码质量。
JUnit使用断言机制将测试的结果与预期的结果进行比对,确保对结果的可预知性。
断言assert
assert有两种用法:
1、assert
如果
为true,则程序继续执行。 如果为false,则程序抛出AssertionError,并终止执行。 2、assert
: <错误信息表达式> 如果
为true,则程序继续执行。 如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。 assertEquals(boolean expected, boolean actual)
assertTrue(boolean condition)
assertEquals 和 assertTrue 区别 相同之处:
都能判断两个值是否相等
assertTrue 如果为true,则运行success,反之Failure
assertEquals 如果预期值与真实值相等,则运行success,反之Failure
不同之处:
assertEquals 运行Failure会有错误提示,提示预期值是xxx,而实际值是xxx。容易调式
assertTrue 没有错误提示
JUnit教程
JUnit使用过程
由于eclipse中已经包含了JUnit的jar包,故不用再单独下载。
1.导入jar(右键Build Path --> Add Libraries --> Junit --> Junit4)
2.新建测试类:右键需测试类所在包new --> JUnit Test Case参照自动生成的测试类模板(可删除),写自己的测试方法
3.运行测试:测试文件右键 --> Run as JUnit Test
JUnit使用总结
1.测试方法上必须使用@Test
2.测试方法必须使用 public void进行修饰,不能带任何的参数
3.新建一个源代码目录来存放测试代码
4.测试类的包应该和被测试类保持一致
5.测试单元中的每个方法一定要能够独立测试,其方法不能有任何依赖
6.建议测试类使用Test作为类名的后缀,测试方法已test作为前缀
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;
}
}
import static org.junit.Assert.*;
import org.junit.Test;
public class CalculateTest
@Test
public void testAdd() {
assertEquals(6, new Calculate().add(3,3));
}
@Test
public void testSubtract() {
assertEquals(3, new Calculate().subtract(5,2));
}
@Test
public void testMultiply() {
assertEquals(4, new Calculate().multiply(2, 2));
}
@Test
public void testDivide() {
assertEquals(3, new Calculate().divide(6, 2));
}
}
测试用例不是用来证明你是对的,而是用来证明你没有错。
测试用例用来达到想要的预期效果,但对于逻辑错误无能为力。
Failure一般由单元测试使用的断言方法判断失败引起,也就是说程序输出的结果和预期的不一样。
error是由程序代码逻辑错误引起,也可以说是测试代码中的一个隐藏的bug.
JUnit运行流程
class JUnitTest {
@BeforeAll
static void setUpBeforeClass() throws Exception {
System.out.println("this is beforeClass...");
}
@AfterAll
static void tearDownAfterClass() throws Exception {
System.out.println("this is afterClass...");
}
@BeforeEach
void setUp() throws Exception {
System.out.println("this is before...");
}
@AfterEach
void tearDown() throws Exception {
System.out.println("this is after...");
}
@Test
public void test1() {
System.out.println("this is test1...");
}
@Test
public void test2(){
System.out.println("this is test2...");
}
}
运行结果为:
this is beforeClass...
this is before...
this is test1...
this is after...
this is before...
this is test2...
this is after...
this is afterClass...
在JUnit5中,其命名更加直观。
1. @BeforeAll修饰的方法会在所有方法被调用前执行,而且该方法是静态的,所以当测试类被加载后接着就会运行它,而且在内存中它只会存在一份实例,它比较适合加载配置文件等只执行一次的东西。(在JUnit4中对应@BeforeClass)
2. @AfterAll所修饰的方法通常用来对资源的清理,如关闭数据库的连接(在JUnit4中对应@AfterClass)
3. @BeforeEach和@AfterEach会在每个测试方法的前后各执行一次(在JUnit4中对应@Before,@After)
Junit常用注解
除了上述几个注外,JUnit4还提供了以下注解:
@Test(expected=xxx(异常类).class):会抛出该异常
@Test(timeout=毫秒 ):设置执行的时间,用于结束死循环或是性能测试
JUnit5中的@Test已经删除timeout和expected这两个参数。
JUnit测试套件
测试套件就是组织测试类一起运行的,批量运行测试类。(该方法只在JUnit4中有效,JUnit5对其作了修改)
1.写一个作为测试套件的入口类,这个类里不包含其他的方法!!!
2.更改测试运行器Suite.class.
3.将要测试的类作为数组传入到Suite.SuiteClasses({})
@RunWith(Suite.class) //将测试类改为测试套件类
@Suite.SuiteClasses({TaskTest1.class,TaskTest2.class,TaskTest3.class})
//测试类入口类
@RunWith(Suite.class)
@Suite.SuiteClasses({TaskTest1.class,TaskTest2.class,TaskTest3.class})
public class SuiteTest { }
public class TaskTest1 {
@Test
public void test() {
System.out.println("this is TaskTest1...");
}
}
public class TaskTest2 {
@Test
public void test() {
System.out.println("this is TaskTest2...");
}
}
public class TaskTest3 {
@Test
public void test() {
System.out.println("this is TaskTest3...");
}
}
运行结果
this is TaskTest1...
this is TaskTest2...
this is TaskTest3...
JUnit还可用来测试web项目,此处待未来学习后再进行补充。
JUnit 5和JUnit 4之间的其他差异(作者:2Tree 来自CSDN)
JUnit4和JUnit5比较
(此处仅为留存,防止链接内容失效,具体内容和链接中一致)
1、注解
2.1 建筑
JUnit 4将所有内容捆绑到单个jar文件中。
Junit 5由3个子项目组成,即JUnit Platform,JUnit Jupiter和JUnit Vintage。
JUnit平台
它定义了TestEngine用于开发在平台上运行的新测试框架的API。
JUnit Jupiter
它具有所有新的junit注释和TestEngine实现,以运行使用这些注释编写的测试。
JUnit Vintage
支持在JUnit 5平台上运行JUnit 3和JUnit 4编写的测试。
2.2 必需的JDK版本
Junit 4需要Java 5或更高版本。
Junit 5需要Java 8或更高版本。
2.3 断言
在Junit 4中,org.junit.Assert具有所有断言方法来验证预期结果和结果。
它们接受错误消息的额外参数作为方法签名中的FIRST参数。例如
publicstaticvoidassertEquals(longexpected, longactual)
publicstaticvoidassertEquals(String message, longexpected, longactual)
在JUnit 5中,org.junit.jupiter.Assertions包含大多数断言方法,包括附加assertThrows()和assertAll()方法。assertAll()到目前为止处于实验状态,并用于分组断言。
JUnit 5断言方法也有重载方法,以支持在测试失败时传递错误消息,例如
public static void assertEquals(longexpected, longactual)
public static void assertEquals(longexpected, longactual, String message)
public static void assertEquals(longexpected, longactual, Supplier messageSupplier)
2.4 假设
在Junit 4中,org.junit.Assume包含用于说明测试有意义的条件的假设的方法。它有以下五种方法:
assumeFalse()
assumeNoException()
assumeNotNull()
假使,假设()
assumeTrue()
在Junit 5中,org.junit.jupiter.api.Assumptions包含用于说明测试有意义的条件的假设的方法。它有以下三种方法:
assumeFalse()
假使,假设()
assumeTrue()
2.5 标记和过滤
在Junit 4中,使用了@category注释。
在Junit 5中,使用了@tag注释。
2.6 测试套房
在JUnit 4,@RunWith和@Suite注释。例如
importorg.junit.runner.RunWith;
importorg.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({ ExceptionTest.class, TimeoutTest.class})
public class JUnit4Example
{
}
在JUnit 5@RunWith,@SelectPackages和@SelectClasses如
import org.junit.platform.runner.JUnitPlatform;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.runner.RunWith;
@RunWith(JUnitPlatform.class)
@SelectPackages("com.howtodoinjava.junit5.examples")
public class JUnit5Example
{
}
2.7 第三方整合
在Junit 4中,没有对第三方插件和IDE的集成支持。他们必须依靠反射。
JUnit 5为此专门设立了子项目,即JUnit平台。它定义了TestEngine用于开发在平台上运行的测试框架的API