SpringCloud 要求
2023-12-12 18:05 更新
HTTP协议只需要在请求中指定方法和URL。合同的请求定义中必须包含相同的信息。
Groovy DSL。
org.springframework.cloud.contract.spec.Contract.make { request { // HTTP request method (GET/POST/PUT/DELETE). method 'GET' // Path component of request URL is specified as follows. urlPath('/users') } response { //... status 200 } }
YAML。
method: PUT url: /foo
可以指定一个绝对值而不是相对值url
,但是建议使用urlPath
,因为这样做会使测试独立于主机。
Groovy DSL。
org.springframework.cloud.contract.spec.Contract.make { request { method 'GET' // Specifying `url` and `urlPath` in one contract is illegal. url('http://localhost:8888/users') } response { //... status 200 } }
YAML。
request: method: PUT urlPath: /foo
request
可能包含查询参数。
Groovy DSL。
org.springframework.cloud.contract.spec.Contract.make { request { //... method GET() urlPath('/users') { // Each parameter is specified in form // `'paramName' : paramValue` where parameter value // may be a simple literal or one of matcher functions, // all of which are used in this example. queryParameters { // If a simple literal is used as value // default matcher function is used (equalTo) parameter 'limit': 100 // `equalTo` function simply compares passed value // using identity operator (==). parameter 'filter': equalTo("email") // `containing` function matches strings // that contains passed substring. parameter 'gender': value(consumer(containing("[mf]")), producer('mf')) // `matching` function tests parameter // against passed regular expression. parameter 'offset': value(consumer(matching("[0-9]+")), producer(123)) // `notMatching` functions tests if parameter // does not match passed regular expression. parameter 'loginStartsWith': value(consumer(notMatching(".{0,2}")), producer(3)) } } //... } response { //... status 200 } }
YAML。
request: ... queryParameters: a: b b: c headers: foo: bar fooReq: baz cookies: foo: bar fooReq: baz body: foo: bar matchers: body: - path: $.foo type: by_regex value: bar headers: - key: foo regex: bar response: status: 200 fixedDelayMilliseconds: 1000 headers: foo2: bar foo3: foo33 fooRes: baz body: foo2: bar foo3: baz nullValue: null matchers: body: - path: $.foo2 type: by_regex value: bar - path: $.foo3 type: by_command value: executeMe($it) - path: $.nullValue type: by_null value: null headers: - key: foo2 regex: bar - key: foo3 command: andMeToo($it) cookies: - key: foo2 regex: bar - key: foo3 predefined:
request
可能包含其他请求标头,如以下示例所示:
Groovy DSL。
org.springframework.cloud.contract.spec.Contract.make { request { //... method GET() url "/foo" // Each header is added in form `'Header-Name' : 'Header-Value'`. // there are also some helper methods headers { header 'key': 'value' contentType(applicationJson()) } //... } response { //... status 200 } }
YAML。
request: ... headers: foo: bar fooReq: baz
request
可能包含其他请求cookie,如以下示例所示:
Groovy DSL。
org.springframework.cloud.contract.spec.Contract.make { request { //... method GET() url "/foo" // Each Cookies is added in form `'Cookie-Key' : 'Cookie-Value'`. // there are also some helper methods cookies { cookie 'key': 'value' cookie('another_key', 'another_value') } //... } response { //... status 200 } }
YAML。
request: ... cookies: foo: bar fooReq: baz
request
可能包含一个请求正文:
Groovy DSL。
org.springframework.cloud.contract.spec.Contract.make { request { //... method GET() url "/foo" // Currently only JSON format of request body is supported. // Format will be determined from a header or body's content. body '''{ "login" : "john", "name": "John The Contract" }''' } response { //... status 200 } }
YAML。
request: ... body: foo: bar
request
可能包含多部分元素。要包含多部分元素,请使用multipart
方法/部分,如以下示例所示
Groovy DSL。
YAML。
request: method: PUT url: /multipart headers: Content-Type: multipart/form-data;boundary=AaB03x multipart: params: # key (parameter name), value (parameter value) pair formParameter: '"formParameterValue"' someBooleanParameter: true named: - paramName: file fileName: filename.csv fileContent: file content matchers: multipart: params: - key: formParameter regex: ".+" - key: someBooleanParameter predefined: any_boolean named: - paramName: file fileName: predefined: non_empty fileContent: predefined: non_empty response: status: 200
在前面的示例中,我们以两种方式之一定义参数:
Groovy DSL
- 直接使用映射符号,其中值可以是动态属性(例如
formParameter: $(consumer(…), producer(…))
)。 - 通过使用允许您设置命名参数的
named(…)
方法。命名参数可以设置name
和content
。您可以通过带有两个参数的方法(例如,named("fileName", "fileContent")
)或通过映射表示法(例如,named(name: "fileName", content: "fileContent")
)来调用它。
YAML
- 通过
multipart.params
部分设置多部分参数 - 可以通过
multipart.named
部分设置命名参数(给定参数名称的fileName
和fileContent
)。该部分包含paramName
(参数名称),fileName
(文件名称),fileContent
(文件内容)字段 可以通过
matchers.multipart
部分设置动态位- 对于参数,请使用
params
部分,该部分可以接受regex
或predefined
正则表达式 - 对于命名参数,请使用
named
部分,其中首先通过paramName
定义参数名称,然后可以通过regex
或{12 /传递fileName
或fileContent
的参数化} 正则表达式
- 对于参数,请使用
根据该合同,生成的测试如下:
// given: MockMvcRequestSpecification request = given() .header("Content-Type", "multipart/form-data;boundary=AaB03x") .param("formParameter", "\"formParameterValue\"") .param("someBooleanParameter", "true") .multiPart("file", "filename.csv", "file content".getBytes()); // when: ResponseOptions response = given().spec(request) .put("/multipart"); // then: assertThat(response.statusCode()).isEqualTo(200);
WireMock存根如下:
''' { "request" : { "url" : "/multipart", "method" : "PUT", "headers" : { "Content-Type" : { "matches" : "multipart/form-data;boundary=AaB03x.*" } }, "bodyPatterns" : [ { "matches" : ".*--(.*)\\r\\nContent-Disposition: form-data; name=\\"formParameter\\"\\r\\n(Content-Type: .*\\r\\n)?(Content-Transfer-Encoding: .*\\r\\n)?(Content-Length: \\\\d+\\r\\n)?\\r\\n\\".+\\"\\r\\n--\\\\1.*" }, { "matches" : ".*--(.*)\\r\\nContent-Disposition: form-data; name=\\"someBooleanParameter\\"\\r\\n(Content-Type: .*\\r\\n)?(Content-Transfer-Encoding: .*\\r\\n)?(Content-Length: \\\\d+\\r\\n)?\\r\\n(true|false)\\r\\n--\\\\1.*" }, { "matches" : ".*--(.*)\\r\\nContent-Disposition: form-data; name=\\"file\\"; filename=\\"[\\\\S\\\\s]+\\"\\r\\n(Content-Type: .*\\r\\n)?(Content-Transfer-Encoding: .*\\r\\n)?(Content-Length: \\\\d+\\r\\n)?\\r\\n[\\\\S\\\\s]+\\r\\n--\\\\1.*" } ] }, "response" : { "status" : 200, "transformers" : [ "response-template", "foo-transformer" ] } } '''
以上内容是否对您有帮助:
更多建议: