静下心来的个人专栏
上一篇

JUnit第一个测试

广告
选中文字可对指定文章内容进行评论啦,→和←可快速切换按钮,绿色背景文字可以点击查看评论额。
大纲

在本文,我们将看到一个完整的 JUnit 测试示例,它使用 POJO 类、业务逻辑类和一个测试类,它将由测试运行器运行。提醒一句,看完之后回答一个小问题,本文中的被测试类是哪一个?

创建 EmployeeDetails.java,它是一个POJO类

public class EmployeeDetails {

   private String name;
   private double monthlySalary;
   private int age;
   
   /**
   * @return the name
   */
	
   public String getName() {
      return name;
   }
	
   /**
   * @param name the name to set
   */
	
   public void setName(String name) {
      this.name = name;
   }
	
   /**
   * @return the monthlySalary
   */
	
   public double getMonthlySalary() {
      return monthlySalary;
   }
	
   /**
   * @param monthlySalary the monthlySalary to set
   */
	
   public void setMonthlySalary(double monthlySalary) {
      this.monthlySalary = monthlySalary;
   }
	
   /**
   * @return the age
   */
   public int getAge() {
      return age;
   }
	
   /**
   * @param age the age to set
   */
   public void setAge(int age) {
      this.age = age;
   }
}

EmployeeDetails 类用于 - 

获取/设置员工姓名的值。 

获取/设置员工的月薪值。 

获取/设置员工年龄的值。

创建一个名为 EmpBusinessLogic.java 的文件,它是一个业务逻辑类。

public class EmpBusinessLogic {
   // Calculate the yearly salary of employee
   public double calculateYearlySalary(EmployeeDetails employeeDetails) {
      double yearlySalary = 0;
      yearlySalary = employeeDetails.getMonthlySalary() * 12;
      return yearlySalary;
   }
	
   // Calculate the appraisal amount of employee
   public double calculateAppraisal(EmployeeDetails employeeDetails) {
      double appraisal = 0;
		
      if(employeeDetails.getMonthlySalary() < 10000){
         appraisal = 500;
      }else{
         appraisal = 1000;
      }
		
      return appraisal;
   }
}

EmpBusinessLogic 类用于计算 - 

雇员的年薪。 

雇员的评估金额。

创建一个名为 TestEmployeeDetails.java 的文件,其中包含要测试的测试用例。

public class TestEmployeeDetails {
   EmpBusinessLogic empBusinessLogic = new EmpBusinessLogic();
   EmployeeDetails employee = new EmployeeDetails();

   //test to check appraisal
   @Test
   public void testCalculateAppriasal() {
      employee.setName("Rajeev");
      employee.setAge(25);
      employee.setMonthlySalary(8000);
		
      double appraisal = empBusinessLogic.calculateAppraisal(employee);
      assertEquals(500, appraisal, 0.0);
   }

   // test to check yearly salary
   @Test
   public void testCalculateYearlySalary() {
      employee.setName("Rajeev");
      employee.setAge(25);
      employee.setMonthlySalary(8000);
		
      double salary = empBusinessLogic.calculateYearlySalary(employee);
      assertEquals(96000, salary, 0.0);
   }
}

TestEmployeeDetails 类用于测试 EmpBusinessLogic 类的方法。

它 测试员工的年薪。 

测试员工的考核金额。

接下来,创建一个名为 TestRunner.java 的 java 类文件,它用来执行测试

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(TestEmployeeDetails.class);
		
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
		
      System.out.println(result.wasSuccessful());
   }
} 

运行之后验证结果:true

我们来分析一下,

第一个问题,EmployeeDetails这个POJO类是否需要测试?在这里,我提出一点,只要是源代码,只要包含一些不是标准的业务逻辑,就需要测试;在这里,这个类只包含一些基本的设置/获取标准方法,因此可以不用测试。

第二个问题,这里的被测试类是哪个?显然是EmpBusinessLogic 类,而且这个类包含了两个业务逻辑方法,因此测试类中一定有两个测试用例来单独测试这两个方法?

第三个问题,这里的测试用例是否完整呢?我的理解是不是那么完整,比如第一个testCalculateAppriasal方法中,没有覆盖到返回1000的情况,同时也没有覆盖到正向测试的反例负向测试,以及异常出现的情况。实际上负向测试或者异常的情况不是那么容易发现,能覆盖前两种情况已经足够。

第四个问题,你为啥不用IDE进行测试呢?我的看法是给各一个看这篇文章的人介绍一下JUnitCore.runClasses这个工具类的使用;让大家知道JUnit还可以这样来写。哈哈

欢迎留言讨论。

 

版权声明:著作权归作者所有。