[英]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.