diff --git a/.github/workflows/smoketest.yml b/.github/workflows/smoketest.yml
index 1d629d59..3dd0afb3 100644
--- a/.github/workflows/smoketest.yml
+++ b/.github/workflows/smoketest.yml
@@ -73,3 +73,7 @@ jobs:
- name: Run smoketest - rendezvous
run: |
./output/hrp boom examples/hrp/rendezvous_test.json --spawn-count 10 --spawn-rate 10 --loop-count 10
+ - name: Run hrp convert --pytest
+ run: ./output/hrp convert examples/postman_echo/request_methods/
+ - name: Run hrp pytest
+ run: ./output/hrp pytest examples/postman_echo/request_methods/
diff --git a/httprunner/cli.py b/httprunner/cli.py
index 1aa29eac..c803dd0f 100644
--- a/httprunner/cli.py
+++ b/httprunner/cli.py
@@ -9,7 +9,7 @@ from loguru import logger
from httprunner import __description__, __version__
from httprunner.compat import ensure_cli_args
from httprunner.make import init_make_parser, main_make
-from httprunner.utils import ga_client, init_sentry_sdk
+from httprunner.utils import ga_client, init_logger, init_sentry_sdk
init_sentry_sdk()
@@ -57,6 +57,8 @@ def main_run(extra_args) -> enum.IntEnum:
def main():
""" API test: parse command line options and run commands.
"""
+ init_logger()
+
parser = argparse.ArgumentParser(description=__description__)
parser.add_argument(
"-V", "--version", dest="version", action="store_true", help="show version"
diff --git a/httprunner/runner.py b/httprunner/runner.py
index 53d4786c..fe535098 100644
--- a/httprunner/runner.py
+++ b/httprunner/runner.py
@@ -12,6 +12,7 @@ except ModuleNotFoundError:
USE_ALLURE = False
from loguru import logger
+
from httprunner.client import HttpSession
from httprunner.config import Config
from httprunner.exceptions import ParamsError, ValidationFailure
@@ -19,7 +20,7 @@ from httprunner.loader import load_project_meta
from httprunner.models import (ProjectMeta, StepResult, TConfig, TestCaseInOut,
TestCaseSummary, TestCaseTime, VariablesMapping)
from httprunner.parser import Parser
-from httprunner.utils import merge_variables
+from httprunner.utils import LOGGER_FORMAT, init_logger, merge_variables
class SessionRunner(object):
@@ -43,6 +44,7 @@ class SessionRunner(object):
__log_path: Text = ""
def __init(self):
+ init_logger()
self.__config = self.config.struct()
self.__session_variables = {}
self.__start_at = 0
@@ -188,6 +190,7 @@ class SessionRunner(object):
def test_start(self, param: Dict = None) -> "SessionRunner":
"""main entrance, discovered by pytest"""
+ print("\n")
self.__init()
self.__parse_config(param)
@@ -200,14 +203,13 @@ class SessionRunner(object):
f"Start to run testcase: {self.__config.name}, TestCase ID: {self.case_id}"
)
- log_handler = logger.add(self.__log_path, level="DEBUG")
+ logger.add(self.__log_path, format=LOGGER_FORMAT, level="DEBUG")
self.__start_at = time.time()
try:
# run step in sequential order
for step in self.teststeps:
self.__run_step(step)
finally:
- logger.remove(log_handler)
logger.info(f"generate testcase log: {self.__log_path}")
self.__duration = time.time() - self.__start_at
diff --git a/httprunner/utils.py b/httprunner/utils.py
index 1acfca25..9c0306f6 100644
--- a/httprunner/utils.py
+++ b/httprunner/utils.py
@@ -5,6 +5,7 @@ import json
import os
import os.path
import platform
+import sys
import uuid
from multiprocessing import Queue
from typing import Any, Dict, List, Text
@@ -320,3 +321,12 @@ def gen_cartesian_product(*args: List[Dict]) -> List[Dict]:
product_list.append(product_item_dict)
return product_list
+
+
+LOGGER_FORMAT = "{time:YYYY-MM-DD HH:mm:ss.SSS} | {level} | {message}"
+
+
+def init_logger():
+ # set log level to INFO
+ logger.remove()
+ logger.add(sys.stderr, format=LOGGER_FORMAT, level="INFO")