1.什么是单元测试?单元测试有什么优点?人们对单元测试有什么误解?
含义:单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。单元就是人为规定的最小的被测功能模块。
优点:做好了单元测试,可以提高产品的质量,减少之后的测试成本和维护成本。
误解:很多人都觉得做单元测试很麻烦(很多公司都没有单元测试这一阶段),就想着早点开发完代码早点让测试人员测试完工,但是往往这种会使一个项目的进程延迟再延迟,因为bug一个接着一个。
单元测试就好比把一个机器的零件拆分,然后逐个清洗完再组装;那些整体系统测试就好比直接清洗整台机器,但是死角残留物肯定不可避免会疏忽掉,其中谁完成的更全面显而易见。
2.什么是JUnit?
JUnit是Java所用的单元测试工具,它不是一个编辑代码的开发软件,而是一个测试代码的测试框架。
3.JUnit的简单使用
Eclipse自带有JUnit的jar包,也可以自行下载,下载地址:http://www.mvnrepository.com/
如下图所示:
验证通过之后进入到主页:
搜索“hamcrest”就可以找到相应jar包下载了:
不仅要下载这个包,还需要下载JUnit的l两个通用包(原因在下文中会解释):
这样jar包就准备好了。
下面来说明原因:
JUnit.jar:是单元测试必不可少的包,看其名称就知道它的重要性;
hamcrest-library.jar和hamcrest-core.jar是hamcrest中的jar包。Hamcrest是一个书写匹配器对象时允许直接定义匹配规则的框架,能够结合单元测试框架JUnit方便测试。它携带了一个匹配库,里面有很多方法和类方便我们进行测试调用,包含了很多断言(Assert)的用法。
什么是断言?
断言就是一种判断,也就是说我们相信这个结果是真的,如果断言不为真,则说明我们的测试会出现错误。
下面利用eclipse来简单介绍JUnit的使用,以及是如何与hamcrest相结合的
#如果是用eclipse自带JUnit的jar包
①新建一个Java项目,点击“File-New-Java Project”
②专门建两个package包,一个放测试类,一个放被测试的类。右击“New-Package”
③建立要被测试的类T,并写上要被测试的方法
// 要被测试的方法
public class T {
public int add(int x,int y){
return x + y;
}
public int divide(int x,int y){
return x / y;
}
public static void main(String[] args) {
int z = new T().add(3, 5);
System.out.println(z);
}
}
④建立测试类TTest用来测试上一步写的代码:右击“New-JUnit Test Case”
之后会自动生成含有@Test的测试方法
⑤编写测试类
// 上图代码
public class TTest {
@BeforeClass
public static void beforeClass(){//没有实例化的类想要调用,就只有加个static变成静态类
System.out.println("beforeClass");
}
@AfterClass
public static void afterClass(){
System.out.println("afterClass");
}
@Before
public void before(){
System.out.println("before");
}
@Test
public void testAdd() {
int z = new T().add(5, 4);
assertEquals(9, z);//z是不是等于9
assertTrue(z>3);//z是不是大于3
assertTrue("z is too big", z<10);//z小于10吗?如果不小于则输出左边的值
assertThat(z, is(9));//z是否是9
assertThat(z, allOf(greaterThan(5),lessThan(20)));//z是否比5大,比20小
/*
* 1.assertThat(d,closeTo(3.0,0.3));//d这个数值是不是在这个范围内
* 2.assertThat(d,greaterThanOrEqualsTo(5.0));//d这个数值是不是大于或者等于5.0
* 3.assertThat(map,hasEntry("asdf","asdf"));//map中有没有前者asdf对应的后者asdf
* 4.assertThat(iterable,hasItem("asdf"));//iterable中包不包含asdf对象
*
*
*
* failure和error的区别
* failure是指测试失败;error是指测试程序本身出错
*
* @Before执行每一个测试方法之前(有几个方法就执行几次)
* @After执行每一个测试方法之后(有几个方法就执行几次)
*
* 当我们需要在测试之前取得很耗费时间的资源和环境时,用@BeforeClass,@AfterClass
* @BeforeClass在所有的测试方法运行之前运行该方法
* @AfterClass在所有的测试方法运行之后运行该方法
* */
}
@Test(expected=java.lang.ArithmeticException.class)
public void testDivide(){
int z = new T().divide(8, 0);
}
@After
public void after(){
System.out.println("after");
}
}
如果代码复制进去报错了,就检查是不是jar包少了
⑥运行测试代码。右击“com.ycz.junit4.test-Run As-JUnit Test”,如果进度条为绿色,则表示测试通过,红色可能是Error或者Failures。【这两者如何区分上述代码有说明】
#如果是自行下载jar包(上文已说明如何下载)
右击项目名Test"Build Path-Add External Archives",选择jar包下载的位置,选中jar包点击“打开”即可。