众所周知,在一个大型的软件项目中,测试是必不可少的。传统的测试方法往往要自己编写测试函数再结合测试用例进行验证,这样会显得比较繁琐。所以我们可以使用JUnit框架进行测试。
使用junit的好处就是这个结果是否正确的判断是它来完成的,我们只需要看看它告诉我们结果是否正确就可以了,在一般情况下会大大提高效率。
下图为传统测试方法与JUnit测试方法的代码量对比。
接下来就是安装JUnit了
前提条件:电脑已安装eclipse,已配置java环境。
步骤一:下载JUnit与Hamcrest对应的jar包(注:Hamcrest是JUnit底层的匹配工具)
必须文件如图所示:
接下来将这些文件导入对应项目中。(注:为了项目的可迁移性这里暂时不添加到全局变量。)
在Eclipse中新建项目 (File - new - javaproject)
建完项目之后右键点击项目,选择Build Path - Configure Build Path
然后点击Libraries - Add External JARs,选择你刚才下载的三个jar包,点击打开。
导入完成如图所示
查看左侧项目中应该多出来这三个jar包,至此JUnit项目环境已配置完成。
步骤二:安装测试覆盖率工具 Eclemma
在Eclipse上方菜单栏中点击Help,选择Eclipse Marketplace,在搜索栏中输入Eclemma,搜索出来后点击Install安装即可。
如果Eclipse上方导航栏出现这样一个小标记说明安装成功:
至此,环境配置已全部完成,下面来编辑一个小程序来测试一下Junit。
步骤三:程序测试
从最简单的测试加法减法开始,便于新手理解。
在项目下src文件夹下新建一个包(package),这里我命名为cn.tjuscs.st,大家可以自行命名。
在项目下新建类(class),我命名为MyTest,大家可以自行命名。
下面为代码:
package cn.tjuscs.st; public class MyTest { private int result; public void add(int a, int b) { result = a + b; } public void substract(int a, int b) { result = a - b; } public int getresult() { return result; } }
很简单的加法与减法函数,相信大家都可以看得懂。
然后右键点击MyTest.java,选择new-JUnit Test Case,点击next选择函数add和substract后点击finish。这里不选择也可以,后续自行编辑。
然后eclipse会生成一个MyTestTest.java的类,表示这个是测试类。
下面是编辑后MyTestTest.java的代码:
package cn.tjuscs.st; import static org.junit.Assert.*; import org.junit.Test; import org.junit.Ignore; public class MyTestTest { MyTest t=new MyTest(); @Test public void testAdd() { t.add(1,4); assertEquals(5, t.getresult()); } @Test public void testSubstract() { t.substract(9,4); assertEquals(5, t.getresult()); } }
代码解释:@Test告诉JUnit接下来进行测试,assertEquals(期望值,测试用例);是JUnit自带的函数用来检测是否与预期相符。
因为1+4=5,9-4=5,这里两个测试都没有出问题,所以运行结果应该是一片绿色。
运行方法:在这个文件下点击右键-run as-junit test
运行结果:
现在修改一下程序,把程序中的9换成6,按ctrl+s保存完再运行一下。
这里就可以看到testSubstract这个函数出错了,和预期不符。
再来试一下覆盖率测试工具eclemma:
点击刚才装完eclemma生成的小图标旁边的小箭头,选择MyTestTest,这里可以看到结果如下:
红色代表未执行,黄色代表条件没有全部执行(通常适用于if语句等),绿色代表执行过了。
如果这几次运行结果和图中相符,那么说明之前的步骤都没有问题了,接下来进行编写一个简单的三角形的测试程序。
很简单的代码,只是为了了解一下junit的使用方法,所以就不添加其他检测与判断,这里就不再赘述了。
TestTriangle.java:
package cn.tjuscs.st; public class TestTriangle { public int getkind(int a, int b, int c) { int kind = 0; if (a+b<=c || a+c<=b || b+c<=a || a<=0 || b<=0 || c<=0) kind = -1; //-1代表三角形不成立 else if (a==b && b==c) kind = 1; //1代表等边三角形 else if ((a==b && a!=c) || (a==c && a!=b) || (b==c && b!=a)) kind = 2; //2代表等腰三角形 else if (a!=b && b!=c) kind = 3; //3代表普通三角形 return kind; } }
TestTriangleTest.java:
package cn.tjuscs.st; import static org.junit.Assert.*; import org.junit.Test; public class TestTriangleTest { TestTriangle t = new TestTriangle(); @Test public void test_not_a_triangle() { assertEquals(-1,t.getkind(1,2,3)); } @Test public void test_equilateral() { assertEquals(1,t.getkind(2,2,2)); } @Test public void test_isosceles() { assertEquals(2,t.getkind(2,2,3)); } @Test public void test_scalene() { assertEquals(3,t.getkind(2,3,4)); } }
运行结果:
这里四个函数全部运行正确,符合预期。
总结:作为软件开发人员,在大型项目中测试往往是一项工作量相当大的事情。如何正确地利用工具提高效率是作为一个程序员所必须知道的。JUnit就是一个相当好的工具,虽然成不了巨人,但是我们应该站在巨人的肩膀上看的更远。