2013-03-06 4 views
0

В качестве упражнения, мне нужно, чтобы научиться писать тесты на следующий класс:Ресурсы для JUnit тестирования класса

пакета ВагЛАссоипЬ;

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

и работать оттуда?

ответ

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 вставок)

+0

OK. Предположительно, начальный баланс будет указан как плавающий? Куда он пойдет в коде? Было бы правильно в начале? Если вы перейдете, я бы предпочел, чтобы он сделал System.out.println, отображая сообщение об ошибке, когда общий баланс опускается ниже 0? –

+0

Это проблемы дизайна, а не проблемы с тестированием. Я отмечаю, что вы храните транзакции и получаете баланс через метод расчета(), поэтому у вас нет * * начального баланса, кроме начального значения в методе расчета(). Что вы делаете, если перейдете? Это проблема спецификации. Вы можете сделать исключение. Или выпустите предупреждение. Или просто согласитесь с ним, и у вас есть другие учетные записи мониторинга процесса с балансом ave. –

+0

Большое спасибо. Вы можете написать образец теста для тестирования массива (например, одного расчетного), чтобы помочь мне провести тестирование массива вокруг головы? –

Смежные вопросы