Java 使用junit测试带有开关盒的程序
我想用junit为计算器程序编写测试用例。我不熟悉junit环境。我可以为其他程序编写测试,但有点拘泥于switch()用例的测试 我真的很想知道怎么做 提前谢谢 这是我的节目Java 使用junit测试带有开关盒的程序,java,junit,Java,Junit,我想用junit为计算器程序编写测试用例。我不熟悉junit环境。我可以为其他程序编写测试,但有点拘泥于switch()用例的测试 我真的很想知道怎么做 提前谢谢 这是我的节目 import java.util.Scanner; //This program performs basic math operations such as :- +,-,*,/ public class Calculator { public static void main(Stri
import java.util.Scanner;
//This program performs basic math operations such as :- +,-,*,/
public class Calculator
{
public static void main(String[] args)
{
double number1, number2;
String Mathoperation;
Scanner scannerObject = new Scanner(System.in);
System.out.println("Enter first number");
number1 = scannerObject. nextDouble();
System.out.println("Enter second number");
number2 = scannerObject. nextDouble();
Scanner UserInput = new Scanner(System.in);
System.out.println("\nHere are your options:");
System.out.println("\n1. Addition, 2. Subtraction, 3. Divison, 4. Multiplication");
Mathoperation = UserInput.next();
switch (Mathoperation)
{
case "1":
System.out.println("Your answer is " + (number1 + number2));
break;
case "2":
System.out.println("Your answer is " + (number1 - number2));
break;
case "3":
System.out.println("Your answer is " + (number1 / number2));
break;
case "4":
System.out.println("Your asnwer is " + (number1 * number2));
break;
default:
System.out.println("");
}
}
}
要编写单元测试,您通常必须有要测试的API片段。在您的例子中,所有内容都在收集用户输入的主方法中,因此很难进行测试。您应该提取类似于返回答案的
双重执行操作(number,number,operation)
方法的内容。然后,您可以使用此方法的不同输入编写JUnit测试。编写单元测试的第一步是编写可测试代码。在这一点上,你的代码不是很容易测试,也就是说你可以测试它,但它不是最好的测试。让我们看看原因
第一个原因是您的所有代码都在主函数中。您通常希望避免这种情况。这有多种原因,但我认为最大的两个原因是可读性和可重用性。通常你会想把东西放到不同的类中,但为了时间起见,我们只需要把你的数学开关放到它自己的函数中
import java.util.Scanner;
//This program performs basic math operations such as :- +,-,*,/
public class Calculator
{
public static void main(String[] args)
{
double number1, number2;
String Mathoperation;
Scanner scannerObject = new Scanner(System.in);
System.out.println("Enter first number");
number1 = scannerObject. nextDouble();
System.out.println("Enter second number");
number2 = scannerObject. nextDouble();
Scanner UserInput = new Scanner(System.in);
System.out.println("\nHere are your options:");
System.out.println("\n1. Addition, 2. Subtraction, 3. Divison, 4. Multiplication");
Mathoperation = UserInput.next();
doMath(Mathoperation, number1, number2)
}
public double doMath(String Mathoperation, double number1, double number2){
switch (Mathoperation)
{
case "1":
System.out.println("Your answer is " + (number1 + number2));
break;
case "2":
System.out.println("Your answer is " + (number1 - number2));
break;
case "3":
System.out.println("Your answer is " + (number1 / number2));
break;
case "4":
System.out.println("Your asnwer is " + (number1 * number2));
break;
default:
System.out.println("");
}
}
}
好的,很酷,现在我们有了自己的数学运算方法。一个问题是tho。这本身不是一个单位,这实际上是加法和我们的数学运算之间的集成。这意味着,为了测试,我们需要测试算术的每个组合(加、减、除、乘)以及方法是否选择了正确的运算符。这比我们想要的要多得多,而且不是一个很好的测试,那么我们如何解决这个问题呢?很简单,我们进一步细分
import java.util.Scanner;
//This program performs basic math operations such as :- +,-,*,/
public class Calculator {
//Code for use input somewhere here
public double doMath(String Mathoperation, double number1, double number2){
switch (Mathoperation)
{
case "1":
System.out.println("Your answer is " + add(number1, number2));
break;
case "2":
System.out.println("Your answer is " + sub(number1, number2));
break;
case "3":
System.out.println("Your answer is " + div(number1, number2));
break;
case "4":
System.out.println("Your answer is " + mul(number1, number2));
break;
default:
System.out.println("");
}
}
public double add(double number1, double number2){
return number1 + number2;
}
public double sub(double number1, double number2){
return number1 - number2;
}
public double mul(double number1, double number2){
return number1 * number2;
}
public double div(double number1, double number2){
return number1 / number2;
}
}
现在我们的单位更容易分解。从这里,您可以为
add
、sub
、div
和mul
函数编写测试。对其进行测试,以确保其功能符合预期。然后为doMath
函数编写测试,确保它将值传递给正确的操作。通过这种方式,当某件事情失败时,你确切地知道它的失败之处以及问题所在,而不是猜测。您将知道是doMath
有问题,还是您的其他数学方法有问题。它还允许您更容易地将方法用于其他事情,因此win-win考虑将输入、计算和输出放入(非静态)方法中,这将使逻辑测试成为可能:
//This program performs basic math operations such as :- +,-,*,/
public class Calculator {
double number1, number2;
String Mathoperation;
Calculator()
{
//you need to remove input and calculation logic from constructor,
//to avoid running it when constructing this object for testing.
}
public void run() {
getInput();
double result = doMath(Mathoperation, number1, number2 );
System.out.println("Your answer is " + result );
}
private void getInput() {
Scanner scannerObject = new Scanner(System.in);
System.out.println("Enter first number");
number1 = scannerObject. nextDouble();
System.out.println("Enter second number");
number2 = scannerObject. nextDouble();
Scanner UserInput = new Scanner(System.in);
System.out.println("\nHere are your options:");
System.out.println("\n1. Addition, 2. Subtraction, 3. Divison, 4. Multiplication");
Mathoperation = UserInput.next();
}
/**
*@param mathoperation
*/
public double doMath(String mathoperation, double number1, double number2) {
switch (mathoperation)
{
case "1":
return (number1 + number2);
case "2":
return (number1 - number2);
case "3":
return (number1 / number2);
case "4":
return (number1 * number2);
default:
throw new IllegalStateException("mathoperation is not valid");
}
}
public static void main(String[] args)
{
Calculator calc = new Calculator();
calc.run();
}
}
下面是一个非常简单的JUnit测试示例:
public class CalculatorTest {
/**
* Test method for {@link Calculator#doMath(java.lang.String, double, double)}.
*/
@Test
public void testDoMath() {
Calculator calc = new Calculator();
assertTrue(calc.doMath("1", 5, 7) == 12.0);
assertTrue(calc.doMath("2", 5, 7) == -2.0);
assertTrue(calc.doMath("3", 5, 7) == (5.0/7.0));
assertTrue(calc.doMath("4", 5, 7) == (5.0*7.0));
}
}
谢谢@moh。我修好了。对于我来说,这总是一个进退两难的问题,我是否应该仅仅为了可测试性而暴露更多的信息。我通常将测试所需的内容公开,并在测试后将其更改为私人或其他任何内容。@s.p我很高兴它有所帮助。如果需要更多的澄清,请随时询问。考虑投票。