feat: support to generator Python code from a HTTP testCase
This commit is contained in:
parent
02dd80fee0
commit
e9974374b1
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2023 API Testing Authors.
|
Copyright 2024 API Testing Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
@ -63,6 +63,12 @@ func TestGenerators(t *testing.T) {
|
||||||
assert.Equal(t, expectedJavaCode, result)
|
assert.Equal(t, expectedJavaCode, result)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("python", func(t *testing.T) {
|
||||||
|
result, err := generator.GetCodeGenerator("python").Generate(nil, testcase)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, expectedPythonCode, result)
|
||||||
|
})
|
||||||
|
|
||||||
formRequest := &atest.TestCase{Request: testcase.Request}
|
formRequest := &atest.TestCase{Request: testcase.Request}
|
||||||
formRequest.Request.Form = map[string]string{
|
formRequest.Request.Form = map[string]string{
|
||||||
"key": "value",
|
"key": "value",
|
||||||
|
@ -79,6 +85,12 @@ func TestGenerators(t *testing.T) {
|
||||||
assert.Equal(t, expectedFormRequestJavaCode, result, result)
|
assert.Equal(t, expectedFormRequestJavaCode, result, result)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("python form HTTP request", func(t *testing.T) {
|
||||||
|
result, err := generator.GetCodeGenerator("python").Generate(nil, formRequest)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, expectedFormRequestPythonCode, result, result)
|
||||||
|
})
|
||||||
|
|
||||||
cookieRequest := &atest.TestCase{Request: formRequest.Request}
|
cookieRequest := &atest.TestCase{Request: formRequest.Request}
|
||||||
cookieRequest.Request.Cookie = map[string]string{
|
cookieRequest.Request.Cookie = map[string]string{
|
||||||
"name": "value",
|
"name": "value",
|
||||||
|
@ -95,6 +107,12 @@ func TestGenerators(t *testing.T) {
|
||||||
assert.Equal(t, expectedCookieRequestJavaCode, result, result)
|
assert.Equal(t, expectedCookieRequestJavaCode, result, result)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("python cookie HTTP request", func(t *testing.T) {
|
||||||
|
result, err := generator.GetCodeGenerator("python").Generate(nil, cookieRequest)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, expectedCookieRequestPythonCode, result, result)
|
||||||
|
})
|
||||||
|
|
||||||
bodyRequest := &atest.TestCase{Request: testcase.Request}
|
bodyRequest := &atest.TestCase{Request: testcase.Request}
|
||||||
bodyRequest.Request.Body.Value = `{"key": "value"}`
|
bodyRequest.Request.Body.Value = `{"key": "value"}`
|
||||||
|
|
||||||
|
@ -123,5 +141,14 @@ var expectedCookieRequestGoCode string
|
||||||
//go:embed testdata/expected_java_cookie_request_code.txt
|
//go:embed testdata/expected_java_cookie_request_code.txt
|
||||||
var expectedCookieRequestJavaCode string
|
var expectedCookieRequestJavaCode string
|
||||||
|
|
||||||
|
//go:embed testdata/expected_python_code.txt
|
||||||
|
var expectedPythonCode string
|
||||||
|
|
||||||
|
//go:embed testdata/expected_python_form_request_code.txt
|
||||||
|
var expectedFormRequestPythonCode string
|
||||||
|
|
||||||
|
//go:embed testdata/expected_python_cookie_request_code.txt
|
||||||
|
var expectedCookieRequestPythonCode string
|
||||||
|
|
||||||
//go:embed testdata/expected_go_body_request_code.txt
|
//go:embed testdata/expected_go_body_request_code.txt
|
||||||
var expectedBodyRequestGoCode string
|
var expectedBodyRequestGoCode string
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
Copyright 2024 API Testing Authors.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
import io
|
||||||
|
import requests
|
||||||
|
from urllib.parse import urlencode
|
||||||
|
|
||||||
|
def main():
|
||||||
|
{{- if gt (len .Request.Form) 0 }}
|
||||||
|
data = {}
|
||||||
|
{{- range $key, $val := .Request.Form}}
|
||||||
|
data["{{$key}}"] = "{{$val}}"
|
||||||
|
encoded_data = urlencode(data)
|
||||||
|
{{- end}}
|
||||||
|
body = io.BytesIO(encoded_data.encode("utf-8"))
|
||||||
|
{{- else}}
|
||||||
|
body = io.BytesIO(b"{{.Request.Body.String}}")
|
||||||
|
{{- end}}
|
||||||
|
{{- range $key, $val := .Request.Header}}
|
||||||
|
headers = {"{{$key}}": "{{$val}}"}
|
||||||
|
{{- end}}
|
||||||
|
{{- if gt (len .Request.Cookie) 0 }}
|
||||||
|
{{- range $key, $val := .Request.Cookie}}
|
||||||
|
cookies = {"{{$key}}": "{{$val}}"}
|
||||||
|
{{- end}}
|
||||||
|
{{- end}}
|
||||||
|
{{- if gt (len .Request.Cookie) 0 }}
|
||||||
|
try:
|
||||||
|
req = requests.Request("{{.Request.Method}}", "{{.Request.API}}", headers=headers, cookies=cookies, data=body)
|
||||||
|
except requests.RequestException as e:
|
||||||
|
raise e
|
||||||
|
{{- else}}
|
||||||
|
try:
|
||||||
|
req = requests.Request("{{.Request.Method}}", "{{.Request.API}}", headers=headers, data=body)
|
||||||
|
except requests.RequestException as e:
|
||||||
|
raise e
|
||||||
|
{{- end}}
|
||||||
|
|
||||||
|
resp = requests.Session().send(req.prepare())
|
||||||
|
if resp.status_code != 200:
|
||||||
|
raise Exception("status code is not 200")
|
||||||
|
|
||||||
|
data = resp.content
|
||||||
|
print(data.decode("utf-8"))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
Copyright 2024 API Testing Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
package generator
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"html/template"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
_ "embed"
|
||||||
|
|
||||||
|
"github.com/linuxsuren/api-testing/pkg/testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
type pythonGenerator struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewPythonGenerator() CodeGenerator {
|
||||||
|
return &pythonGenerator{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *pythonGenerator) Generate(testSuite *testing.TestSuite, testcase *testing.TestCase) (result string, err error) {
|
||||||
|
if testcase.Request.Method == "" {
|
||||||
|
testcase.Request.Method = http.MethodGet
|
||||||
|
}
|
||||||
|
var tpl *template.Template
|
||||||
|
if tpl, err = template.New("python template").Parse(pythonTemplate); err == nil {
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
if err = tpl.Execute(buf, testcase); err == nil {
|
||||||
|
result = buf.String()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
RegisterCodeGenerator("python", NewPythonGenerator())
|
||||||
|
}
|
||||||
|
|
||||||
|
//go:embed data/main.python.tpl
|
||||||
|
var pythonTemplate string
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
Copyright 2024 API Testing Authors.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
import io
|
||||||
|
import requests
|
||||||
|
from urllib.parse import urlencode
|
||||||
|
|
||||||
|
def main():
|
||||||
|
body = io.BytesIO(b"")
|
||||||
|
headers = {"User-Agent": "atest"}
|
||||||
|
try:
|
||||||
|
req = requests.Request("GET", "https://www.baidu.com", headers=headers, data=body)
|
||||||
|
except requests.RequestException as e:
|
||||||
|
raise e
|
||||||
|
|
||||||
|
resp = requests.Session().send(req.prepare())
|
||||||
|
if resp.status_code != 200:
|
||||||
|
raise Exception("status code is not 200")
|
||||||
|
|
||||||
|
data = resp.content
|
||||||
|
print(data.decode("utf-8"))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
Copyright 2024 API Testing Authors.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
import io
|
||||||
|
import requests
|
||||||
|
from urllib.parse import urlencode
|
||||||
|
|
||||||
|
def main():
|
||||||
|
data = {}
|
||||||
|
data["key"] = "value"
|
||||||
|
encoded_data = urlencode(data)
|
||||||
|
body = io.BytesIO(encoded_data.encode("utf-8"))
|
||||||
|
headers = {"User-Agent": "atest"}
|
||||||
|
cookies = {"name": "value"}
|
||||||
|
try:
|
||||||
|
req = requests.Request("GET", "https://www.baidu.com", headers=headers, cookies=cookies, data=body)
|
||||||
|
except requests.RequestException as e:
|
||||||
|
raise e
|
||||||
|
|
||||||
|
resp = requests.Session().send(req.prepare())
|
||||||
|
if resp.status_code != 200:
|
||||||
|
raise Exception("status code is not 200")
|
||||||
|
|
||||||
|
data = resp.content
|
||||||
|
print(data.decode("utf-8"))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
Copyright 2024 API Testing Authors.
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
import io
|
||||||
|
import requests
|
||||||
|
from urllib.parse import urlencode
|
||||||
|
|
||||||
|
def main():
|
||||||
|
data = {}
|
||||||
|
data["key"] = "value"
|
||||||
|
encoded_data = urlencode(data)
|
||||||
|
body = io.BytesIO(encoded_data.encode("utf-8"))
|
||||||
|
headers = {"User-Agent": "atest"}
|
||||||
|
try:
|
||||||
|
req = requests.Request("GET", "https://www.baidu.com", headers=headers, data=body)
|
||||||
|
except requests.RequestException as e:
|
||||||
|
raise e
|
||||||
|
|
||||||
|
resp = requests.Session().send(req.prepare())
|
||||||
|
if resp.status_code != 200:
|
||||||
|
raise Exception("status code is not 200")
|
||||||
|
|
||||||
|
data = resp.content
|
||||||
|
print(data.decode("utf-8"))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright 2023 API Testing Authors.
|
Copyright 2024 API Testing Authors.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
|
@ -593,7 +593,7 @@ func TestCodeGenerator(t *testing.T) {
|
||||||
t.Run("ListCodeGenerator", func(t *testing.T) {
|
t.Run("ListCodeGenerator", func(t *testing.T) {
|
||||||
generators, err := server.ListCodeGenerator(ctx, &Empty{})
|
generators, err := server.ListCodeGenerator(ctx, &Empty{})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, 4, len(generators.Data))
|
assert.Equal(t, 5, len(generators.Data))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("GenerateCode, no generator found", func(t *testing.T) {
|
t.Run("GenerateCode, no generator found", func(t *testing.T) {
|
||||||
|
|
Loading…
Reference in New Issue