JUNIT是JAVA的单元测试框架,官网在这里:http://junit.org,这里是官网的第一句话:
JUnit is a simple framework to write repeatable tests. It is an instance of the xUnit architecture for unit testing frameworks.
如果你曾经被迫写过"野路子"的测试用例,你就明白手动测试有多痛苦。
如果你曾经参加过ACM区域赛,接受过ACM的训练,那么代码中有这么两句话你一定记忆深刻:
freopen("in", "r", stdin);
freopen("out", "w", stdout);
不错,这就是一个ACM标准程序c代码的开头部分,意思是从文件名为"in"的文件输入,从文件名为"out"的文件输出,然后你写了一个shell脚本去检查你的out文件和你手动计算出来的正确值文件进行比较,从而找出有哪些用力挂了,算法到底哪里出错了。
在看到一个题目的time limt:1000ms 的时候,你就会关注算法复杂度,是n^2还是n*logn,这时候你就凭经验知道n^2的复杂度在n=2000时就到上限了。但是到底怎么测试呢?以我的经验,没啥办法,基本靠经验。
如果你真的做过这样的事情,你就能体会到过程的复杂,因为算法一般都有bug,测试会进行很多次,你不停的去运行shell脚本,打印错误的值,不停的在你c(java)代码与shell脚本和terminal之间切来切去。你没办法专注算法本身,最后你因为时间限制与银牌擦肩而过,最后发现XX公司在校招要求上赫赫然地写着"2. ACM区域赛银牌及以上。",多么痛的领悟!!!
现在,有了junit,你就可以在一个文件中简单的将你的测试写进去,运行,就可以看到程序的输出和你的预期结果有什么差别了。唉,学校里从来也没人提过这种东西啊,早知道伤心总是难免的,我又何苦对ACM一往情深。
下面我们就来看看junit到底是怎么回事。
我们先写一个简单的加减乘除类:
接下来我们编写这个类的测试类进行测试,需要注意的内容已经在代码的注视中写清楚了。
可以看到我们的测试通过了:
如果测试失败呢,比如我们3*3 = 9,但是我们在程序里不小心写成了a*b+1,于是返回10,那么junit就会给我们反馈:
你看,我们跑了4个测试,有一个失败了,图4下半部分中写到java.lang.AssertionError: expected:<9> but was:<10>
在testMultiply这个方法中,我们期望的正确值是9,但是程序返回值是10.
那juint是怎么工作的呢?我们看下下面这个:
运行结果如下:
具体的解释可以看图5的注释,可以看到juint给了你很多自由发挥的空间。比如我们要测试spring程序,需要先加载ApplicationContext.xml文件,这时候你就可以在setUpBeforeClass中加载这个配置文件。
然后我告诉你,其实@Test注解还可以传参数,比如你知道测试里有一个bug,除数在某种情况下可能为0,但是你不想让这种情况影响测试正常地进行,这时候就可以这样:
expected=ArithmeticException.class会捕捉除数为0这个异常,这个测试会安全通过。
下面就是常用的两个维度上的"一起运行":
如果有很多类需要测试,你写了很多测试类,那么是不是要一个一个的运行这些测试类?是不是希望有这么一个方法能一下运行很多不同的测试类:
那如果一个类有很多测试数据呢,想想ACM你想被accept一次,你的代码需要接受100M的测试用例,这么多怎么办?
怎么样?junit是不是很方便呢?