нужны предложения по началу работы с Junit

Я не использовал Junit раньше и не проводил модульное тестирование автоматически.

Сценарий: Мы меняем наш бэкэнд DAO 'с сервера SQL на Oracle. Таким образом, на стороне БД все хранимые процедуры были преобразованы в Oracle. Теперь, когда наш код вызывает эти хранимые процедуры Oracle, мы хотим убедиться, что возвращаемые данные такие же, как и в хранимых процедурах SQL Server.

Так, например, у меня есть следующий метод в DAO:

  //this is old method. gets data from sql server
  public IdentifierBean getHeadIdentifiers_old(String head){
      HashMap parmMap = new HashMap();
      parmMap.put("head", head);
      List result = getSqlMapClientTemplate().queryForList("Income.getIdentifiers", parmMap);
      return (IdentifierBean)result.get(0);
   }
  //this is new method. gets data from Oracle  
  public IdentifierBean getHeadIdentifiers(String head){
      HashMap parmMap = new HashMap();
      parmMap.put("head", head);
      getSqlMapClientTemplate().queryForObject("Income.getIdentifiers", parmMap);
      return (IdentifierBean)((List)parmMap.get("Result0")).get(0);
   }

Теперь я хочу написать тестовый метод Junit, который будет сначала вызыватьgetHeadIdentifiers_old а потомgetHeadIdentifiers и будет сравнивать возвращаемый объект (придется перезаписать равно и хэш вIdentifierBean). Тест пройдет только тогда, когда оба объекта одинаковы.

В методе тестера мне нужно будет предоставить параметр (в данном случае заголовок) для двух методов ... пока это будет сделано вручную. Да, параметры внешнего интерфейса могут отличаться, и SP могут не возвращать точные результаты для этих параметров. Но я думаю, что наличие этих тестов даст нам некоторое облегчение, что они возвращают одни и те же данные ...

Мои вопросы:

Это хороший подход?Я буду иметь несколько DAO 's. Должен ли я написать методы тестирования внутри самого DAO или для каждого DAO у меня должен быть отдельный класс тестирования JUnit?(может быть, вопрос n00b) все тесты будут запускаться автоматически? Я не хочу переходить на внешний интерфейс, чтобы вызывать DAO.Когда тесты пройдут, я узнаю, какие методы провалились? и для тех, кто потерпел неудачу, это скажет мне метод испытания, который потерпел неудачу?наконец, есть ли хорошие отправные точки? любые учебники, статьи, которые показывают работу с Junit

Ответы на вопрос(4)

Решение Вопроса

напишу тестовый класс.

public class OracleMatchesSqlServer extends TestCase {
    public void testHeadIdentifiersShouldBeEqual() throws Exception {
        String head = "whatever your head should be";
        IdentifierBean originalBean = YourClass.getHeadIdentifiers_old(head);
        IdentifierBean oracleBean = YourClass.getHeadIdentifiers(head);
        assertEquals(originalBean, oracleBean);
    }
}

Вы можете найти, что вам нужно параметризовать это на голове; тот'Это просто.

ОбновитьВыглядит так:

public class OracleMatchesSqlServer extends TestCase {
    public void testHeadIdentifiersShouldBeEqual() throws Exception {
        compareIdentifiersWithHead("head1");
        compareIdentifiersWithHead("head2");
        compareIdentifiersWithHead("etc");
    }
    private static void compareIdentifiersWithHead(String head) {
        IdentifierBean originalBean = YourClass.getHeadIdentifiers_old(head);
        IdentifierBean oracleBean = YourClass.getHeadIdentifiers(head);
        assertEquals(originalBean, oracleBean);
    }
}
* Is this a good approach?

Конечно.

* I will have multiple DAOs. Do I write the test methods inside the DAO
  itself or for each DAO I should have a separate JUnit Test Class?

Попробуйте это с отдельным классом тестирования для каждого DAO; если это становится слишком утомительным, попробуйте другой способ и посмотрите, что вам больше нравится. Это'Возможно, более полезно иметь мелкозернистость отдельных тестовых классов, но ваш пробег может варьироваться.

* (might be n00b question) will all the test cases be run automatically?
  I do not want to go to the front end click bunch of stuff so that call
  to the DAO gets triggered.

В зависимости от вашей среды, будут способы автоматического запуска всех тестов.

* when tests are ran will I find out which methods failed? 
  and for the ones failed will it tell me the test method that failed?

Да и да.

* lastly, any good starting points? any tutorials, articles that
  show working with Junit

Мне очень нравится Дейв Астелс книга.

 Carl Manaster06 нояб. 2009 г., 23:47
Если вы хотите проверить несколько значенийголова" переменная, то вы можете передать его в функцию ... I 'Я обновлю ответ, чтобы продемонстрировать.
 Omnipresent06 нояб. 2009 г., 22:25
Благодарю. Что ты хочешь этим сказать - "Вы можете найти, что вам нужно параметризовать это на голове; тот'просто ".

ульных тестов может быть эта книга (которая частично доступна онлайн):

Тестовые шаблоны XUnit, Рефакторинг тестового кода от Gerard Meszaros

Книга состоит из 3 основных частей. Часть I состоит из серии вводных описаний, описывающих некоторые аспекты автоматизации тестирования с использованием xUnit. Часть II описывает рядтестовые запахи " это симптомы проблем с тем, как мы автоматизируем наши тесты. Часть III содержит описания моделей.

Это хороший подход?

На самом деле, нет. Поскольку вместо одного устаревшего пути кода с несколько известной функциональностью, теперь у вас есть два пути кода с неравной и непредсказуемой функциональностью. Обычно сначала нужно создать тщательные модульные тесты для унаследованного кода, а затем провести рефакторинг исходного метода, чтобы избежать невероятно большого количества рефакторинга - что если какая-то часть ваших джунглей кодов, образующих огромное приложение, продолжает вызывать другой метод, тогда как другие части вызывают новый?

Однако работа с устаревшим кодом никогда не бывает оптимальной, так чтопереосмысление может быть лучшим решением.

Я буду иметь несколько DAO 's. Должен ли я написать методы тестирования внутри самого DAO или для каждого DAO у меня должен быть отдельный класс тестирования JUnit?

Предполагая, что выу вас все в порядке с вашей структурой программы, где каждый класс выполняет одно и только одно, да, вы должны создать другой класс, содержащий контрольные примеры для этого отдельного класса. Что ты'Здесь ищутся фиктивные объекты (ищите их в SO и Google в целом, доступно много информации), которые помогут вам отделить тестируемый класс от других классов. Интересно, что большое количество насмешек в юнит-тестах обычно означает, что ваш класс может использовать какой-то тяжелый рефакторинг

(может быть, вопрос n00b) все тесты будут запускаться автоматически? Я не хочу переходить на внешний интерфейс, чтобы вызывать DAO.

Все IDE позволяют запускать все тесты JUnit одновременно, например, в Eclipse просто щелкните исходную папку / верхний пакет и выберите «Выполнить» -> Тест джунит. Также при запуске отдельного класса все содержащиеся в нем модульные тесты выполняются в правильном потоке JUnit (->setup()  ->testX() tearDown()).

Когда тесты пройдут, я узнаю, какие методы провалились? и для тех, кто потерпел неудачу, это скажет мне метод испытания, который потерпел неудачу?

Да, частью Test Driven Development является мантра Red-Green-Refactor, которая относится к цветной полосе, показанной IDE: s для модульных тестов. В основном, если какой-либо из тестов в наборе тестов не пройден, полоса красного цвета, если все прошло, она 'зеленый. Дополнительно для Юнит естьs также синий для отдельных тестов, чтобы показать ошибки утверждения.

наконец, есть ли хорошие отправные точки? любые учебники, статьи, которые показывают работу с JunitI '

я совершенно уверен, чтоскоро будет много таких ответов, просто подожди :)

 Omnipresent06 нояб. 2009 г., 22:27
Благодарю. после всех испытаний пройти. Я планировал удалить методы с суффиксом '_OLD», и будет ждать ресурсов. взволнован, наконец, получить модульный тест :)

Ваш ответ на вопрос