JUnit3 結合一個除法的單元測試說明Assert.fail()的用法


  

  之前一篇博文(JUnit基礎及第一個單元測試實例(JUnit3.8))介紹了用JUnit做單元測試的基本方法,並寫了一個簡單的類Calculator,其中包含了整型加減乘除的簡單算法。

  本文通過完善其中的除法和除法的單元測試來繼續說明JUnit的用法。

 

  首先完善Calculator類中的除法,在除數為零的情況下拋出一個異常:

    public int divide(int a, int b) throws Exception
    {
        if(0 == b)
        {
            throw new Exception("除數不能為0");            
        }
        return a / b;
    }

 

 

設計測試用例

  測試用例中不再拋出異常,而是使用try catch塊。

  首先是測試正常情況的測試用例:

    public void testDivide()
    {
        int result = 0;
        try
        {
            result = calculator.divide(12, 3);
        }
        catch (Exception e)
        {
            e.printStackTrace();

            // 如果拋出異常,證明測試失敗,沒有通過,沒通過的測試計數在Failures中
            Assert.fail();
            // 如果不加這一行,如果程序進入到catch,無法判斷其失敗
        }
        // 判斷方法的返回結果
        Assert.assertEquals(4, result);// 第一個參數是期望值,第二個參數是要驗證的值

    }

 

  測試異常情況的測試用例:

    public void testDivideByZero()
    {
        Throwable tx = null;

        int result = 0;
        try
        {
            result = calculator.divide(12, 2);

            Assert.fail("沒有拋出異常,測試失敗");// 如果執行到這行代碼,則證明沒有拋出異常,說明我們的驗證失敗
        }
        catch (Exception e)
        {
            e.printStackTrace();
            tx = e;

        }

        Assert.assertEquals(Exception.class, tx.getClass());// 拋出的異常類型是否和期望一致
        Assert.assertEquals("除數不能為0", tx.getMessage());// 拋出的異常信息是否和期望一致
        
        //如果上面兩個都通過,則測試通過

    }

  

  此代碼中故意將除數改為2,測試失敗。

  除數為2時的執行情況:

  

  總結:Assert.fail()加在期望中不可能到達的地方,一旦到達,表明測試失敗,結果與預期不同。

 

附上完整代碼:

目標類:

Calculator.java
package com.mengdd.junit;

public class Calculator
{
    public int add(int a, int b)
    {
        return a + b;
    }
    
    public int subtract(int a, int b)
    {
        return a - b;
    }
    
    public int multiply(int a, int b)
    {
        return a * b;
    }

    public int divide(int a, int b) throws Exception
    {
        if(0 == b)
        {
            throw new Exception("除數不能為0");            
        }
        return a / b;
    }
}

 

測試類:

CalculatorTest.java
package com.mengdd.junit;

import junit.framework.Assert;
import junit.framework.TestCase;

public class CalculatorTest extends TestCase
{

    private Calculator calculator = null;

    @Override
    public void setUp() throws Exception
    {
        System.out.println("set up");
        // 生成成員變量的實例
        calculator = new Calculator();
        System.out.println(calculator);
    }

    @Override
    public void tearDown() throws Exception
    {
        System.out.println("tear down");
    }

    public void testAdd()
    {
        int result = calculator.add(1, 2);
        // 判斷方法的返回結果
        Assert.assertEquals(3, result);// 第一個參數是期望值,第二個參數是要驗證的值
    }

    public void testSubtract()
    {
        int result = calculator.subtract(1, 2);
        // 判斷方法的返回結果
        Assert.assertEquals(-1, result);// 第一個參數是期望值,第二個參數是要驗證的值

    }

    public void testMultiply()
    {
        int result = calculator.multiply(2, 3);
        // 判斷方法的返回結果
        Assert.assertEquals(6, result);// 第一個參數是期望值,第二個參數是要驗證的值

    }

    public void testDivide()
    {
        int result = 0;
        try
        {
            result = calculator.divide(12, 3);
        }
        catch (Exception e)
        {
            e.printStackTrace();

            // 如果拋出異常,證明測試失敗,沒有通過,沒通過的測試計數在Failures中
            Assert.fail();
            // 如果不加這一行,如果程序進入到catch,無法判斷其失敗
        }
        // 判斷方法的返回結果
        Assert.assertEquals(4, result);// 第一個參數是期望值,第二個參數是要驗證的值

    }

    public void testDivideByZero()
    {
        Throwable tx = null;

        int result = 0;
        try
        {
            result = calculator.divide(12, 0);

            Assert.fail("沒有拋出異常,測試失敗");// 如果執行到這行代碼,則證明沒有拋出異常,說明我們的驗證失敗
        }
        catch (Exception e)
        {
            e.printStackTrace();
            tx = e;

        }

        Assert.assertEquals(Exception.class, tx.getClass());// 拋出的異常類型是否和期望一致
        Assert.assertEquals("除數不能為0", tx.getMessage());// 拋出的異常信息是否和期望一致
        
        //如果上面兩個都通過,則測試通過

    }

}

 

 

參考資料:

  聖思園張龍老師Unit Test視頻。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM