Junit是用于编写和运性可重复的自动化测试的开源测试框架。
使用Myeclipse时,由于该工具自带了Junit,故可以直接右键项目,选择BuildPath à addLibrary à Junit
手动下载hamcrest-core-1.3.jar和junit-4.12.jar放到lib文件夹下面,然后右键build Path –> add to build Path
注解 |
描述 |
@Test |
测试注释指示该公共无效方法它所附着可以作为一个测试用例。 |
@Before |
Before注释表示,该方法必须在类中的每个测试之前执行,以便执行测试某些必要的先决条件。 |
@BeforeClass |
BeforeClass注释指出这是附着在静态方法必须执行一次并在类的所有测试之前。发生这种情况时一般是测试计算共享配置方法(如连接到数据库)。 |
@After |
After 注释指示,该方法在执行每项测试后执行(如执行每一个测试后重置某些变量,删除临时变量等) |
@AfterClass |
当需要执行所有的测试在JUnit测试用例类后执行,AfterClass注解可以使用以清理建立方法,(从数据库如断开连接)。注意:附有此批注(类似于BeforeClass)的方法必须定义为静态。 |
@Ignore |
当想暂时禁用特定的测试执行可以使用忽略注释。每个被注解为@Ignore的方法将不被执行。 |
一个测试类单元测试的执行顺序为:
@BeforeClass –> @Before –> @Test –> @After –> @AfterClass
每一个测试方法的调用顺序为:
@Before –> @Test –> @After
判断程序在各种情况下的运性情况,运性失败则程序终止,且点击此处可跟踪问题
带提示信息的断言使用,例:
void assertTrue([String message], boolean condition)
@Test
public void testAssertTrue() {
Boolean var1 = true;
Boolean var2 = false;
assertTrue("这是一个测试消息头:",var1);//结果相等
assertTrue("这是一个测试消息头:",var2);//结果错误
assertTrue(var2);//结果错误
}
常用断言注解:
@assertEquals 比较两个值
@assertTrue 断言一个条件
@assertFalse 断言一个条件为假
@assertNotNull 断言一个 对象不为null
@assertNull 断言一个条件为null
@assertSame 断言两个对象引用相同的对象
@assertNotSame 断言两个对象不是引用的相同对象
@asssertArrayEquals 断言两个数据是否相等
发展由来:为了单元测试的严谨性,我们模拟了不同类型的字符串来测试方法的处理能力,为此我们可能会编写大量的单元测试方法。可是这些测试方法都是大同小异;代码结构都是相同的,不同的仅仅是测试数据和期望值。有没有更好的方法将测试方法中相同的结构代码提取出来,提高代码的重用度,减少复制粘贴的烦恼。
/**
*Junit参数化测试
*<功能详细描述>
* @see
* @since
*/
@RunWith(value = Parameterized.class)
public class JunitParamTest {
private static JunitParam calculator = new JunitParam();
private int param;
private int paramm;
private int result;
//测试数据集合,方法名可以随意定义,返回类型可变,但是必须用@Parameters标注 生成并返回测试数据
@Parameters
public static Collection data() {
// 数组中,包含了传入参数和期望结果,数组参数顺序与构造函数参数顺序一致即可
return Arrays.asList(new Object[][] { { 2, 3, 6 }, { 0, 1, 0 },{ -3, 2, -6 }});
}
//构造函数,存储测试数据,参数赋值顺序与测试数据集合一致
public JunitParamTest(int param, int paramm, int result) {
this.param = param;
this.paramm = paramm;
this.result = result;
}
@Test
public void square() {
calculator.multiply(param, paramm);
assertEquals(result, calculator.getResult());
}
}
public class JunitParam {
private static int result; // 静态变量,用于存储运行结果
public void add(int n){
result = result + n;
}
public void multiply(int n , int m) {
result = n * m;
}
public int getResult() {
return result;
}
}
原理:将不同类中被@Test标签标注的类在同一时间运行
用法在套件测试类上标注:
@RunWith(Suite.class)
@Suite.SuiteClasses({类1.class, 类2.class})
/**
*套件测试Demo
*<功能详细描述>
* @see
* @since
*/
@RunWith(Suite.class)
@Suite.SuiteClasses({OneSuiteTest.class,TwoSuiteTest.class})
public class JunitSuite {
}
/**
*单元测试类1
*<功能详细描述>
* @see
* @since
*/
public class OneSuiteTest {
@Test
public void test(){
System.out.println("套件测试one");
}
}
/**
*单元测试类2
*<功能详细描述>
* @see
* @since
*/
public class TwoSuiteTest {
@Test
public void test(){
System.out.println("套件测试two");
}
}
用法:在需要被测试的方法名上面加@Test(expected = ArithmeticException.class)
结果:若出现异常,则程序正常运行。
1.Junit的测试方法都是public,private修饰会报错
2.Junit测试方法不能传参数
3.Junit测试方法的返回值,必须为void
应为:
@Test
public void method(){
........
}