在设计用于边值分析的这就是我想要做的测试用例时,我遇到了一些问题。第一类是执行基于层次结构的逻辑排序的类。当使用assertEquals时,程序行为不正常。它继续重复以前的assertEquals所做的事情。因此,任何进一步的评价最终都将被认为是无用的。
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);
}
}发布于 2017-04-21 15:06:16
JUnit不过是Java而已。一旦一个Java语句突然完成(例如抛出一个异常),随后的语句就不会被执行。
如果您有这样一系列的语句:
charges = ac.getCharges(-5, -5);
charges = ac.getCharges(-5, -5);
charges = ac.getCharges(-5, -5);
// ...(我知道他们都一样-我只是copied+pasted)
一旦第一次失败,其他的都是多余的。
您需要执行类似于将调用包装在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或更高版本和Java8,则有一个方法可以更好地做到这一点:
assertThrows(IllegalArgumentException.class, () -> ac.getChanges(-5, -5));
assertThrows(IllegalArgumentException.class, () -> ac.getChanges(-5, -5));如果不抛出异常,则每个assertThrows行都将失败。
https://stackoverflow.com/questions/43545915
复制相似问题