2015-04-10 2 views
0

Для поддержки будущих изменений в REST API, которые позволяют запрашивать базу данных с использованием/конечной точки запроса и используют JSON в качестве формата данных для ввода-вывода, начинающего записывать тестовые примеры.Графический блок записи/интеграционный тест Grails для SQL-инъекций

Мои конфиги являются: -

  1. Grails 2.3.8
  2. рамках тестирования Спок

Я обеспокоен, если есть хорошая поддержка со стороны Спока для написания тестов для инъекций SQL проверки и до уровня, который он может сделать.

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

1st run : /api/users/query 
2nd run : /api/group/query 
3rd run : /api/users/query 
. 
. 
nth time : /api/specs/query 

Таким образом, область выбрана должна быть разной каждый раз. У нас может быть сформировано какое-то случайное число, которое может быть использовано для определения конечной точки домена с карты или списка URL-адресов конечных точек запроса для всех доменов.

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

ответ

1

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

Если вы не используете пользовательские urlmappings, вы можете перебирать все классы контроллеров и получать свои действия. Но поскольку у вас есть отдых api, я предполагаю, что у вас есть пользовательские сопоставления, определенные в файле URLMappings.groovy. В этом случае с помощью UrlMappingsArtefactHandler вы можете получить артефакты отображения url. Код для этого будет:

import org.codehaus.groovy.grails.commons.UrlMappingsArtefactHandler 
import org.codehaus.groovy.grails.web.mapping.DefaultUrlMappingEvaluator 
import org.codehaus.groovy.grails.web.mapping.UrlMapping 
import org.springframework.mock.web.MockServletContext 

private List<UrlMapping> getAllURLMappings(){ 
    ClassLoader classLoader = this.class.classLoader 
    def mappings = grailsApplication.getArtefacts(UrlMappingsArtefactHandler.TYPE) 

    MockServletContext mctx = classLoader.loadClass('org.springframework.mock.web.MockServletContext').newInstance() 
    DefaultUrlMappingEvaluator evaluator = classLoader.loadClass("org.codehaus.groovy.grails.web.mapping.DefaultUrlMappingEvaluator").newInstance(mctx) 
    List<UrlMapping> allMappings = [] 

    List<UrlMapping> grailsClassMappings 
    for (mapping in mappings) { 
     if (Script.isAssignableFrom(mapping.getClazz())) { 
      grailsClassMappings = evaluator.evaluateMappings(mapping.getClazz()) 
     } else { 
      grailsClassMappings = evaluator.evaluateMappings(mapping.getMappingsClosure()) 
     } 
     allMappings.addAll(grailsClassMappings) 
    } 
    return allMappings 
} 

Тогда для извлечения URL шаблонов для конкретных действий от всех отображений можно перебирать не результат, возвращенный из выше метода с использованием ниже методы:

private List<String> getMappingForAction(List<UrlMapping> mappings, String action){ 
    return mappings.findAll { 
     UrlMapping mapping -> 
      return mapping.actionName.equals(action) 
    }*.urlData.urlPattern 
} 

И с помощью Java. util.Random класс вы можете получить случайную конечную точку каждый раз:

List<UrlMapping> allMappings = getAllURLMappings() 
List<String> mappings = getMappingForAction(allMappings, "query") 

int size = mappings.size() 

Random r = new Random() 
int index = r.nextInt(size - 0) 

println mappings[index] 
0

Если вы хотите запустить тот же тест с рядом параметров, которые меняются от одного теста к следующему, используя Spock, вам следует рассмотреть возможность использования parameterization с использованием Spock where blocks.

Пример, показанный ниже, из документации Spock, но вы можете легко изменить этот параметр как массив конечных точек, которые вы хотите протестировать.

def "computing the maximum of two numbers"() { 
    expect: 
    Math.max(a, b) == c 

    where: 
    a << [5, 3] 
    b << [1, 9] 
    c << [5, 9] 
} 
+0

Нет, я сказал randomly.In, где блок, мы знаем, какие параметры мы specified.It должно быть сделано, как генерировать случайное число и смотреть карту или список URL-адресов/ресурсов/запросов и запуск тестового примера для этого URL-адреса. Итак, сегодня у меня есть 20 таких URL-адресов, которые могут увеличиться до 50 раз. Мне нужно общее решение для этого в споке. –

+1

Что происходит, когда массивы для 'a',' b' и 'c' не определены в тесте, но создаются с помощью функции? то есть 'a << methodThatReturnsArrayOfParameters()'? – John