[英]Grails Spock writing unit / integration test case for SQL injections
为了支持REST API的将来更改,该更改允许使用/ query端点查询数据库并使用JSON作为I / O的数据格式,从而开始记录测试用例。
我的配置是:-
我担心Spock是否能为编写用于SQL注入验证的测试用例提供良好的支持,以及它可以达到何种通用级别。
当我们说泛型时,它意味着它每次运行都应该到达不同的端点。 例如,
1st run : /api/users/query
2nd run : /api/group/query
3rd run : /api/users/query
.
.
nth time : /api/specs/query
因此,每次选择的域都必须不同。 我们可以生成一些随机数,该随机数可用于从所有域的地图或查询端点URL列表中识别域端点。
但是我想到的下一个想法是,是否有另一个测试用例可以调用这些测试用例(在每次运行中检查不同端点的SQL注入)指定次数,以进一步,更准确地进行测试。
为了每次都能到达不同的端点,您可以创建一个URLMappings列表,并且每次可以从列表中获取一个随机控制器。
如果您不使用自定义urlmappings,则可以遍历所有控制器类并获取其操作。 但是,当您拥有一个URLMappings.groovy
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
}
然后,要从所有映射中获取特定操作的网址格式,您可以使用以下方法遍历从上述方法返回的结果:
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]
如果您想使用一系列参数运行相同的测试,这些参数会使用Spock从一个测试执行更改为另一个测试执行,那么您应该考虑使用使用Spock where块的 参数化 。
下面显示的示例来自Spock文档,但是您可以轻松地将参数更改为要测试的端点数组。
def "computing the maximum of two numbers"() {
expect:
Math.max(a, b) == c
where:
a << [5, 3]
b << [1, 9]
c << [5, 9]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.