发表于: 2017-11-04 23:44:30
1 759
day14
今日完成
写了一个单元测试的demo
被测试类:
public class Calculator {
public int add(int x,int y){
return x+y;
}
public int substract(int x,int y){
return x-y;
}
public int multiply(int x,int y){
return x*y;
}
public int divide(int x,int y)throws IllegalArgumentException{
if(y==0) {
throw new IllegalArgumentException("0不能为除数");
}
return x/y;
}
}
测试类
import org.junit.*;
import static org.junit.Assert.assertEquals;
public class CalculatorTest {
Calculator calculator;
@BeforeClass
public static void globalInit() {
System.out.println("-----globalInit invoked!------");
}
@AfterClass
public static void globalDestory() {
System.out.println("-----globalDestory invoked!-----");
}
@Before
public void setUp() {
calculator = new Calculator();
System.out.println("before");
}
@After
public void tearDown() {
System.out.println("after");
}
@Test
public void testAdd() throws Exception {
int sum = calculator.add(1, 2);
assertEquals(3, sum);
}
@Test
public void testMultiply() throws Exception {
int product = calculator.multiply(2, 4);
assertEquals(8, product);
}
@Test
@Ignore("not implemented yet")
public void testSubstract() throws Exception {
int result = calculator.substract(4, 3);
assertEquals(1, result);
}
@Test(expected=IllegalArgumentException.class)
public void testDivide() throws IllegalArgumentException {
int result=0;
result= calculator.divide(3, 0);
assertEquals(0, result);
}
}
运行结果:
1,说明:
@Before | 初始化方法 |
@After | 释放资源 |
@Test | 测试方法,在这里可以测试期望异常和超时时间 |
@Ignore | 忽略的测试方法 |
@BeforeClass | 针对所有测试,只执行一次,且必须为static void |
@AfterClass | 针对所有测试,只执行一次,且必须为static void |
@RunWith | 指定测试类使用某个运行器 |
@Parameters | 指定测试类的测试数据集合 |
@Rule | 允许灵活添加或重新定义测试类中的每个测试方法的行为 |
@FixMethodOrder | 指定测试方法的执行顺序 |
2. 执行顺序
一个测试类单元测试的执行顺序为:
@BeforeClass –> @Before –> @Test –> @After –> @AfterClass
每一个测试方法的调用顺序为:
@Before –> @Test –> @After
顺便搜了一下junit4的特点
1. Junit4全面引入了Annotation来执行我们编写的测试类
2. Junit4并不要求测试类继承TestCase父类
3. Junit4,在一个测试类中,所有被@Test注解所修饰的public void方法都是Test case,可以被Junit所执行。
4. Junit4中并不要求测试方法名以test开头,但是最好按照3.8的要求那样,以test作为测试方法名的开头
5. 在Junit4 通过@Before注解实现同setUp方法同样的功能,使用@After注解实现同tearDown方法同样的功能
6. Junit4中可以使用@BeforeClass与@AfterClass注解修饰一个publicstatic void no-arg的方法,这样被@BeforeClas注解所修饰的方法会在所有测试方法执行前执行; 被@AfterClass注解所修饰的方法会在所有测试方法执行之后执行
7. @Ignore注解既可以用于修饰测试类和测试方法,当修饰测试类时,表示忽略掉类中的所有测试方法,当修饰测试方法时,表示忽略掉该测试方法
8. 参数化测试(Parameters): Parameterized类,@RunWith注解,@Parameters
当一个测试类使用参数化运行器运行时,需要在类的声明处加上@RunWith(Parameterized)注解,表示该类将不使用Juint内建的运行器运行,而使用参数化运行器运行;在参数化运行类中提供参数的方法要使用@Parameters注解来修饰,同时在测试类的构造方法中为各个参数赋值(构造方法是Junit调用的),最后编写测试类,它根据参数的数组来运行测试多次。
另外:
assertThat(来自hamcrest包,所以我们需要下载hamcrest这个包)
assertThat(actual, matcher);的出现可以替代其他所有的assert。放弃旧的断言,使用hamcrest断言。其中actual参数是实际的值,matcher可以是一个匹配器。在以后的项目开发中我们就可以使用assertThat代替前面出现的类如assertEquals(6, z); assertTrue(z<3);方法。
遇到的疑惑
@Test(expected=IllegalArgumentException.class)
public void testDivide() throws IllegalArgumentException {
int result=0;
result= calculator.divide(3, 0);
assertEquals(0, result);
}
按照网上的说法,这里不是要抛出异常吗?但是运行后是这样,哪里抛出了异常。。。
明日计划
学习spring整合junit
收获
加深对junit4的了解
评论