0

作为练习,我需要学习编写以下课程的测试:

打包银行账户;

public class CurrentAccount {

        int account[];
        int lastMove;

        CurrentAccount() {
            lastMove = 0;
            account = new int[10];
        }

        public void deposit(int value) {
            account[lastMove] = value;
            lastMove++;
        }

        public void draw(int value) {
            account[lastMove] = value;
            lastMove++;
        }

    public int settlement() {
           int result = 0;
           for (int i=0; i<account.length; i++) {
                  result = result + account[i];
               }
               return result;
         }


        public static void main(String args[]) {
                 CurrentAccount c = new CurrentAccount();
                  c.deposit(10);
        }
    }

我对单元测试比较陌生,很多教程只是简单地介绍了如何对简单的数学运算符(例如加法、减法等)进行测试。任何人都可以推荐好的资源来对更复杂的功能进行单元测试吗?我最好使用

http://junit.sourceforge.net/javadoc/org/junit/Assert.html

并从那里工作?

4

1 回答 1

1

您应该针对对象的规范进行测试,例如

  1. 什么是起始余额?
  2. 我加 10 英镑后的余额是多少?
  3. 我可以透支吗?

等等。以上所有内容都应该在编写类之前指定(否则,你怎么知道要写什么?)

我将为这些场景中的每一个创建一个测试方法,执行设置和操作,然后使用一个(或多个,如果需要)asserts来确定一切都很好。不要忘记,在某些情况下,您可能正在测试是否引发了异常,因此您需要检查控制流是否中断。那不会用assert

这是一个可能的示例(省略导入等)

public void testBalanceAfterTenPoundDeposit() {
   // note the interface/impl separation so I can test different
   // implementations with the same interface (this is Test By Contract)
   CurrentAccount ca = new CurrentAccountImpl();

   // check the starting balance
   Assert.assertEquals(ca.settlement(), 0);

   // deposit
   ca.deposit(10);

   // do I have £10 ?
   Assert.assertEquals(ca.settlement(), 10);
}

重要的是要注意,这种测试应该真正关注作为黑盒的组件(单元)。也就是说,测试实际上应该与实现无关,并且您不会显式测试数组实现。我应该能够插入我自己的实现(或重写你的实现)并且测试应该保持工作(这是回归测试的原则)。

话虽如此,如果您知道实现的明显限制(例如,您的固定大小数组),您应该尝试强调(例如,在这种情况下,执行 11 次插入)

于 2013-03-06T10:34:47.630 回答