通过这两天学习了解了用Junit测试Java项目的方法,并练习了一个例子,现在写篇blog总结一下,这道题在慕测官网难度为易,主要考察代码覆盖。
项目代码:
package net.mooctest;
public class Triangle {
protected long lborderA = 0;
protected long lborderB = 0;
protected long lborderC = 0;
// Constructor
public Triangle(long lborderA, long lborderB, long lborderC) {
this.lborderA = lborderA;
this.lborderB = lborderB;
this.lborderC = lborderC;
}
/**
* check if it is a triangle
*
* @return true for triangle and false not
*/
public boolean isTriangle(Triangle triangle) {
boolean isTriangle = false;
// check boundary
if ((triangle.lborderA > 0 && triangle.lborderA <= Long.MAX_VALUE)
&& (triangle.lborderB > 0 && triangle.lborderB <= Long.MAX_VALUE)
&& (triangle.lborderC > 0 && triangle.lborderC <= Long.MAX_VALUE)) {
// check if subtraction of two border larger than the third
if (diffOfBorders(triangle.lborderA, triangle.lborderB) < triangle.lborderC
&& diffOfBorders(triangle.lborderB, triangle.lborderC) < triangle.lborderA
&& diffOfBorders(triangle.lborderC, triangle.lborderA) < triangle.lborderB) {
isTriangle = true;
}
}
return isTriangle;
}
/**
* Check the type of triangle
*
* Consists of "Illegal", "Regular", "Scalene", "Isosceles"
*/
public String getType(Triangle triangle) {
String strType = "Illegal";
if (isTriangle(triangle)) {
// Is Regular
if (triangle.lborderA == triangle.lborderB
&& triangle.lborderB == triangle.lborderC) {
strType = "Regular";
}
// If scalene
else if ((triangle.lborderA != triangle.lborderB)
&& (triangle.lborderB != triangle.lborderC)
&& (triangle.lborderA != triangle.lborderC)) {
strType = "Scalene";
}
// if isosceles
else {
strType = "Isosceles";
}
}
return strType;
}
/**
* calculate the diff between borders
*
* */
public long diffOfBorders(long a, long b) {
return (a > b) ? (a - b) : (b - a);
}
/**
* get length of borders
*/
public long[] getBorders() {
long[] borders = new long[3];
borders[0] = this.lborderA;
borders[1] = this.lborderB;
borders[2] = this.lborderC;
return borders;
}
}
测试代码:
package net.mooctest;
import static org.junit.Assert.*;
import org.junit.Test;
public class TriangleTest {
Triangle T1 = new Triangle(2,3,4);
Triangle T4 = new Triangle(0,1,2);
Triangle T7 = new Triangle(Long.MAX_VALUE,2,4);
Triangle T10 = new Triangle(3,3,3);
Triangle T11= new Triangle(3,4,4);
long []borders= {0,0,0};
@Test
public void testTriangle() {
assertEquals(true, T1.isTriangle(T1));
assertEquals(false,T4.isTriangle(T4));
assertFalse(T7.isTriangle(T7));
assertTrue(T10.isTriangle(T10));
assertTrue(T11.isTriangle(T11));
}
@Test
public void testGetType() {
assertTrue("Illegal"==T4.getType(T4));
assertTrue("Regular"==T10.getType(T10));
assertTrue("Isosceles"==T11.getType(T11));
assertTrue("Scalene"==T1.getType(T1));
}
@Test
public void testDiffOfBorders() {
assertTrue(1==T1.diffOfBorders(T1.lborderA, T1.lborderB));
}
@Test
public void testGetBorders() {
borders=T1.getBorders();
assertTrue(T1.lborderA==borders[0]);
assertEquals(T1.lborderB,borders[1]);
assertEquals(T1.lborderC,borders[2]);
}
}
测试提交结果:
对于等价类,只需要一个测试用例即可覆盖;因为测试题目主要考察代码行的覆盖,所以将待测试方法全部进行测试即可。
对于测试中用到的断言语句:
assertTrue([message,] boolean condition) 验证boolean条件为true。
assertFalse([message,] boolean condition) 验证boolean条件为false。
assertEquals([message,] expected, actual) 验证expected和actual相同。
另外,了解了一些使用Junit进行单元测试的tips:
- 1.测试方法上必须使用@Test进行修饰
- 2.测试方法必须使用public void进行修饰,不能带任何的参数
- 3.新建一个源代码目录来存放测试代码
- 4.测试类的包应该和被测试类保持一致
- 5.测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖