简单了解junit的使用

普通使用:

在没有用测试框架之前,我们要用一个main方法来跑代码,而有了像junit这样的测试框架后,就可以不用次次写个main方法了。

直接上代码,注释里有说明:

package com.stuPayment;

import static org.junit.Assert.assertEquals;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

/**
 * 简单地演示了junit的基本用法
 * @author 85060
 *
 */
public class MyTest {
    private static NumberTest numberTest = null;
    
    public void get3(NumberTest num) {
        num.a = num.a*num.a*num.a;
    }
    
    public void get2(NumberTest num) {
        num.a = num.a*num.a;
    }
    
    @Ignore //这个注释下的方法是会被忽略暂时不会运行的
    public void ignoreMethod() {
        System.out.println("i am ingnored");
    }
    
    @Before //这个注释是在每个测试方法之前都会跑的,也就是每个@Test的方法跑之前
    public void sayBefore() {
        System.out.println("hello i am the before");
    }
    
    @After    //这个注释是在每个测试方法之后都会跑的,也就是每个@Test的方法跑之后
    public void sayAfter() {
        System.out.println("hello i am the after");
    }
    
    @BeforeClass    //这个注释是在整个测试开始前会跑的
    public static void befC() {
        System.out.println("hello i am the before class");
        numberTest = new NumberTest(3);
    }
    
    @AfterClass    //这个注释是在整个测试结束后会跑的
    public static void aftC() {
        System.out.println("hello i am the after class and the a is "+numberTest.a+" now");
        
    }
    
    @Test
    public void test1() {
        System.out.println("i am the test1");
        get2(numberTest);
        assertEquals(9, numberTest.a);
    }
    
    @Test
    public void test2() {
        System.out.println("i am the test2");
        /*if(numberTest.a == 3) {
            
        } else if(numberTest.a == 9)*/
        get3(numberTest);
        assertEquals(729, numberTest.a);
        
    }
    
}

class NumberTest {
    int a;
    
    public NumberTest(int a) {
        this.a = a;
    }
    
}

运行的方法就直接run as Junit Test,运行结果:

 

 

 

 

在Springboot中使用junit:

这里只是提供一个简单的测试例子,可以用来单独测试service或者是你的dao接口。

关于@Runwiht:

@RunWith
在JUnit中有很多个Runner,他们负责调用你的测试代码,每一个Runner都有各自的特殊功能,你要根据需要选择不同的Runner来运行你的测试代码。
如果我们只是简单的做普通Java测试,不涉及Spring Web项目,你可以省略@RunWith注解,这样系统会自动使用默认Runner来运行你的代码。

也是直接上代码,注释里面有说明:

package com.stuPayment;

import static org.junit.Assert.assertArrayEquals;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.stuPayment.dao.LoginMapper;
import com.stuPayment.entiy.User;

/**
 * 演示了springboot环境下的junit测试
 * @author 85060
 *
 */
@RunWith(SpringRunner.class)    // SpringJUnit支持,由此引入Spring-Test框架支持! 
@SpringBootTest             //提供spring环境
public class MyTest2 {
    
    @Autowired
    private LoginMapper loginMapper;
    
    @Test
    public void testVoid() {
        Map<String, Object> user = new HashMap<>();
        user.put("userAccount", "123");
        user.put("userPassword", "123");
        List<User> userList = loginMapper.getThisUser(user);
        
        assertArrayEquals(
                new Object[]{
                        userList.isEmpty()
                }, new Object[]{
                        false
                }
        );
    }
}

 

 

 

junit的参数化测试:

其实就是,当有一个方法,要用多组参数来验证其正确性,这个时候你就可以考虑用这个@RunWith(Parameterized.class)注解

上代码,代码里面有注解解释:

package com.stuPayment;

import static org.junit.Assert.assertTrue;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

/**
 * 演示一下参数测试
 * @author 85060
 *
 */
@RunWith(Parameterized.class)   //一定要用这个注解
public class MyTest3 {
    private String name;
    private boolean result;
    
    /**
     * 在参数测试中只能有一个构造方法,因为参数测试是需要一个构造方法参与的
     * 这个构造方法的参数和等一下@Parameters注解的方法中的Object数组中值的顺序对应
     * @param name
     * @param result
     */
    public MyTest3(String name, boolean result) {
        this.name = name;
        this.result = result;
    }
    
    /**
     * 必须提供@Parameters方法,方法签名必须是public static Collection,不能有参数,
     * 并且collection元素必须是相同长度的数组。
     * 同事数组的长度必须与唯一的公共构造函数的参数数量相匹配。
     */
    @Parameters
    public static Collection<?> data() {
        return Arrays.asList(new Object[][]{
            {"jflksadjflkasdlkfj",false},
            {"mikjsdkalfjlksdjfmifjaslkdjf",true},
            {"mimimimisdfsadfsd",true}
        });//意思其实就是拿这些数据去用MyTest3(String name, boolean result)一直new
    }
    
    @Test    //真正测试也就是跑的那个方法,用@parameters方法返回的那些参数每组都用MyTest3(String name, bolean result)
             //然后再跑下面这个方法。
    public void test() {
        assertTrue(name.contains("mi") == result);//看看每个用上面那些数据new的实例是否符合要求
    }
    
}

 

 

测试结果的效果:

 

 

 可以看到,如果有错的话会有蓝色的叉叉,然后点击这个错误,在failure trace那可以看到简单的错误说明。

 

posted @ 2018-07-20 22:06  汪神  阅读(752)  评论(0编辑  收藏  举报