JUnit基础
什么是JUnit
- JUnit是一个Java语言的单元测试框架。
- JUnit是用于编写和运行可重复的自动化测试的开源测试框架, 这样可以保证我们的代码按预期工作。
- Junit测试可叫做开发者测试,因为程序员知道被测试的类方法如何完成功能和完成什么样的功能。
为什么要用JUnit
-
写了个类,要给别人用。
-
别人用了你的类,出错了,是他的错还是你的错?
-
类会不会有bug,测试一下。
(软件测试员只能测试软件上线之后功能正常否,性能达标否;但他不能测不了你的方法)
-
-
那用main()去测试好不好?
-
多个方法都要测试,写在main()里太混乱。
-
大多数情况下需要人为的观察输出结果。
-
-
《现代软件工程》课上讲到:
-
开发优质代码的时间和开发劣质代码的时间一样。
-
好的开发者从编写一开始就不会写出难堪代码。
-
测试通常命名规范
-
类放在test文件夹中
-
测试类:xxxxTest (例 demoTest ,demo即为原类名,Test作为后缀)
-
测试类里的测试方法:testxxxxx (例 testAdd ,add即为原方法名,test作为前缀)
-
通常来说原类和测试类层级对应
快速生成测试用例
-
首先你拥有一段待测试的类代码
-
在那个.java文件右击,新建JUnit Test Case
-
参考图片后 点击下一步
-
选中需要测试的方法,点击完成
-
询问是否添加JUnit库,选择是就好了
-
至此Test类便生成了
-
//静态引入了Junit的断言 import static org.junit.Assert.*; //引入了注解@Test,可以让每一个带有此注解的test方法执行测试用例 import org.junit.Test;
-
//默认生成的一个测试用例 @Test public void testAdd() { fail("尚未实现"); }
-
-
现在可以尝试执行测试用例了
简单编写测试用例
-
方法 assertEquals([String] , expected , actual)
-
assert:断言。
-
assertEquals:判断expected(期望内容)和actual(实际内容)是否相等。
-
[String]:可选参数,输入一段文字,若错误,将会在发生错误时报告这个消息。
-
expected / actual:类型除数组外随意,但二者类型需一样。
-
更多方法可以查阅api说明文档或查看jar包。
-
-
第一个测试用例
-
@Test public void testAdd() { assertEquals(7, new simpleCalcuate().add(2, 5)); }
-
运行测试通过
- 运行次数:测试用例个数。
- 错误次数:报错。
- 故障次数:断言不通过。
-
常用注解
-
@Test:标示方法为测试用例,能够被执行。
- @Test(timeout=XX):标示该测试用例需要在多少毫秒内完成,否则测试失败。
- @Test(expected=xxxxx.class):例如@Test(expected = java.lang.ArithmeticException.class),标示该测试用例预期会抛出算术运算异常,若实际抛出则测试成功,若没有抛出则测试失败。
-
@Ignore:标示该方法在测试时会被忽略执行。
-
@Before:标示该方法在所有测试用例开始前要执行一次。
static int cnt = 0; @Before public void init() { cnt++; //例如在每次执行测试用例时输出这是第几个。 //@Before常用于初始化获取一些测试数据。 System.out.println(cnt); }
-
@After:标示该方法在所有测试用例开始后要执行一次。
-
更多注解可以查阅api说明文档。
Hamcrest断言
-
什么是Hamcrest
- Junit 自带的断言 Assert,只是基础的一些断言,如 assertTrue、assertEquals、assertNotEquals 等。如果需要值在某个区间或需满足多个匹配条件,这时便需要使用Hamcrest断言。
- JUnit和Hamcrest是两个不同的框架即不同的东西。
- 只不过是JUnit也使用了Hamcrest框架,所以JUnit引入时附带了Hamcrest。
- 但是Eclipse引入的Hamcrest仅仅是core(核心部分),即没有这个core包,JUnit不能正常工作。
- 因此我们需要去官网下载完整的Hamcrest.jar和Junit4.jar,添加构建进当前项目并移除上述图中的JUnit4(避免产生冲突)。下图是我已经提前将这俩jar包构建了用户库进行加入。
-
方法assertThat([String], actual, matcher)
- assertThat:判断actual(实际内容)matcher(匹配)是否相等。
- [String]:可选参数,输入一段文字,若错误,将会在发生错误时报告这个消息。
- matcher:Hamcrest提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活。
-
优化后的测试用例
-
@Test public void testAdd() { assertThat(new simpleCalcuate().add(2, 5), is(7)); assertThat(new simpleCalcuate().add(2, 5), allOf(greaterThan(0), lessThan(20))); }
-
@Test public void testGetName() { assertThat(new otherExample().getName(), containsString("xes")); }
-
@Test public void testGetCon() { Connection con = new otherExample().getCon(); System.out.println(con); assertThat(con,notNullValue()); }
-
补充
-
运行测试用例
-
运行单一测试用例:双击方法名,右击运行。
-
运行所有测试类的全部方法:在任意地方右击,运行配置,选择所有,运行。
-
-
JUnit还可以实现更多的诸如参数化测试、测试套件运行器等应用,可以自行查阅网络资料学习了解。
-
JUnit当然是用Java写的,所以它只适用于Java单元测试。但是 其他语言也有类似的一大批工具,例如NUnit (针对.Net 平台) , CUnit (针对C语言) , CppUnit(针对C++语言), PyUnit (针对Python), PHPUnit (针对PHP)等。
-
JUnit5兼容Junit4,JUnit5已经发布许久,但它也相对复杂,它有着更多的测试方式,更少的其他库的依赖。JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage。学会了JUnit基础后,JUnit5的新特性我们开发者更需要掌握。