2017-04-21 46 views
0

This is what I intend to do我在設計Junit測試用例進行邊界值分析時遇到了問題。第一類是根據層次結構執行邏輯排序的類。當使用assertEquals時,程序不能正常工作。它不斷重複之前assertEquals所做的一切。因此,最終,任何進一步的評估將被視爲無用。Java的分層算法是如何工作的?

public class AssignCharges { 
    RandomGeneratorClass rgc = new RandomGeneratorClass(); 

    // To test for cases less than 0 
    public double getCharges(int distance, int weight) { 
    // declaring the variable to be fit into the given situation 
    double charges = 0; 

    if(weight < 0 || distance < 0) 
     throw new IllegalArgumentException("Values cannot be negative."); 

    // Testing for valid first boundary values 
    // @ <300g, <10km, RM 5 
    else if(weight > 0 && weight < 300){ 
     charges = 5; 
    } 
    // Testing for valid second boundary values @ 300-1000g 
    else if(weight >= 300 && weight < 1000){ 
    // @ distance < 10km, RM 8 
     if(distance > 0 && distance < 10) 
      charges = 8; 
    // @ 10 < distance < 30, RM 10 
     else if(distance >= 10 && distance < 30) 
      charges = 10; 
    // @ distance >= 30, RM 20 
     else 
      charges = 20; 
    } 
    // Testing for valid third boundary values @ 1001-3000 g 
    else if(weight >= 1000 && weight <3000){ 
    // @ < 10km, RM 8 
     if(distance > 0 && distance < 10) 
      charges = 8; 
    // @ 10 < distance < 30, RM 12 
     else if(distance >= 10 && distance < 30) 
      charges = 12; 
    // @ distance > 30, RM 30 
     else 
      charges = 30; 
    } 

    // Testing for valid fourth boundary values @ 3001-5000g 
    else if(weight >= 3000 && weight < 5000){ 
    // @ < 10km, RM 10 
     if(distance > 0 && distance < 10) 
      charges = 10; 
    // @ 10 < distance < 30, RM 15 
     else if(distance >= 10 && distance < 30) 
      charges = 15; 
    // @ distance > 30, RM 40 
     else 
      charges = 40; 
    } 

    // Testing for valid fifth boundary values @ >5000g 
    else if(weight >= 5000){ 
    // @ < 10km, RM 15 
     if(distance > 0 && distance < 10) 
      charges = 15; 
    // @ 10 < distance < 30, RM 20 
     else if(distance >= 10 && distance < 30) 
      charges = 20; 
    // @ distance > 30, RM 50 
     else 
      charges = 50; 
    } 

    // Testing for invalid negative boundary values 
    // The else is sufficient as the only invalid values = negative values 
    else if(weight == 0 && distance == 0) 
     charges = 0; 

    // replies the amount of corresponding charges 
    return charges; 
} 

這將是JUnit的代碼:

public class AssignChargesTest { 
    @Test 
    public void testAssignWeightDistanceInvalidBoundary(){ 
     AssignCharges ac = new AssignCharges(); 
     double charges; 

     // invalid boundary 
     charges = ac.getCharges(0, 0); 
     assertEquals(0, charges, 0); 
    } 

    @Test 
    public void testAssignWeightDistanceFirstBoundary(){ 
     AssignCharges ac = new AssignCharges(); 
     double charges; 

     // first boundary 
     charges = ac.getCharges(299, 5); 
     assertEquals(5, charges, 0); 
    } 

    @Test 
    public void testAssignWeightDistanceSecondBoundary(){ 
     AssignCharges ac = new AssignCharges(); 
     double charges; 

     // second boundary 
     charges = ac.getCharges(999, 5); 
     assertEquals(8, charges, 0); 
     charges = ac.getCharges(999, 20); 
     assertEquals(10, charges, 0); 
     charges = ac.getCharges(999, 40); 
     assertEquals(20, charges, 0); 
    } 

    @Test 
    public void testAssignWeightDistanceThirdBoundary(){ 
     AssignCharges ac = new AssignCharges(); 
     double charges; 

     // third boundary 
     charges = ac.getCharges(2999, 5); 
     assertEquals(8, charges, 0); 
     charges = ac.getCharges(2999, 20); 
     assertEquals(12, charges, 0); 
     charges = ac.getCharges(2999, 40); 
     assertEquals(30, charges, 0); 
    } 

    @Test 
    public void testAssignWeightDistanceFourthBoundary(){ 
     AssignCharges ac = new AssignCharges(); 
     double charges; 

     // fourth boundary 
     charges = ac.getCharges(4999, 5); 
     assertEquals(10, charges, 0); 
     charges = ac.getCharges(4999, 20); 
     assertEquals(15, charges, 0); 
     charges = ac.getCharges(4999, 40); 
     assertEquals(40, charges, 0); 
    } 

    @Test 
    public void testAssignWeightDistanceFifthBoundary(){ 
     AssignCharges ac = new AssignCharges(); 
     double charges; 

     // fifth boundary 
     charges = ac.getCharges(5001, 5); 
     assertEquals(15, charges, 0); 
     charges = ac.getCharges(5001, 20); 
     assertEquals(20, charges, 0); 
     charges = ac.getCharges(5001, 40); 
     assertEquals(50, charges, 0); 
    } 


    @Test(expected = IllegalArgumentException.class) 
    public void testIllegalArgumentException(){ 
     AssignCharges ac = new AssignCharges(); 
     double charges; 

     // invalid arguments list in terms of negative values: 

     // below boundary @ negative weight, negative distance 
     charges = ac.getCharges(-5, -5); 
     // positive weight, negative distance 
     charges = ac.getCharges(299, -5); 
     charges = ac.getCharges(999, -5); 
     charges = ac.getCharges(2999, -5); 
     charges = ac.getCharges(4999, -5); 
     charges = ac.getCharges(5001, -5); 
     // negative weight, positive distance 
     charges = ac.getCharges(-1, 2); 
     charges = ac.getCharges(-2, 12); 
     charges = ac.getCharges(-3, 22); 
     charges = ac.getCharges(-4, 32); 
    } 
} 
+3

請創建一個[mcve] - 強調最小化。 –

+0

這是我打算做的:http://imgur.com/a/dC1IL –

回答

0

JUnit是什麼,但Java的。一旦Java語句突然完成(例如拋出異常),後續的語句不會執行。

如果你有陳述的這樣一個順序:

charges = ac.getCharges(-5, -5); 
charges = ac.getCharges(-5, -5); 
charges = ac.getCharges(-5, -5); 
// ... 

(我知道他們都是我只是複製相同+粘貼)一旦第一個失敗

,其他都是多餘的。

你需要做一些像包裹在一個try/catch塊中調用,爲了讓執行繼續超越失敗:

try { 
    ac.getCharges(-5, -5); 
    fail(); 
} catch (IllegalArgumentException expected) { 
} 
try { 
    ac.getCharges(-5, -5); 
    fail(); 
} catch (IllegalArgumentException expected) { 
} 
// ... 

所以將繼續執行。

這顯然很冗長。相反,考慮編寫一個方法是這樣的:

void assertGetChargesFails(int a, int b) { 
    try { 
    ac.getCharges(a, b); 
    fail(); 
    } catch (IllegalArgumentException expected) { 
    } 
} 

然後調用,如:

assertGetChargesFails(-5, -5); 
assertGetChargesFails(-5, -5); 
assertGetChargesFails(-5, -5); 

如果你使用JUnit 4.15或更高版本和Java 8,有一個assertThrows method它做到這一點更漂亮:

assertThrows(IllegalArgumentException.class,() -> ac.getChanges(-5, -5)); 
assertThrows(IllegalArgumentException.class,() -> ac.getChanges(-5, -5)); 

如果不拋出異常,則assertThrows行中的每一行都會失敗。

+0

謝謝,現在我知道從哪裏開始調試問題。我會開始解決它。 –