什么是单元测试
我们一般在编写程序的时候是怎么测试代码的呢,比如你在一个类中写了这么一个函数
public class junit { public int calcutor(int a,int b){ return a*b; }
当然这个函数非常简单也很短,如果你想测试一下输出的结果是不是你想要的怎么办呢,然后在main函数中调用它
public static void main(String[] args) { System.out.println(calcutor(1,2)); }
这样输出查看结果是不是自己想要的;
junit 替我们来测试
之前我们是自己来测试的,他需要写函数,写输出函数等一些步骤,现在让Junit替代我们做一些事情,现在我们依然是写了一个calcutor函数,我们还是想测试它,我们这样写代码,你先随便写个类,最好是跟junit一样的名字然后加个test,比如junit_test; 然后我们在里面随便写个函数,函数的名字最好是和calcutor一样后面加个test calcutor_test,然后给这个函数注解上@test 注解,然后在这个函数内写assertEquals(calcutor(1,2), 1);函数,它的作用和它的名字是一样,判断两个参数值是否一样,这个函数是junit提供的一个void函数,写一个这个类就算写完了,他是这个样子的;
public class junit_test { public int calcutor(int a,int b){ return a*b; } @Test // @DisplayName("计算测试") public void cheng(){ assertEquals(calcutor(1,2), 1); } }
然后我们就可以直接点击idea的运行来运行这个类,或者这个函数,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sLDnTNf6-1645001823633)(C:\Users\百宝箱\AppData\Roaming\Typora\typora-user-images\image-20220216162832268.png)]
它确实运行成功了,没有main函数,此时是没有报错,说明assertEquals(calcutor(1,2), 1);函数执行成功,两个参数的匹配是我们想要的结果,如果不一样呢,[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vKJen5mu-1645001823634)(C:\Users\百宝箱\AppData\Roaming\Typora\typora-user-images\image-20220216163152458.png)]
他会报错的,他会给出是哪个函数出现了错误,断言函数给出了什么错误;
分析一下junit是怎么帮我们测试的
一般的教程都是这么教的,但是很少有人说一下,他是怎么执行的,junit_test这个类,并没有main函数怎么就可以执行了呢;
这个类的地位其实和servelt是一样的,servelt是一个中间件,它的运行需要一个servelt平台,比如tomcat,juni测试类也是这样,他需要junit来平台来运行它,怎么运行它junit5和之前的版本是完全不一样的,junit5之前的版本是怎么运行的可以参考这篇文章https://juejin.im/post/6844903778957656071
在junit版本中,junit平台被分成了三个部分,junit platform他是用来运行测试类和定义测试接口的,junit jupiter它提供了测试类所需要的各种函数api,junit vintage 它提供junit可以运行junit3,4的库;
在这里我们是直接通过junit platform提供的java -jar junit-platform-console-standalone-1.8.2.jar < options> 包和命令来运行你所定义的测试类,各种集成环境eclipse, idea 等都是通过调用这个jar运行来调用你的测试类的,所以不需要main函数,而是把测试类作为junit平台的一个参数;
所以我们并不需要关注他是怎么运行的,只需要关注怎么写测试类就好;
如果用的集成环境比如idea只需要加入jar包就行,官网给出了很多个运行方式,maven也会自动调用ava -jar junit-platform-console-standalone-1.8.2.jar < options>来运行,而且规定了测试类的位置必须写在test目录下;如果你在maven项目中不需要用到测试,你把这个目录删除掉也是没问题的,为啥必须在test目录下呢,在IDEA中你可以用鼠标选择具体的类,函数,而maven咋办,所以只能约定类文件放在哪来调用他们执行;
我们只需要关注测试类怎么写就好了
测试类由什么构成呢,必须有这三部分
-
任意数量的函数(怎么写都行,但是需要被注解,被注解的函数才会被运行检测)
-
注解测试类函数的注解(只有加上了这些注解,这个类中的函数才会被运行检测)
-
函数内部要用到junit提供的断言函数(写了这些断言函数,junit才会根据这些断言函数的执行在控制台打印出执行的成功与否)
public class junit_test { //测试类 public int calcutor(int a,int b){ //普通函数,不在这个类中也无所谓 return a*b; } @Test //测试函数注解,加上他这个函数才会被junit 平台调用 // @DisplayName("计算测试") public void cheng(){ //测试函数 assertEquals(calcutor(1,2), 3); //含有断言的关键代码 } }
因此我们最应该关注的就是断言函数了,assert叫做断言,他是意思的“声称一个事物就是什么”,所以断言函数的意思就是参数必须满足断言函数给出的意思,如果不满足他就会报错;
-
任意数量的函数可以随便写
-
注解测试类函数的注解有很多个,自己可以查api
Annotations 描述 @BeforeEach
在方法上注解,在每个测试方法运行之前执行。 @AfterEach
在方法上注解,在每个测试方法运行之后执行 @BeforeAll
该注解方法会在所有测试方法之前运行,该方法必须是静态的。 @AfterAll
该注解方法会在所有测试方法之后运行,该方法必须是静态的。 @Test
用于将方法标记为测试方法 @DisplayName
用于为测试类或测试方法提供任何自定义显示名称 @Disable
用于禁用或忽略测试类或方法 @Nested
用于创建嵌套测试类 @Tag
用于测试发现或过滤的标签来标记测试方法或类 @TestFactory
标记一种方法是动态测试的测试工场 -
断言函数也有很多个,自己可以查api
序号 方法和描述 1 void assertEquals(boolean expected, boolean actual) 检查两个变量或者等式是否平衡 2 void assertTrue(boolean expected, boolean actual) 检查条件为真 3 void assertFalse(boolean condition) 检查条件为假 4 void assertNotNull(Object object) 检查对象不为空 5 void assertNull(Object object) 检查对象为空 6 void assertSame(boolean condition) assertSame() 方法检查两个相关对象是否指向同一个对象 7 void assertNotSame(boolean condition) assertNotSame() 方法检查两个相关对象是否不指向同一个对象 8 void assertArrayEquals(expectedArray, resultArray) assertArrayEquals() 方法检查两个数组是否相等