Merge pull request #351 from HttpRunner/project_structure

refactor project structure
This commit is contained in:
debugtalk
2018-08-23 16:20:27 +08:00
committed by GitHub
15 changed files with 113 additions and 148 deletions

1
.gitignore vendored
View File

@@ -12,4 +12,3 @@ logs/%
.coverage .coverage
locustfile.py locustfile.py
site/ site/
.env

View File

@@ -18,7 +18,6 @@ class HttpRunner(object):
resultclass (class): HtmlTestResult or TextTestResult resultclass (class): HtmlTestResult or TextTestResult
failfast (bool): False/True, stop the test run on the first error or failure. failfast (bool): False/True, stop the test run on the first error or failure.
dot_env_path (str): .env file path.
http_client_session (instance): requests.Session(), or locust.client.Session() instance. http_client_session (instance): requests.Session(), or locust.client.Session() instance.
Attributes: Attributes:
@@ -37,26 +36,6 @@ class HttpRunner(object):
self.kwargs = kwargs self.kwargs = kwargs
self.http_client_session = self.kwargs.pop("http_client_session", None) self.http_client_session = self.kwargs.pop("http_client_session", None)
self.__loader()
def __loader(self):
""" load project dependent files, including api/testcase definitions,
environment variables and builtin module.
"""
loader.reset_loader()
# load .env
dot_env_path = self.kwargs.pop("dot_env_path", None)
loader.load_dot_env_file(dot_env_path)
# load api/testcase definition and debugtalk.py module
project_folder_path = os.path.join(os.getcwd(), "tests") # TODO: remove tests
loader.load_project_tests(project_folder_path)
self.project_mapping = loader.project_mapping
utils.set_os_environ(self.project_mapping["env"])
def load_tests(self, path_or_testcases): def load_tests(self, path_or_testcases):
""" load testcases, extend and merge with api/testcase definitions. """ load testcases, extend and merge with api/testcase definitions.
@@ -73,7 +52,7 @@ class HttpRunner(object):
{ {
"config": { "config": {
"name": "desc1", "name": "desc1",
"path": "", "path": "", # optional
"variables": [], # optional "variables": [], # optional
"request": {} # optional "request": {} # optional
}, },
@@ -99,21 +78,23 @@ class HttpRunner(object):
if isinstance(path_or_testcases, list): if isinstance(path_or_testcases, list):
for testcase in path_or_testcases: for testcase in path_or_testcases:
try: try:
dir_path = os.path.dirname(testcase["config"]["path"]) test_path = os.path.dirname(testcase["config"]["path"])
loader.load_debugtalk_module(dir_path)
except KeyError: except KeyError:
pass test_path = os.getcwd()
loader.load_project_tests(test_path)
else: else:
try: try:
dir_path = os.path.dirname(path_or_testcases["config"]["path"]) test_path = os.path.dirname(path_or_testcases["config"]["path"])
loader.load_debugtalk_module(dir_path)
except KeyError: except KeyError:
pass test_path = os.getcwd()
loader.load_project_tests(test_path)
testcases = path_or_testcases testcases = path_or_testcases
else: else:
testcases = loader.load_testcases(path_or_testcases) testcases = loader.load_testcases(path_or_testcases)
self.project_mapping = loader.project_mapping
if not testcases: if not testcases:
raise exceptions.TestcaseNotFound raise exceptions.TestcaseNotFound
@@ -250,8 +231,9 @@ class HttpRunner(object):
instance: HttpRunner() instance instance: HttpRunner() instance
""" """
# parser # loader
testcases_list = self.load_tests(path_or_testcases) testcases_list = self.load_tests(path_or_testcases)
# parser
parsed_testcases_list = self.parse_tests(testcases_list) parsed_testcases_list = self.parse_tests(testcases_list)
# initialize # initialize

View File

@@ -39,9 +39,6 @@ def main_hrun():
parser.add_argument( parser.add_argument(
'--log-file', '--log-file',
help="Write logs to specified file path.") help="Write logs to specified file path.")
parser.add_argument(
'--dot-env-path',
help="Specify .env file path, which is useful for keeping production credentials.")
parser.add_argument( parser.add_argument(
'--failfast', action='store_true', default=False, '--failfast', action='store_true', default=False,
help="Stop the test run on the first error or failure.") help="Stop the test run on the first error or failure.")
@@ -78,7 +75,7 @@ def main_hrun():
create_scaffold(project_path) create_scaffold(project_path)
exit(0) exit(0)
runner = HttpRunner(failfast=args.failfast, dot_env_path=args.dot_env_path).run(args.testset_paths) runner = HttpRunner(failfast=args.failfast).run(args.testset_paths)
if not args.no_html_report: if not args.no_html_report:
runner.gen_html_report( runner.gen_html_report(

View File

@@ -6,7 +6,7 @@ import json
import os import os
import yaml import yaml
from httprunner import built_in, exceptions, logger, parser, validator from httprunner import built_in, exceptions, logger, parser, utils, validator
from httprunner.compat import OrderedDict from httprunner.compat import OrderedDict
project_mapping = { project_mapping = {
@@ -22,6 +22,7 @@ project_mapping = {
""" """
testcases_cache_mapping = {} testcases_cache_mapping = {}
project_working_directory = os.getcwd()
############################################################################### ###############################################################################
@@ -156,12 +157,8 @@ def load_folder_files(folder_path, recursive=True):
return file_list return file_list
def load_dot_env_file(path): def load_dot_env_file():
""" load .env file """ load .env file, .env file should be located in project working directory.
Args:
path (str): .env file path.
If path is None, it will find .env file in current working directory.
Returns: Returns:
dict: environment variables mapping dict: environment variables mapping
@@ -173,18 +170,13 @@ def load_dot_env_file(path):
} }
Raises: Raises:
exceptions.FileNotFound: If specified env file is not exist.
exceptions.FileFormatError: If env file format is invalid. exceptions.FileFormatError: If env file format is invalid.
""" """
if not path: path = os.path.join(project_working_directory, ".env")
path = os.path.join(os.getcwd(), ".env") if not os.path.isfile(path):
if not os.path.isfile(path): logger.log_debug(".env file not exist in : {}".format(project_working_directory))
logger.log_debug(".env file not exist: {}".format(path)) return {}
return {}
else:
if not os.path.isfile(path):
raise exceptions.FileNotFound("env file not exist: {}".format(path))
logger.log_info("Loading environment variables from {}".format(path)) logger.log_info("Loading environment variables from {}".format(path))
env_variables_mapping = {} env_variables_mapping = {}
@@ -200,6 +192,8 @@ def load_dot_env_file(path):
env_variables_mapping[variable.strip()] = value.strip() env_variables_mapping[variable.strip()] = value.strip()
project_mapping["env"] = env_variables_mapping project_mapping["env"] = env_variables_mapping
utils.set_os_environ(env_variables_mapping)
return env_variables_mapping return env_variables_mapping
@@ -239,6 +233,23 @@ def locate_file(start_path, file_name):
return locate_file(os.path.dirname(start_dir_path), file_name) return locate_file(os.path.dirname(start_dir_path), file_name)
def locate_pwd(start_path):
""" locate project working directory.
The folder contains debugtalk.py will be used as PWD.
If debugtalk.py is not found, use os.getcwd() as default PWD.
Args:
start_path (str): start locating path, maybe testcase file path or directory path
"""
global project_working_directory
try:
debugtalk_path = locate_file(start_path, "debugtalk.py")
project_working_directory = os.path.dirname(debugtalk_path)
except exceptions.FileNotFound:
project_working_directory = os.getcwd()
############################################################################### ###############################################################################
## debugtalk.py module loader ## debugtalk.py module loader
############################################################################### ###############################################################################
@@ -305,25 +316,18 @@ def load_builtin_module():
project_mapping["debugtalk"] = built_in_module project_mapping["debugtalk"] = built_in_module
def load_debugtalk_module(start_path=None): def load_debugtalk_module():
""" load project debugtalk.py module and merge with builtin module. """ load project debugtalk.py module and merge with builtin module.
debugtalk.py should be located in project working directory.
Args: variables and functions mapping for debugtalk.py
start_path (str, optional): start locating path, maybe file path or directory path.
Defaults to current working directory.
Returns:
dict: variables and functions mapping for debugtalk.py
{ {
"variables": {}, "variables": {},
"functions": {} "functions": {}
} }
""" """
start_path = start_path or os.getcwd()
try: try:
module_path = locate_file(start_path, "debugtalk.py") module_path = locate_file(project_working_directory, "debugtalk.py")
module_name = convert_module_name(module_path) module_name = convert_module_name(module_path)
except exceptions.FileNotFound: except exceptions.FileNotFound:
return return
@@ -420,9 +424,7 @@ def _load_test_file(file_path):
""" """
testcase = { testcase = {
"config": { "config": {},
"path": file_path
},
"teststeps": [] "teststeps": []
} }
@@ -742,7 +744,7 @@ def load_folder_content(folder_path):
return items_mapping return items_mapping
def load_api_folder(api_folder_path=None): def load_api_folder(api_folder_path):
""" load api definitions from api folder. """ load api definitions from api folder.
Args: Args:
@@ -783,7 +785,6 @@ def load_api_folder(api_folder_path=None):
""" """
api_definition_mapping = {} api_definition_mapping = {}
api_folder_path = api_folder_path or os.path.join(os.getcwd(), "api")
api_items_mapping = load_folder_content(api_folder_path) api_items_mapping = load_folder_content(api_folder_path)
for api_file_path, api_items in api_items_mapping.items(): for api_file_path, api_items in api_items_mapping.items():
@@ -805,7 +806,7 @@ def load_api_folder(api_folder_path=None):
return api_definition_mapping return api_definition_mapping
def load_test_folder(test_folder_path=None): def load_test_folder(test_folder_path):
""" load testcases definitions from folder. """ load testcases definitions from folder.
Args: Args:
@@ -847,17 +848,13 @@ def load_test_folder(test_folder_path=None):
""" """
test_definition_mapping = {} test_definition_mapping = {}
# TODO: replace suite with testcases
test_folder_path = test_folder_path or os.path.join(os.getcwd(), "suite")
test_items_mapping = load_folder_content(test_folder_path) test_items_mapping = load_folder_content(test_folder_path)
for test_file_path, items in test_items_mapping.items(): for test_file_path, items in test_items_mapping.items():
# TODO: add JSON schema validation # TODO: add JSON schema validation
testcase = { testcase = {
"config": { "config": {},
"path": test_file_path
},
"teststeps": [] "teststeps": []
} }
for item in items: for item in items:
@@ -890,6 +887,9 @@ def load_test_folder(test_folder_path=None):
def reset_loader(): def reset_loader():
""" reset project mapping. """ reset project mapping.
""" """
global project_working_directory
project_working_directory = os.getcwd()
project_mapping["debugtalk"] = { project_mapping["debugtalk"] = {
"variables": {}, "variables": {},
"functions": {} "functions": {}
@@ -900,16 +900,22 @@ def reset_loader():
testcases_cache_mapping.clear() testcases_cache_mapping.clear()
def load_project_tests(folder_path): def load_project_tests(test_path):
""" load api, testcases and builtin module. """ load api, testcases, .env, builtin module and debugtalk.py.
api/testcases folder is relative to project_working_directory
Args: Args:
folder_path (str): folder path. test_path (str): test file/folder path, locate pwd from this path.
""" """
reset_loader()
locate_pwd(test_path)
load_dot_env_file()
load_builtin_module() load_builtin_module()
load_api_folder(os.path.join(folder_path, "api")) load_debugtalk_module()
load_test_folder(os.path.join(folder_path, "suite")) load_api_folder(os.path.join(project_working_directory, "api"))
# TODO: replace suite with testcases
load_test_folder(os.path.join(project_working_directory, "suite"))
def load_testcases(path): def load_testcases(path):
@@ -948,14 +954,13 @@ def load_testcases(path):
return testcases_cache_mapping[path] return testcases_cache_mapping[path]
if os.path.isdir(path): if os.path.isdir(path):
load_debugtalk_module(path) load_project_tests(path)
files_list = load_folder_files(path) files_list = load_folder_files(path)
testcases_list = load_testcases(files_list) testcases_list = load_testcases(files_list)
elif os.path.isfile(path): elif os.path.isfile(path):
try: try:
dir_path = os.path.dirname(path) load_project_tests(path)
load_debugtalk_module(dir_path)
testcase = _load_test_file(path) testcase = _load_test_file(path)
if testcase["teststeps"]: if testcase["teststeps"]:
testcases_list = [testcase] testcases_list = [testcase]

View File

@@ -9,7 +9,7 @@ from base64 import b64encode
from collections import Iterable from collections import Iterable
from datetime import datetime from datetime import datetime
from httprunner import logger from httprunner import loader, logger
from httprunner.__about__ import __version__ from httprunner.__about__ import __version__
from httprunner.compat import basestring, bytes, json, numeric_types from httprunner.compat import basestring, bytes, json, numeric_types
from jinja2 import Template, escape from jinja2 import Template, escape
@@ -95,7 +95,7 @@ def render_html_report(summary, html_report_name=None, html_report_template=None
logger.log_info("Start to render Html report ...") logger.log_info("Start to render Html report ...")
logger.log_debug("render data: {}".format(summary)) logger.log_debug("render data: {}".format(summary))
report_dir_path = os.path.join(os.getcwd(), "reports") report_dir_path = os.path.join(loader.project_working_directory, "reports")
start_at_timestamp = int(summary["time"]["start_at"]) start_at_timestamp = int(summary["time"]["start_at"])
summary["time"]["start_datetime"] = datetime.fromtimestamp(start_at_timestamp).strftime('%Y-%m-%d %H:%M:%S') summary["time"]["start_datetime"] = datetime.fromtimestamp(start_at_timestamp).strftime('%Y-%m-%d %H:%M:%S')
if html_report_name: if html_report_name:

View File

@@ -45,7 +45,6 @@ class Runner(object):
testcase: testcase:
{ {
"name": "testcase description", "name": "testcase description",
"path": "tests/data/demo_testset_variables.yml",
"variables": [], # optional "variables": [], # optional
"request": { "request": {
"base_url": "http://127.0.0.1:5000", "base_url": "http://127.0.0.1:5000",

View File

@@ -374,11 +374,12 @@ def create_scaffold(project_path):
path_list = [ path_list = [
(project_path, "folder"), (project_path, "folder"),
(os.path.join(project_path, "tests"), "folder"), (os.path.join(project_path, "api"), "folder"),
(os.path.join(project_path, "tests", "api"), "folder"), (os.path.join(project_path, "testcases"), "folder"),
(os.path.join(project_path, "tests", "suite"), "folder"), (os.path.join(project_path, "testsuites"), "folder"),
(os.path.join(project_path, "tests", "testcases"), "folder"), (os.path.join(project_path, "reports"), "folder"),
(os.path.join(project_path, "tests", "debugtalk.py"), "file") (os.path.join(project_path, "debugtalk.py"), "file"),
(os.path.join(project_path, ".env"), "file")
] ]
msg = "" msg = ""

View File

@@ -14,7 +14,6 @@ def is_testcase(data_structure):
{ {
"config": { "config": {
"name": "desc1", "name": "desc1",
"path": "",
"variables": [], # optional "variables": [], # optional
"request": {} # optional "request": {} # optional
}, },

View File

@@ -2,7 +2,7 @@ import os
import shutil import shutil
import time import time
from httprunner import HttpRunner, LocustRunner from httprunner import HttpRunner, LocustRunner, loader
from locust import HttpLocust from locust import HttpLocust
from tests.api_server import HTTPBIN_SERVER from tests.api_server import HTTPBIN_SERVER
from tests.base import ApiServerUnittest from tests.base import ApiServerUnittest
@@ -21,7 +21,6 @@ class TestHttpRunner(ApiServerUnittest):
self.testcase = { self.testcase = {
'name': 'testset description', 'name': 'testset description',
'config': { 'config': {
'path': 'docs/data/demo-quickstart-2.yml',
'name': 'testset description', 'name': 'testset description',
'request': { 'request': {
'base_url': '', 'base_url': '',
@@ -89,7 +88,7 @@ class TestHttpRunner(ApiServerUnittest):
self.assertEqual(summary["stat"]["skipped"], 4) self.assertEqual(summary["stat"]["skipped"], 4)
runner.gen_html_report(html_report_name=output_folder_name) runner.gen_html_report(html_report_name=output_folder_name)
report_save_dir = os.path.join(os.getcwd(), 'reports', output_folder_name) report_save_dir = os.path.join(loader.project_working_directory, 'reports', output_folder_name)
self.assertGreater(len(os.listdir(report_save_dir)), 0) self.assertGreater(len(os.listdir(report_save_dir)), 0)
shutil.rmtree(report_save_dir) shutil.rmtree(report_save_dir)
@@ -155,7 +154,7 @@ class TestHttpRunner(ApiServerUnittest):
output_folder_name = os.path.basename(os.path.splitext(testset_path)[0]) output_folder_name = os.path.basename(os.path.splitext(testset_path)[0])
report = runner.gen_html_report(html_report_name=output_folder_name) report = runner.gen_html_report(html_report_name=output_folder_name)
self.assertTrue(os.path.isfile(report)) self.assertTrue(os.path.isfile(report))
report_save_dir = os.path.join(os.getcwd(), 'reports', output_folder_name) report_save_dir = os.path.join(loader.project_working_directory, 'reports', output_folder_name)
shutil.rmtree(report_save_dir) shutil.rmtree(report_save_dir)
def test_testcase_layer(self): def test_testcase_layer(self):
@@ -181,7 +180,7 @@ class TestHttpRunner(ApiServerUnittest):
{ {
"config": { "config": {
"name": "test teardown hooks", "name": "test teardown hooks",
'path': 'tests/httpbin/hooks.yml', "path": "tests/httpbin/hooks.yml"
}, },
"teststeps": [ "teststeps": [
{ {
@@ -217,7 +216,7 @@ class TestHttpRunner(ApiServerUnittest):
{ {
"name": "test teardown hooks", "name": "test teardown hooks",
"config": { "config": {
'path': 'tests/httpbin/hooks.yml', "path": "tests/httpbin/hooks.yml"
}, },
"teststeps": [ "teststeps": [
{ {
@@ -246,9 +245,7 @@ class TestHttpRunner(ApiServerUnittest):
testcases = [ testcases = [
{ {
"name": "test teardown hooks", "name": "test teardown hooks",
"config": { "config": {},
'path': 'tests/httpbin/hooks.yml',
},
"teststeps": [ "teststeps": [
{ {
"name": "test teardown hooks", "name": "test teardown hooks",
@@ -339,14 +336,6 @@ class TestHttpRunner(ApiServerUnittest):
self.assertIn("in", summary["details"][0]["in_out"]) self.assertIn("in", summary["details"][0]["in_out"])
self.assertIn("out", summary["details"][0]["in_out"]) self.assertIn("out", summary["details"][0]["in_out"])
def test_loader(self):
hrunner = HttpRunner(dot_env_path="tests/data/test.env")
self.assertEqual(hrunner.project_mapping["env"]["PROJECT_KEY"], "ABCDEFGH")
self.assertIn("debugtalk", hrunner.project_mapping)
self.assertIn("setup_and_reset", hrunner.project_mapping["def-testcase"])
self.assertIn("get_token", hrunner.project_mapping["def-api"])
self.assertIn("setup_and_reset", hrunner.project_mapping["def-testcase"])
def test_load_tests(self): def test_load_tests(self):
testcase_file_path = os.path.join( testcase_file_path = os.path.join(
os.getcwd(), 'tests/data/demo_testcase.yml') os.getcwd(), 'tests/data/demo_testcase.yml')

View File

@@ -9,9 +9,7 @@ from tests.base import ApiServerUnittest
class TestContext(ApiServerUnittest): class TestContext(ApiServerUnittest):
def setUp(self): def setUp(self):
project_dir = os.path.join(os.getcwd(), "tests") loader.load_project_tests(os.path.join(os.getcwd(), "tests"))
loader.load_project_tests(project_dir)
loader.load_debugtalk_module(project_dir)
self.debugtalk_module = loader.project_mapping["debugtalk"] self.debugtalk_module = loader.project_mapping["debugtalk"]
self.context = context.Context( self.context = context.Context(

View File

@@ -133,13 +133,18 @@ class TestFileLoader(unittest.TestCase):
self.assertEqual([], files) self.assertEqual([], files)
def test_load_dot_env_file(self): def test_load_dot_env_file(self):
env_variables_mapping = loader.load_dot_env_file("tests/data/test.env") loader.project_working_directory = os.path.join(
os.getcwd(), "tests",
)
env_variables_mapping = loader.load_dot_env_file()
self.assertIn("PROJECT_KEY", env_variables_mapping) self.assertIn("PROJECT_KEY", env_variables_mapping)
self.assertEqual(env_variables_mapping["UserName"], "debugtalk") self.assertEqual(env_variables_mapping["UserName"], "debugtalk")
def test_load_env_path_not_exist(self): def test_load_env_path_not_exist(self):
with self.assertRaises(exceptions.FileNotFound): loader.project_working_directory = os.path.join(
loader.load_dot_env_file("not_exist.env") os.getcwd(), "tests", "data",
)
loader.load_dot_env_file()
def test_locate_file(self): def test_locate_file(self):
with self.assertRaises(exceptions.FileNotFound): with self.assertRaises(exceptions.FileNotFound):
@@ -166,7 +171,7 @@ class TestFileLoader(unittest.TestCase):
"tests/debugtalk.py" "tests/debugtalk.py"
) )
self.assertEqual( self.assertEqual(
loader.locate_file("tests/data/test.env", "debugtalk.py"), loader.locate_file("tests/data/demo_testcase.yml", "debugtalk.py"),
"tests/debugtalk.py" "tests/debugtalk.py"
) )
@@ -180,15 +185,13 @@ class TestModuleLoader(unittest.TestCase):
self.assertNotIn("is_py3", functions_dict) self.assertNotIn("is_py3", functions_dict)
def test_load_debugtalk_module(self): def test_load_debugtalk_module(self):
project_dir = os.path.join(os.getcwd(), "tests") loader.load_project_tests(os.path.join(os.getcwd(), "httprunner"))
loader.load_project_tests(project_dir)
loader.load_debugtalk_module()
imported_module_items = loader.project_mapping["debugtalk"] imported_module_items = loader.project_mapping["debugtalk"]
self.assertIn("equals", imported_module_items["functions"]) self.assertIn("equals", imported_module_items["functions"])
self.assertNotIn("SECRET_KEY", imported_module_items["variables"]) self.assertNotIn("SECRET_KEY", imported_module_items["variables"])
self.assertNotIn("alter_response", imported_module_items["functions"]) self.assertNotIn("alter_response", imported_module_items["functions"])
loader.load_debugtalk_module("tests") loader.load_project_tests(os.path.join(os.getcwd(), "tests"))
imported_module_items = loader.project_mapping["debugtalk"] imported_module_items = loader.project_mapping["debugtalk"]
self.assertEqual( self.assertEqual(
imported_module_items["variables"]["SECRET_KEY"], imported_module_items["variables"]["SECRET_KEY"],
@@ -223,18 +226,26 @@ class TestModuleLoader(unittest.TestCase):
with self.assertRaises(exceptions.VariableNotFound): with self.assertRaises(exceptions.VariableNotFound):
loader.get_module_item(module_mapping, "variables", "SECRET_KEY2") loader.get_module_item(module_mapping, "variables", "SECRET_KEY2")
def test_locate_pwd(self):
loader.locate_pwd("tests/data/demo_testcase.yml")
self.assertEqual(loader.project_working_directory, "tests")
loader.locate_pwd("tests/base.py")
self.assertEqual(loader.project_working_directory, "tests")
loader.locate_pwd("httprunner/__init__.py")
self.assertEqual(loader.project_working_directory, os.getcwd())
class TestSuiteLoader(unittest.TestCase): class TestSuiteLoader(unittest.TestCase):
@classmethod @classmethod
def setUpClass(cls): def setUpClass(cls):
project_dir = os.path.join(os.getcwd(), "tests") loader.load_project_tests(os.path.join(os.getcwd(), "tests"))
loader.load_project_tests(project_dir)
def test_load_test_file_testcase(self): def test_load_test_file_testcase(self):
testcase = loader._load_test_file("tests/testcases/smoketest.yml") testcase = loader._load_test_file("tests/testcases/smoketest.yml")
self.assertEqual(testcase["config"]["name"], "smoketest") self.assertEqual(testcase["config"]["name"], "smoketest")
self.assertEqual(testcase["config"]["path"], "tests/testcases/smoketest.yml")
self.assertIn("device_sn", testcase["config"]["variables"][0]) self.assertIn("device_sn", testcase["config"]["variables"][0])
self.assertEqual(len(testcase["teststeps"]), 8) self.assertEqual(len(testcase["teststeps"]), 8)
self.assertEqual(testcase["teststeps"][0]["name"], "get token") self.assertEqual(testcase["teststeps"][0]["name"], "get token")
@@ -353,8 +364,6 @@ class TestSuiteLoader(unittest.TestCase):
os.getcwd(), 'tests/data/demo_testset_hardcode.json') os.getcwd(), 'tests/data/demo_testset_hardcode.json')
testset_list = loader.load_testcases(path) testset_list = loader.load_testcases(path)
self.assertEqual(len(testset_list), 1) self.assertEqual(len(testset_list), 1)
self.assertIn("path", testset_list[0]["config"])
self.assertEqual(testset_list[0]["config"]["path"], path)
self.assertEqual(len(testset_list[0]["teststeps"]), 3) self.assertEqual(len(testset_list[0]["teststeps"]), 3)
testsets_list.extend(testset_list) testsets_list.extend(testset_list)
@@ -362,8 +371,6 @@ class TestSuiteLoader(unittest.TestCase):
path = 'tests/data/demo_testset_hardcode.yml' path = 'tests/data/demo_testset_hardcode.yml'
testset_list = loader.load_testcases(path) testset_list = loader.load_testcases(path)
self.assertEqual(len(testset_list), 1) self.assertEqual(len(testset_list), 1)
self.assertIn("path", testset_list[0]["config"])
self.assertIn(path, testset_list[0]["config"]["path"])
self.assertEqual(len(testset_list[0]["teststeps"]), 3) self.assertEqual(len(testset_list[0]["teststeps"]), 3)
testsets_list.extend(testset_list) testsets_list.extend(testset_list)
@@ -478,10 +485,9 @@ class TestSuiteLoader(unittest.TestCase):
) )
def test_load_project_tests(self): def test_load_project_tests(self):
project_dir = os.path.join(os.getcwd(), "tests") loader.load_project_tests(os.path.join(os.getcwd(), "tests"))
loader.load_project_tests(project_dir)
loader.load_debugtalk_module(project_dir)
project_mapping = loader.project_mapping project_mapping = loader.project_mapping
self.assertEqual(project_mapping["debugtalk"]["variables"]["SECRET_KEY"], "DebugTalk") self.assertEqual(project_mapping["debugtalk"]["variables"]["SECRET_KEY"], "DebugTalk")
self.assertIn("get_token", project_mapping["def-api"]) self.assertIn("get_token", project_mapping["def-api"])
self.assertIn("setup_and_reset", project_mapping["def-testcase"]) self.assertIn("setup_and_reset", project_mapping["def-testcase"])
self.assertEqual(project_mapping["env"]["PROJECT_KEY"], "ABCDEFGH")

View File

@@ -412,8 +412,7 @@ class TestParser(unittest.TestCase):
) )
def test_parse_parameters_mix(self): def test_parse_parameters_mix(self):
project_dir = os.path.join(os.getcwd(), "tests") loader.load_project_tests(os.path.join(os.getcwd(), "tests"))
loader.load_debugtalk_module(project_dir)
project_mapping = loader.project_mapping project_mapping = loader.project_mapping
parameters = [ parameters = [

View File

@@ -10,9 +10,7 @@ from tests.base import ApiServerUnittest
class TestRunner(ApiServerUnittest): class TestRunner(ApiServerUnittest):
def setUp(self): def setUp(self):
project_dir = os.path.join(os.getcwd(), "tests") loader.load_project_tests(os.path.join(os.getcwd(), "tests"))
loader.load_project_tests(project_dir)
loader.load_debugtalk_module(project_dir)
self.debugtalk_module = loader.project_mapping["debugtalk"] self.debugtalk_module = loader.project_mapping["debugtalk"]
config_dict = { config_dict = {
"variables": self.debugtalk_module["variables"], "variables": self.debugtalk_module["variables"],
@@ -82,7 +80,6 @@ class TestRunner(ApiServerUnittest):
start_time = time.time() start_time = time.time()
config_dict = { config_dict = {
"path": os.path.join(os.getcwd(), __file__),
"name": "basic test with httpbin", "name": "basic test with httpbin",
"variables": self.debugtalk_module["variables"], "variables": self.debugtalk_module["variables"],
"functions": self.debugtalk_module["functions"], "functions": self.debugtalk_module["functions"],
@@ -132,7 +129,6 @@ class TestRunner(ApiServerUnittest):
def test_run_testset_with_hooks_modify_request(self): def test_run_testset_with_hooks_modify_request(self):
config_dict = { config_dict = {
"path": os.path.join(os.getcwd(), __file__),
"name": "basic test with httpbin", "name": "basic test with httpbin",
"variables": self.debugtalk_module["variables"], "variables": self.debugtalk_module["variables"],
"functions": self.debugtalk_module["functions"], "functions": self.debugtalk_module["functions"],
@@ -187,9 +183,7 @@ class TestRunner(ApiServerUnittest):
], ],
"teardown_hooks": ["${teardown_hook_sleep_N_secs($response, 2)}"] "teardown_hooks": ["${teardown_hook_sleep_N_secs($response, 2)}"]
} }
config_dict = { config_dict = {}
"path": os.path.join(os.getcwd(), __file__)
}
self.test_runner.init_config(config_dict, "testcase") self.test_runner.init_config(config_dict, "testcase")
start_time = time.time() start_time = time.time()
@@ -220,9 +214,7 @@ class TestRunner(ApiServerUnittest):
], ],
"teardown_hooks": ["${teardown_hook_sleep_N_secs($response, 2)}"] "teardown_hooks": ["${teardown_hook_sleep_N_secs($response, 2)}"]
} }
config_dict = { config_dict = {}
"path": os.path.join(os.getcwd(), __file__)
}
self.test_runner.init_config(config_dict, "testcase") self.test_runner.init_config(config_dict, "testcase")
start_time = time.time() start_time = time.time()
@@ -248,9 +240,7 @@ class TestRunner(ApiServerUnittest):
testcase_file_path = os.path.join( testcase_file_path = os.path.join(
os.getcwd(), 'tests/data/test_bugfix.yml') os.getcwd(), 'tests/data/test_bugfix.yml')
testcases = loader.load_file(testcase_file_path) testcases = loader.load_file(testcase_file_path)
config_dict = { config_dict = {}
"path": testcase_file_path
}
self.test_runner.init_config(config_dict, "testcase") self.test_runner.init_config(config_dict, "testcase")
test = testcases[2]["test"] test = testcases[2]["test"]

View File

@@ -254,11 +254,12 @@ class TestUtils(ApiServerUnittest):
def test_create_scaffold(self): def test_create_scaffold(self):
project_path = os.path.join(os.getcwd(), "projectABC") project_path = os.path.join(os.getcwd(), "projectABC")
utils.create_scaffold(project_path) utils.create_scaffold(project_path)
self.assertTrue(os.path.isdir(os.path.join(project_path, "tests"))) self.assertTrue(os.path.isdir(os.path.join(project_path, "api")))
self.assertTrue(os.path.isdir(os.path.join(project_path, "tests", "api"))) self.assertTrue(os.path.isdir(os.path.join(project_path, "testcases")))
self.assertTrue(os.path.isdir(os.path.join(project_path, "tests", "suite"))) self.assertTrue(os.path.isdir(os.path.join(project_path, "testsuites")))
self.assertTrue(os.path.isdir(os.path.join(project_path, "tests", "testcases"))) self.assertTrue(os.path.isdir(os.path.join(project_path, "reports")))
self.assertTrue(os.path.isfile(os.path.join(project_path, "tests", "debugtalk.py"))) self.assertTrue(os.path.isfile(os.path.join(project_path, "debugtalk.py")))
self.assertTrue(os.path.isfile(os.path.join(project_path, ".env")))
shutil.rmtree(project_path) shutil.rmtree(project_path)
def test_cartesian_product_one(self): def test_cartesian_product_one(self):