Как увеличить балл cobertura - PullRequest
0 голосов
/ 10 декабря 2010

Здравствуйте, друзья! Я здесь новичок. Пожалуйста, не возражайте, если я задам очень простой вопрос.

Я работаю над Spring 3.0 и использую cobertura для проверки покрытия кода.

Хотя все мои тесты были успешными, я не могу получить полное покрытие из-за блоков ошибок.

Может кто-нибудь помочь, как покрыть блоки, отмеченные красным.

Заранее спасибо.

//This Code is For SQL Map of DAO

@SuppressWarnings(ApplicationConstants.UNCHECKED) 
@Override 
public List<ReportListDTO> searchGeneralReport(
        final ReportSearch reportSearch) throws COBException { 
    List<ReportListDTO> generalSearchList; 
    try{ 
        generalSearchList = this.sqlMapClientTemplate.queryForList(
                "cobSQLReportQuery.searchGeneralReport",reportSearch); 
    }catch(DataAccessException dae){ 
        // NOT COVERED BY COBERTURA
        throw new COBException(this.getClass().getName() 
                + "SQL Exception in COB DB Operation",dae);
    } 
    LOGGER.info("TableSize Coming From DB"+generalSearchList.size()); 
    return generalSearchList; 
} 

Может кто-нибудь помочь мне получить покрытие кода для выделенных строк?

//This Code For Controller
@RequestMapping(method = RequestMethod.GET, value = ApplicationConstants.GENERAL_REPORT_SEARCH) 
public ModelAndView searchGeneralReport(
        final @ModelAttribute(ApplicationConstants.GENERAL_REPORT_COMMAND) ReportSearch reportSearch, 
        final BindingResult result) throws COBException { 

    final String[] mainSearchG = StringUtils.split(ApplicationConstants.REPORT_SEARCH_CRITERIA,","); 
    final String[] mainSearchV = StringUtils.split(ApplicationConstants.REPORT_SEARCH_CRITERIA_VALUES,","); 
    final String[] daysOutstanding= StringUtils.split(ApplicationConstants.REPORT_DAYS_OUTSTANDING,","); 
    //Splitting LookUp's 
    final List<LookUpValueBean> lookupSearchG = getLookUpValList(mainSearchG,mainSearchV); 
    final List<LookUpValueBean> daysOutG= getLookUpList(daysOutstanding); 
    final ModelAndView mav = new ModelAndView(); 
    final ReportListDTO reportListDTO= new ReportListDTO(); 
    List<ReportListDTO> reportList= new ArrayList<ReportListDTO>(); 
    mav.addObject("lookupSearchG", lookupSearchG); 
    mav.addObject("daysOutG", daysOutG); 
    mav.addObject(ApplicationConstants.GENERAL_REPORT_COMMAND,reportListDTO); 
    mav.addObject(ApplicationConstants.REPORT_SEARCH_ADD,reportSearch); 
    try{ 
        validator.validate(reportSearch, result); 
        if(reportSearch.getMainSearch().equalsIgnoreCase("CREATED ON")&&!"".equals(reportSearch.getCreatedOnDate())){ 
            reportValidator.validate(reportSearch, result); 
        } 
        if(result.hasErrors()){ 
            // NOT COVERED BY COBERTURA
            mav.addObject("lookupSearchG", lookupSearchG); 
            mav.addObject("daysOutG", daysOutG); 
            mav.setViewName(ApplicationConstants.REPORT_GENERAL_VIEW);         
        } else{ 
            reportList = reportService.searchGeneralReport(reportSearch); 
            mav.addObject("reportList", reportList); 
        } 
    } catch(COBException e){ 
        // not covered
        LOGGER.error(e.getMessage(),e); 
    } 
    mav.setViewName(ApplicationConstants.REPORT_GENERAL_VIEW); 
    return mav; 
} 

Ответы [ 2 ]

2 голосов
/ 10 декабря 2010

Прежде чем углубляться в детали, стоит отметить, что достижение 100% покрытия - не стоящая цель. Вместо этого вы должны стремиться к хорошему освещению кода, который имеет значение. Охват менее важен для участков кода, где вероятность невидимой ошибки мала; например когда код настолько прост, что однократного визуального осмотра будет достаточно *.

(Кроме того, 100% покрытие само по себе не является гарантией адекватного тестирования.)


Первый пример незначительно полезен. Похоже, что исключение будет выдано только в том случае, если ваш SQL неверен или вы намеренно поставили неверную запись. Учитывая природу кода, я бы пропустил этот. (Но если вы действительно хотите, вы можете смоделировать sqlMapClientTemplate с объектом, который дает вам плохой SQL ... например.)

Второй пример заслуживает внимания. Вы должны быть в состоянии вызвать его, передав reportSearch, который не проходит одну из проверок.

Третий пример не стоит освещать. Вы можете сказать, что код правильный путем проверки. (Но внедрение плохого SQL, как в первом примере, должно работать.)


* В этом аргументе есть недостаток. Кто-то может заменить некоторые непроверенные строки, которые «очевидно правильны», на другие, которые не являются верными. Поэтому я думаю, что должен быть инструмент проверки кода, который можно использовать для «проверки» непроверенных разделов кода ... и уведомления об изменении кода с момента последней проверки.

0 голосов
/ 10 декабря 2010

По сути, вы хотите использовать макеты в своих модульных тестах для имитации этих исключительных случаев.

Чтобы проверить первый бит кода

В своем модульном тесте введите макет sqlMapClientTemplate который выбрасывает DataAccessException, когда вызывается queryForList.Ваш тест должен проверить, что COBException в этом случае

Для проверки второго бита кода

Два новых теста

  • Передать BindingResult, который возвращаетtrue для hasErrors(), а затем убедитесь, что в ModelAndView есть то, что вы ожидаете
  • Внедрите макет reportSearch, который генерирует COBException.Не знаю, как проверить, что случилось, чтобы утверждать что-то, но вы можете получить покрытие таким образом.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...