首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java的分层算法是如何工作的?

Java的分层算法是如何工作的?
EN

Stack Overflow用户
提问于 2017-04-21 14:57:56
回答 1查看 49关注 0票数 0

在设计用于边值分析的这就是我想要做的测试用例时,我遇到了一些问题。第一类是执行基于层次结构的逻辑排序的类。当使用assertEquals时,程序行为不正常。它继续重复以前的assertEquals所做的事情。因此,任何进一步的评价最终都将被认为是无用的。

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-21 15:06:16

JUnit不过是Java而已。一旦一个Java语句突然完成(例如抛出一个异常),随后的语句就不会被执行。

如果您有这样一系列的语句:

代码语言:javascript
复制
charges = ac.getCharges(-5, -5);
charges = ac.getCharges(-5, -5);
charges = ac.getCharges(-5, -5);
// ...

(我知道他们都一样-我只是copied+pasted)

一旦第一次失败,其他的都是多余的。

您需要执行类似于将调用包装在try/catch块中的操作,以便允许执行在失败之后继续执行:

代码语言:javascript
复制
try {
  ac.getCharges(-5, -5);
  fail();
} catch (IllegalArgumentException expected) {
}
try {
  ac.getCharges(-5, -5);
  fail();
} catch (IllegalArgumentException expected) {
}
// ...

所以死刑将继续执行。

这显然是相当冗长的。相反,请考虑编写如下方法:

代码语言:javascript
复制
void assertGetChargesFails(int a, int b) {
  try {
    ac.getCharges(a, b);
    fail();
  } catch (IllegalArgumentException expected) {
  }
}

然后调用如下:

代码语言:javascript
复制
assertGetChargesFails(-5, -5);
assertGetChargesFails(-5, -5);
assertGetChargesFails(-5, -5);

如果您使用的是JUnit 4.15或更高版本和Java8,则有一个方法可以更好地做到这一点:

代码语言:javascript
复制
assertThrows(IllegalArgumentException.class, () -> ac.getChanges(-5, -5));
assertThrows(IllegalArgumentException.class, () -> ac.getChanges(-5, -5));

如果不抛出异常,则每个assertThrows行都将失败。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43545915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档