Select Page

Big Java学习笔记——测试Unit Testing

Big Java学习笔记——测试Unit Testing

[danger]态度声明:本站所有原创学习类文章,只为分享学习乐趣、拓展知识广度、提供讨论平台,不以应试,实用、探讨答案为目的,本站中所有文章中的引用会要求作者尽量标出出处,所有提供下载文件均为个人整理分享学习资料,如果有版权异议,请与博主沟通。本站每学习文必置顶此项,望大家共同监督。乐于分享,支持版权,转载请列明出处,想了解更多……[/danger]


不以整个程序的形式,而在隔离状态下测试,称为unit testing。测试你的类,有两个选择。一些IDE里有可以测试对象和函数的命令;此外,还可以写一个测试类,测试类是一个带有main 函数的类,包含了可以运行其它类中函数的命令。一般来说,实现测试类需要以下几步:

  1. 构建一个或更多需要测试的类;
  2. 调用一个或多个函数;
  3. 输出一个或更多结果;
  4. 输出理想结果。

要实现一个测试程序,需要把几个类连接起来,具体的细节取决于使用的IDE和编译器。在大部分环境下,需要以下几步:

  1. 为你的程序新建一个子文件夹;
  2. 添加多个文件,一个类一个文件;
  3. 编译所有的文件;
  4. 运行测试程序。

[success]接下来我们总结一下,如何从需要到实现一个类,过程虽然看上去有些繁琐,但有利于编程过程和结果的规范化,就是代码很漂亮,很规范,大公司面试也一眼能看得懂,便于合作的那种。假想我们现在的需求是需要做一个超市里的自动结账功能:

  1. 首先先通过需求想要需要实现哪些函数:我们简易的想,首先要显示每个贺物的价格并计费,然后可以收款并知道自己收了多少钱,最后知道已经找多少钱;
  2. 列举需要哪些公共接口;我们有了1里想实现的功能,在这个步骤里我们要把这些想法,也就是需求列表转化为具体的函数名称,并想明白自己需要哪些变量和返回值,为了便于我们思考,我们把一些简易的想到的函数表象的用编程语言直接记下来,就可以比较地看出来我们需要什么变量和返回值了,
    CashRegister register = new CashRegister();
    register.recordPurchase(40);
    register.recordPurchase(5);
    register.receivePayment(50);
    double change = register.giveChange();

    通过上面的简易思路,我们可以发现需要实现以下函数:public void recordPurchase(double amount)为了记账,public void receivePayment(double amount)为了收款和public double giveChange()为了找钱;然后我们就需要思考需要几个构造器,这里我们简化一个,就建一个。

  3. 第三步,就是把之前的想法用代码和注释记录下来,为之后的具体的实现搭好框架,这点和写文章是很像的,
    /**
       A cash register totals up sales and computes changes.
    */
    public class CashRegister
    {
      /**
         Constructor of a cash register with no money
      */
      public CashRegister()
      {
      }
    
      /**
         Records the sale of product.
         @param amount the price of the item
      */
      public void recordPurchase(double amount)
      {
      }
    
      /**
         Processes a payment received from the customer.
         @param amount the amount of payment
      */
      public void receivePayment(double amount)
      {
      }
    
      /**
         Computes the changes and resets the machine for the next customer.
         @return the change due to the customer
      */
      public double giveChange()
      {
        return()
      }
    }
  4. 决定instance variables。认真地想一想具体我们需要存储哪些信息去完成这些函数的工作。要注意,函数可以在任一文件夹下被调用,那么我们就需要给对象中的instance variables 和 parameter variables预留足够的内存空间。但重要的是,不要引入不必要的instance variables。假如一个值能够被另外的instance variables计算得出,那么最好是计算生成它,而不是存储它。在这个例子中,我们需要全程记录应付金额和付款金额,因此,我们确定两个instance variables是purchase 和 payment;
  5. 实现构造器和函数。首先从最简单的入手,
      /**
         Records the sale of product.
         @param amount the price of the item
      */
      public void recordPurchase(double amount)
      {
        purchase = purchase + amount;
      }
    
      /**
         Processes a payment received from the customer.
         @param amount the amount of payment
      */
      public void receivePayment(double amount)
      {
        payment = payment + amount;
      }
    
      /**
         Computes the changes and resets the machine for the next customer.
         @return the change due to the customer
      */
      public double giveChange()
      {
        double change = payment - purchase;
        purchase = 0;//过于复杂的提示功能我们暂不考虑
        payment = 0;
        return()
      }
  6. 最后一步就是测试,写个测试类
    public class cashRegisterTester
    {
      public static void main(String[] args)
      {
         CashRegister register = new CashRegister();
    
         register.recordPurchase(30);
         register.recordPurchase(5);
         register.receivePayment(40);
    
         double change = register.giveChange();
    
         System.out.println(change);
         System.out.println("Expected: 5");
      }
    }

    搞定,建议大家处在养成习惯的过程中,最好每个练习都还是按照这个流程走,养成正确的思维和编程习惯后会获益匪浅的。[/success]

About The Author

乐观的无头苍蝇

无论什么情况下,每天都要对自己说:“Guten Morgen!”