• Junit4单元测试


    要点:   

           注解  断言  参数化  套件(testSuite)

    一、引入Junit4单元测试框架

       使用eclipse工具,在项目上单击右键->new->other->JUnit->Junit Test Case->Next->New Juint 4 test ->Name->setup->teardown->Class Under Test->Next->勾选你要测试的函数 ->Finish->提示引入JUnit库->Finish

    二、简单的实例代码

    1.被测试类:

     1 package com.zhang.java;
     2 
     3 public class LoginSample {
     4     public LoginSample() {        //构造方法
     5         System.out.println("构造方法被调用!");
     6     }
     7 
     8     public boolean login(String ln, String pwd) {
     9         if (ln != null && ln.length() > 2 && ln.length() < 17 && pwd != null && pwd.length() > 2 && pwd.length() < 17) {
    10             if (ln.equals("zzp") && pwd.equals("123456")) {
    11                 System.out.println("恭喜您,登录成功!");
    12                 return true;
    13             } else {
    14                 System.out.println("用户名或密码错误!");
    15             }
    16         } else {
    17             System.out.println("参数错误!");
    18         }
    19         return false;
    20     }
    21 
    22 }

    2、测试类代码:

     1 package com.zhang.java;
     2 
     3 import static org.junit.Assert.*;
     4 
     5 import org.junit.After;
     6 import org.junit.AfterClass;
     7 import org.junit.Before;
     8 import org.junit.BeforeClass;
     9 import org.junit.Test;
    10 
    11 public class LoginSampleTest {
    12 
    13     /**
    14      * BeforeClass和Before做测试环境的初始化;
    15      * AfterClass和After做数据的清理扫尾工作(如关闭数据库连接)
    16      */
    17     
    18     private LoginSample login;
    19     
    20     //在测试类执行之前执行的方法
    21     @BeforeClass
    22     public static void setUpBeforeClass() throws Exception {
    23         System.out.println("@BeforeClass方法被执行");
    24     }
    25 
    26     //在测试类执行之后执行的方法
    27     @AfterClass
    28     public static void tearDownAfterClass() throws Exception {
    29         System.out.println("@AfterClass方法被执行");
    30     }
    31 
    32     @Before
    33     public void setUp() throws Exception {
    34         System.out.println("@Before被调用%%%%%%%%%%%%");
    35         login = new LoginSample();
    36     }
    37 
    38     @After
    39     public void tearDown() throws Exception {
    40         System.out.println("@After被调用&&&&&&&&&&&&&&&&&");
    41     }
    42 
    43     //在一个测试类中可以有多个@test注解的测试方法
    44     @Test
    45     public void testLogin() {
    46         System.out.println("======testLogin()方法被调用======");
    47 //        fail("Not yet implemented");
    48         boolean result = login.login("zzp", "123456");
    49         if(result)
    50             System.out.println("测试通过!");
    51         else
    52             fail("测试失败!");    //用到测试框架的断言fail()方法
    53         
    54         System.out.println("======testLogin()方法调用完毕======");
    55     }
    56 
    57 }

    测试类运行结果:

    @BeforeClass方法被执行
    @Before被调用%%%%%%%%%%%%
    构造方法被调用!
    ======testLogin()方法被调用======
    恭喜您,登录成功!
    测试通过!
    ======testLogin()方法调用完毕======
    @After被调用&&&&&&&&&&&&&&&&&
    @AfterClass方法被执行

    三、补充说明

     四、Junit参数化数据驱动

     1、相关注解:

    @RunWith(Parameterized.class):注解JUnit测试类,指定该测试类使用参数化方式运行,要写在测试类外面(不是类里面);

    @Parameters:生成并返回测试数据,一般使用Object[][]二位数组来接收数据返回。该方法必须是静态方法,因为要在测试方法运行之前生成测试数据。

    2、相关方法:

      在JUnit参数化的类中,需要有一个构造方法,用于存储和传递测试数据。 由@Parameters注解的静态方法,是一个Collection或者Iterator,生成并返回测试数据。

       构造方法需要用对应的参数列表接收数据。 这样,数据将被传递到@Test注解的测试方法,逐条进行测试,直到集合中不再有元素为止。

    3、代码展示

    a、被测试类代码

     1 package com.zhang.java;
     2 
     3 public class Plus {
     4     
     5     public int Sum(int x, int y) {
     6         int result=x+y;
     7         return result;
     8     }
     9     
    10 }

    b、单元测试用例代码

     1 package com.zhang.java;
     2 
     3 import static org.junit.Assert.*;
     4 import org.junit.Before;
     5 import org.junit.Test;
     6 import org.junit.runner.RunWith;
     7 import org.junit.runners.Parameterized;
     8 import org.junit.runners.Parameterized.Parameters;
     9 
    10 //写在测试类前,表示该测试类用参数化形式运行。
    11 @RunWith(Parameterized.class)
    12 public class PlusTest {
    13     
    14   //用成员变量接收来自parameter方法生成的数据
    15     //测试名
    16     public String caseName;
    17     //测试预期结果
    18     public String exResult;
    19     //测试用到的数据
    20     public int firstNum;
    21     public int secondNum;
    22     private Plus p;
    23     
    24     //测试前的准备,初始化被测试类。
    25     @Before
    26     public void setUp() throws Exception {
    27         p=new Plus();
    28     }
    29     
    30     //构造函数用于接收数据parameter的数据,并给成员变量赋值。注意构造函数的参数列表要与传入的参数一一对应关系。
    31     public PlusTest(String input1,String input2,int input3 ,int input4) {
    32         caseName=input1;
    33         exResult=input2;
    34         firstNum=input3;
    35         secondNum=input4;
    36     }
    37     
    //注解中的name值主要用于显示运行完成后的结果显示,其中花括号{}中的数字为传入参数的下标。 38 @Parameters(name="{0},res:{1},operater:sum({2}+{3})") 39 public static Object[][] setData(){ //注意方法是静态方法,便于在加载时就把数据传入到测试类的缓存中。 40 return new Object[][] { 41 {"左边界-1","-2147483649",-2147483648,-1}, //Object[0][] 42 {"左边界+0","-2147483648",-2147483648,0}, //Object[1][] 43 {"左边界+1","-2147483647",-2147483648,1} //Object[2][] 44 }; 45 } 46 47 //每一条数据都会用于执行一次@Test测试方法 48 @Test 49 public void testSumIntInt() { 50 System.out.println(caseName); 51 //用到的方法: 52 //void org.junit.Assert.assertEquals(String message, Object expected, Object actual) 53 assertEquals(caseName,exResult, Integer.toString(p.Sum(firstNum, secondNum))); 54 } 55 56 }

    运行后的结果

    左边界-1
    左边界+0
    左边界+1

    五、TestSuite测试套件

    创建方法:

      在包含JUnit4 case的包中右键->new->other->JUnit->Junit Test Suite>Next ->New JUnit4 Suite->Name->选择你需要执行的Case->Finish。

    添加case:

      在@SuiteClasses注解中指定要执行的case,以classname.class的形式添加,多个之间用逗号隔开,如下:

      @SuiteClasses({ atest.class,btest.class,ctest.class })     表示依次执行a,b,c三个类的测试类a.test、b.test、c.test。

     

  • 相关阅读:
    IT asset register
    微前端
    强缓存和弱缓存(协商缓存)
    比较运算规则 == 、 ===、Object.is 和 ToPrimitive 方法 [[DefaultValue]] (hint)
    事件冒泡、事件捕获、事件委托
    mysql服务没有响应控制功能
    React 项目中有哪些细节可以优化?实际开发中都做过哪些性能优化
    算法的时间复杂度与空间复杂度
    算法:42.接雨水
    解决每次git pull、git push都需要输入账号和密码的问题
  • 原文地址:https://www.cnblogs.com/zzp-biog/p/10325369.html
Copyright © 2020-2023  润新知