feat: testcase in format version 2

This commit is contained in:
debugtalk
2019-06-24 16:09:10 +08:00
parent da166f0c55
commit ec384dc9da
6 changed files with 204 additions and 8 deletions

View File

@@ -1,7 +1,7 @@
__title__ = 'HttpRunner'
__description__ = 'One-stop solution for HTTP(S) testing.'
__url__ = 'https://github.com/HttpRunner/HttpRunner'
__version__ = '2.1.3'
__version__ = '2.2.0'
__author__ = 'debugtalk'
__author_email__ = 'mail@debugtalk.com'
__license__ = 'Apache-2.0'

View File

@@ -442,6 +442,44 @@ def load_testcase(raw_testcase):
}
def load_testcase_v2(raw_testcase):
""" load testcase in version 2.
Args:
raw_testcase (dict): raw testcase content loaded from JSON/YAML file:
{
"config": {
"name": "xxx",
"variables": {}
}
"teststeps": [
{
"name": "teststep 1",
"request" {...}
},
{
"name": "teststep 2",
"request" {...}
},
]
}
Returns:
dict: loaded testcase content
{
"config": {},
"teststeps": [test11, test12]
}
"""
raw_teststeps = raw_testcase.pop("teststeps")
raw_testcase["teststeps"] = [
load_teststep(teststep)
for teststep in raw_teststeps
]
return raw_testcase
def load_testsuite(raw_testsuite):
""" load testsuite with testcase references.
@@ -523,18 +561,27 @@ def load_test_file(path):
loaded_content = load_testsuite(raw_content)
loaded_content["path"] = path
loaded_content["type"] = "testsuite"
elif "teststeps" in raw_content:
# file_type: testcase (format version 2)
loaded_content = load_testcase_v2(raw_content)
loaded_content["path"] = path
loaded_content["type"] = "testcase"
elif "request" in raw_content:
# file_type: api
# TODO: add json schema validation for api
loaded_content = raw_content
loaded_content["path"] = path
loaded_content["type"] = "api"
else:
# invalid format
logger.log_warning("Invalid test file format: {}".format(path))
elif isinstance(raw_content, list) and len(raw_content) > 0:
# file_type: testcase
# make compatible with version < 2.2.0
# TODO: add json schema validation for testcase
loaded_content = load_testcase(raw_content)
loaded_content["path"] = path

View File

@@ -292,13 +292,28 @@ class TestSuiteLoader(unittest.TestCase):
self.assertEqual(loaded_content["request"]["url"], "/api/users/$uid")
def test_load_test_file_testcase(self):
loaded_content = loader.load_test_file("tests/testcases/setup.yml")
self.assertEqual(loaded_content["type"], "testcase")
self.assertIn("path", loaded_content)
self.assertIn("config", loaded_content)
self.assertEqual(loaded_content["config"]["name"], "setup and reset all.")
self.assertIn("teststeps", loaded_content)
self.assertEqual(len(loaded_content["teststeps"]), 2)
for loaded_content in [
loader.load_test_file("tests/testcases/setup.yml"),
loader.load_test_file("tests/testcases/setup.json")
]:
self.assertEqual(loaded_content["type"], "testcase")
self.assertIn("path", loaded_content)
self.assertIn("config", loaded_content)
self.assertEqual(loaded_content["config"]["name"], "setup and reset all.")
self.assertIn("teststeps", loaded_content)
self.assertEqual(len(loaded_content["teststeps"]), 2)
def test_load_test_file_testcase_v2(self):
for loaded_content in [
loader.load_test_file("tests/testcases/setup.v2.yml"),
loader.load_test_file("tests/testcases/setup.v2.json")
]:
self.assertEqual(loaded_content["type"], "testcase")
self.assertIn("path", loaded_content)
self.assertIn("config", loaded_content)
self.assertEqual(loaded_content["config"]["name"], "setup and reset all.")
self.assertIn("teststeps", loaded_content)
self.assertEqual(len(loaded_content["teststeps"]), 2)
def test_load_test_file_testsuite(self):
loaded_content = loader.load_test_file("tests/testsuites/create_users.yml")

View File

@@ -0,0 +1,59 @@
[
{
"config": {
"name": "setup and reset all.",
"output": [
"session_token"
],
"verify": false,
"variables": {
"device_sn": "TESTCASE_SETUP_XXX",
"app_version": "2.8.6",
"os_platform": "ios",
"user_agent": "iOS/10.3"
},
"base_url": "http://127.0.0.1:5000",
"id": "setup_and_reset"
}
},
{
"test": {
"validate": [
{
"eq": [
"status_code",
200
]
},
{
"len_eq": [
"content.token",
16
]
}
],
"api": "api/get_token.yml",
"extract": [
{
"session_token": "content.token"
}
],
"variables": {
"device_sn": "$device_sn",
"app_version": "2.8.6",
"os_platform": "ios",
"user_agent": "iOS/10.3"
},
"name": "get token (setup)"
}
},
{
"test": {
"variables": {
"token": "$session_token"
},
"api": "api/reset_all.yml",
"name": "reset all users"
}
}
]

View File

@@ -0,0 +1,43 @@
{
"config": {
"name": "setup and reset all.",
"base_url": "http://127.0.0.1:5000",
"variables": {
"device_sn": "TESTCASE_SETUP_XXX",
"app_version": "2.8.6",
"os_platform": "ios",
"user_agent": "iOS/10.3"
},
"id": "setup_and_reset",
"verify": false,
"output": [
"session_token"
]
},
"teststeps": [
{
"name": "get token (setup)",
"api": "api/get_token.yml",
"variables": {
"device_sn": "$device_sn",
"app_version": "2.8.6",
"os_platform": "ios",
"user_agent": "iOS/10.3"
},
"extract": [
{"session_token": "content.token"}
],
"validate": [
{"eq": ["status_code", 200]},
{"len_eq": ["content.token", 16]}
]
},
{
"name": "reset all users",
"api": "api/reset_all.yml",
"variables": {
"token": "$session_token"
}
}
]
}

View File

@@ -0,0 +1,32 @@
config:
name: "setup and reset all."
id: setup_and_reset
variables:
user_agent: 'iOS/10.3'
device_sn: "TESTCASE_SETUP_XXX"
os_platform: 'ios'
app_version: '2.8.6'
base_url: "http://127.0.0.1:5000"
verify: False
output:
- session_token
teststeps:
-
name: get token (setup)
api: api/get_token.yml
variables:
user_agent: 'iOS/10.3'
device_sn: $device_sn
os_platform: 'ios'
app_version: '2.8.6'
extract:
- session_token: content.token
validate:
- eq: ["status_code", 200]
- len_eq: ["content.token", 16]
-
name: reset all users
api: api/reset_all.yml
variables:
token: $session_token