在测试Java程序时,要把代码放在main()中才能执行,每次测试都需要改动很多代码,从头开始测试,很不方便。
Unit是一个测试框架,专门用于测试。
Unit是一个系列,J表示Java,JUnit是测试Java的。
常用的测试方式有2种:黑盒测试、白盒测试。
顾名思义,黑盒盒子是黑的,略去了盒子中的内容,不关心盒子中是什么(程序是怎么执行的),只关心程序的输入、输出,提供数据,只看结果是否符合预期。
白盒盒子是白的,可以看到盒子中的内容(程序执行过程)。黑盒不仅关心程序的输入、输出,还关心程序的具体执行过程。
JUnit是白盒测试的一种。
一般不直接在原代码上直接测试,而是在项目下新建一个test包用于测试,包名也可以用要测试的包的包名+Test来命名。
包下新建测试类,类名用要测试的类的类名+Test来命名。
测试方法的方法名一般是在原方法名+Test。
比如要测试dao.StudentDao类的queryName()方法,对应的是测试类test.StudentDaoTest,或daoTest.StudentDaoTest,在这个类下写一个测试方法queryNameTest()。
命名只是习惯,不是强制要求。
测试方法的返回值必须是void,且必须是空参的。
这2个是强制要求。
可以把要测试的方法的方法体中的代码复制过来,改一下;也可以直接调用要测试的方法。
在测试方法上加注解@Test。
在Run|Debug Configurations里进行相关配置。
要测试的代码:
package dao; public class StudentDao { public String queryName(int id){ //数据库相关操作 //...... return "张三"; } }
测试类:
package test; import dao.StudentDao; import org.junit.Test; public class StudentDaoTest { @Test public void queryNameTest(){ StudentDao studentDao = new StudentDao(); String result=studentDao.queryName(1); System.out.println(result); } }
可以点行号右边图标run|debug测试方法,或者run|debug整个测试类中的测试方法。
绿色表示通过测试,红色表示代码有问题。
有时候是绿色的,但运行结果并不符合预期,比如说思路错了。
我们可以使用断言来判断运行结果是否符合预期。
package test; import dao.StudentDao; import org.junit.Assert; import org.junit.Test; public class StudentDaoTest { @Test public void queryNameTest(){ StudentDao studentDao = new StudentDao(); String result=studentDao.queryName(1); Assert.assertEquals("张三",result); //静态方法 } }
第一个参数是预期的值,第二个参数是实际运行的值。如果2个值相等,就绿色通过,否则红色不通过。
@Before会在每个@Test执行之前执行,常用于初始化。
@After会在每个@Test之后执行,常用于回收资源。
比如要执行2个@Test测试方法,在每个@Test执行之前都会调用@Before,在每个@Test执行之后都会调用@After。
package test; import dao.StudentDao; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; public class StudentDaoTest { @Before public void init(){ } @Test public void queryNameTest(){ StudentDao studentDao = new StudentDao(); String result=studentDao.queryName(1); Assert.assertEquals("张三",result); } @After public void destroy(){ } }