2016-06-23 9 views
1

junitの電卓プログラムのテストケースを書きたいと思います。私はjunit環境に新しいです。私は他のプログラムのテストを書くことができますが、switch()の場合のテストには固執しています。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(); 

    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("");  
    } 
} 

} 

答えて

0

は、ロジックのテストが可能になる、(非静的)メソッドへの入力、計算および出力を入れて考えてみましょう:

//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テストの例である:私はそれを修正H. @Mo

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)); 
    } 

} 
+0

感謝。テスト容易性のためだけに必要以上に公開しなければならないのは、常に私のジレンマです。私は通常、テストのために必要なものを公開し、テスト後にプライベートなものに変更する。 – c0der

+0

@ s.p私はそれが助けてうれしいです。さらに明確化が必要な場合は、お気軽にお問い合わせください。投票を検討してください。 – c0der

0

である、あなたは通常、あなたがテストするAPIの部分を持っている必要があります。あなたのケースでは、すべてがユーザー入力を収集する主要な方法にあるので、テストするのは難しいです。答えを返すdouble performOperation(number, number, operation)メソッドのようなものを抽出する必要があります。次に、さまざまな入力を持つJUnitテストをこのメソッドに書き込むことができます。

1

ユニットテストを書く最初のステップは、テスト可能なコードを書くことです。この時点では、コードはあまりテスト可能ではありません。テストすることは可能ですが、ベストなテストではありません。理由を見てみましょう。

最初の理由は、すべてのコードがメイン関数にあることです。あなたは通常これを避けたい。これには複数の理由がありますが、私の意見では2つの大きな点は可読性と再利用性です。通常、あなたは物を別のクラスに入れたいと思っていますが、時間のために数学のスイッチをそれ自身の関数に置きます。

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("");  
    } 
} 
} 

ここで、私たちは数学的操作を行う独自の方法を持っています。 1つの問題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; 
} 
} 

今すぐ私たちのユニットがはるかに容易に分解され、それを打破します。ここからは、addsubdiv、およびmulの機能をテストすると書いてあります。これらが正常に機能しているかどうかをテストしてください。次に、doMath関数のテストを記述して、値が正しい操作に渡されることを確認します。このようにして、何かが失敗した場合、どこにその失敗があり、何が問題なのかを正確に知ることができます。 doMathに問題があるか、他の数学的方法の1つが問題であるかどうかを知ることができます。また、あなたがより簡単に他のもののためにあなたの方法を再利用することができますので、勝つ、勝つ

関連する問題