作为一个刚进职场的小白,今天测试的说想培训我们几个做开发的学点测试,这样子我们可以做编码也可以做点测试,缓解公司测试组的压力,目前主要让我们先了解单元测试。单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。(是我愚钝,当初老师也没提说做出来的东西要做测试,啊哈哈也是自己不去多学点东西,经历社会毒打才知道企业需要什么)
本章主要记录一下JUnit 作为单元车上工具的简单使用
JUnit 是 Java 社区中知名度最高的单元测试工具
一、什么是单元测试
单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。
对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。
总的来说,单元就是人为规定的最小的被测功能模块。单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。
为什么要单元测试呢?
可以说,进行充分的单元测试,是提高软件质量,降低开发成本的必由之路。对于程序员来说,如果养成了对自己写的代码进行单元测试的习惯,不但可以写出高质量的代码,而且还能提高编程水平。((⊙o⊙)恍然大悟,学习并不可怕,找到方向很重要)
二、单元测试工具Junit
JUnit 是 Java 社区中知名度最高的单元测试工具
JUnit 设计的非常小巧,但是功能却非常强大。
JUnit ——是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。
主要用于白盒测试,回归测试。
1、JUnit的好处:
- 可以使测试代码与产品代码分开;
- 针对某一个类的测试代码通过较少的改动便可以应用于另一个类的测试;
- 易于集成到测试人员的构建过程中,JUnit和Ant的结合可以实施增量开发;
- JUnit是公开源代码的,可以进行二次开发;
- 可以方便地对JUnit进行扩展;
2、Junit单元测试编写原则:
- 是简化测试的编写,这种简化包括测试框架的学习和实际测试单元的编写;
- 是使测试单元保持持久性;
- 是可以利用既有的测试来编写相关的测试;
3、测试分类:
黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值。
白盒测试:需要写代码的。关注程序具体的执行流程。(junit就是白盒测试的主要测试工具)
建一个计算器类Calculator
/**
* @Description: 计算器类$
* @Author: dyq
* @Date: $
*/
public class Calculator {
/*加法*/
public int add (int a, int b){
//int i = 9/0;
return a+b;
}
/*减法*/
public int sub (int a, int b){
return a-b;
}
}
然后创建他的测试类CalculatorTest
import com.cn.junit.Calculator;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* @Description: $
* @Author: dyq
* @Date: $
*/
public class CalculatorTest {
/*初始化方法;
*用于资源申请,所有测试方法在执行之前都会先执行该方法*/
@Before
public void init() {
System.out.println("init. ..");
}
/*释放资源方法:
*在所有测试方法执行完后,都会自动执行该方法*/
@After
public void close(){
System.out.println("close");
}
/*测试add方法*/
@Test
public void testadd() {
//System.out.println("add被执行了!");
//创建计算器对象
Calculator c = new Calculator();
//调用add方法
int a = c.add(3, 3);
System.out.println("加法正在执行");
// 断言 我断言这个结果是6 a是实际出来的值
Assert.assertEquals(6, a);
}
@Test
public void testsub() {
//System.out.println("add被执行了!");
//创建计算器对象
Calculator c = new Calculator();
//调用add方法
int s = c.sub(4, 3);
System.out.println("减法正在执行");
//断言 我断言这个结果是6 a是实际出来的值
Assert.assertEquals(1,s);
}
}
当@Test注解报错时,点击导入junit依赖
下边是断言错误的报错
加入@After和@Before 使测试前先初始化,测试后关闭
4、测试失败说明:
Failure:一般是由于测试结果和预期结果不一致引发的,表示测试的这个点发现了问题
error:是由代码异常引起的,它可以产生于测试代码本身的错误,也可以是被测试代码中隐藏的 bug
5、常用的注解:
注解 | 意义 |
---|---|
@Ignore | 被忽略的测试方法 |
@Before | 每一个测试方法之前运行 |
@After | 每一个测试方法之后运行 |
@BeforeClass | 所有测试开始之前运行 |
@AfterClass | 所有测试结束之后运行 |
@Test | 表示方法是测试方法。 |
@ParameterizedTest | 表示方法是参数化测试。这种方法是继承的 |
@RepeatedTest | |
@TestFactory | 表示方法是动态测试的测试工厂。这种方法是继承的。 |
@TestTemplate | 表示方法是测试案例的模板,根据注册提供商返回的调用上下文数量,设计为多次调用。这种方法是继承的,除非它们被推翻。 |
@TestMethodOrder | 用于配置注释测试类的测试方法执行顺序:类似于联合4的。这种注释是遗传的。 |
@TestInstance | 用于为注释测试类配置测试实例生命周期。这种注释是遗传的。 |
注意:编写测试类的原则:
①测试方法上必须使用@Test进行修饰
②测试方法必须使用public void 进行修饰,不能带任何的参数
③新建一个源代码目录来存放我们的测试代码,即将测试代码和项目业务代码分开
④测试类所在的包名应该和被测试类所在的包名保持一致
⑤测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖
⑥测试类使用Test作为类名的后缀(不是必须)
⑦测试方法使用test作为方法名的前缀(不是必须)
三、Assert 类
一般单元测试我们都用断言来再次判断结果,所有的断言都包含在 Assert 类
下面介绍的是 org.junit.Assert 类:
public class Assert extends java.lang.Object
这个类提供了一系列的编写测试的有用的声明方法。只有失败的声明方法才会被记录。Assert 类的重要方法列式如下:
序号 | 方法 | 描述 |
---|---|---|
1 | void assertEquals(boolean expected, boolean actual) | 检查两个变量或者等式是否平衡 |
2 | void assertFalse(boolean condition) | 检查条件是假的 |
3 | void assertNotNull(Object object) | 检查对象不是空的 |
4 | void assertNull(Object object) | 检查对象是空的 |
5 | void assertTrue(boolean condition) | 检查条件为真 |
6 | void fail() | 在没有报告的情况下使测试不通过 |
7 | void assertSame(boolean condition) | assertSame() 方法检查两个相关对象是否指向同一个对象 |
8 | void assertNotSame(boolean condition) | assertNotSame() 方法检查两个相关对象是否不指向同一个对象 |
9 | void assertArrayEquals(expectedArray, resultArray) | assertArrayEquals() 方法检查两个数组是否相等 |
具体还应用到实际开发中,具体可以去看看这个,里边有好多例子
https://www.w3cschool.cn/junit/fegu1hv3.html