簡體   English   中英

用於SQL注入的Grails Spock編寫單元/集成測試用例

[英]Grails Spock writing unit / integration test case for SQL injections

為了支持REST API的將來更改,該更改允許使用/ query端點查詢數據庫並使用JSON作為I / O的數據格式,從而開始記錄測試用例。

我的配置是:-

  1. Grails 2.3.8
  2. Spock測試框架

我擔心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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM