Example #1
0
def main():
    """ HAR converter: parse command line options and run commands.
    """
    parser = argparse.ArgumentParser(
        description='Convert HAR to YAML/JSON testcases for HttpRunner.')
    parser.add_argument(
        '-V', '--version', dest='version', action='store_true',
        help="show version")
    parser.add_argument('har_source_file', nargs='?',
        help="Specify HAR source file")
    parser.add_argument('output_testset_file', nargs='?',
        help="Optional. Specify converted YAML/JSON testset file.")
    parser.add_argument(
        '--filter', help="Specify filter keyword, only url include filter string will be converted.")
    parser.add_argument(
        '--exclude', help="Specify exclude keyword, url that includes exclude string will be ignored.")
    parser.add_argument(
        '--log-level', default='INFO',
        help="Specify logging level, default is INFO.")

    args = parser.parse_args()

    if args.version:
        print("{}".format(__version__))
        exit(0)

    log_level = getattr(logging, args.log_level.upper())
    logging.basicConfig(level=log_level)

    har_source_file = args.har_source_file
    output_testset_file = args.output_testset_file

    if not har_source_file or not har_source_file.endswith(".har"):
        logging.error("HAR file not specified.")
        sys.exit(1)

    output_file_type = "JSON"
    if not output_testset_file:
        harfile = os.path.splitext(har_source_file)[0]
        output_testset_file = "{}.{}".format(harfile, output_file_type.lower())
    else:
        output_file_suffix = os.path.splitext(output_testset_file)[1]
        if output_file_suffix in [".yml", ".yaml"]:
            output_file_type = "YAML"
        elif output_file_suffix in [".json"]:
            output_file_type = "JSON"
        else:
            logging.error("Converted file could only be in YAML or JSON format.")
            sys.exit(1)

    har_parser = HarParser(har_source_file, args.filter, args.exclude)

    if output_file_type == "JSON":
        har_parser.gen_json(output_testset_file)
    else:
        har_parser.gen_yaml(output_testset_file)

    return 0
Example #2
0
class TestHar(TestUtils):

    def setUp(self):
        self.har_parser = HarParser(self.har_path)
        self.log_entries = self.har_parser.log_entries

    def test_make_testcase(self):
        testcase = self.har_parser.make_testcase(self.log_entries[0])
        self.assertIn("name", testcase)
        self.assertIn("request", testcase)
        self.assertIn("validate", testcase)

        validators_mapping = {
            validator["eq"][0]: validator["eq"][1]
            for validator in testcase["validate"]
        }
        self.assertEqual(
            validators_mapping["status_code"], 200
        )
        self.assertEqual(
            validators_mapping["content.IsSuccess"], True
        )
        self.assertEqual(
            validators_mapping["content.Code"], 200
        )
        self.assertEqual(
            validators_mapping["content.Message"], None
        )

    def test_make_testcases(self):
        testcases = self.har_parser.make_testcases()
        self.assertIn("name", testcases[0]["test"])
        self.assertIn("request", testcases[0]["test"])
        self.assertIn("validate", testcases[0]["test"])

    def test_gen_yaml(self):
        yaml_file = os.path.join(
            os.path.dirname(__file__), "data", "demo.yml")

        self.har_parser.gen_yaml(yaml_file)
        os.remove(yaml_file)

    def test_gen_json(self):
        json_file = os.path.join(
            os.path.dirname(__file__), "data", "demo.json")

        self.har_parser.gen_json(json_file)
        os.remove(json_file)

    def test_filter(self):
        filter_str = "httprunner"
        har_parser = HarParser(self.har_path, filter_str)
        testcases = har_parser.make_testcases()
        self.assertEqual(
            testcases[0]["test"]["request"]["url"],
            "https://httprunner.top/api/v1/Account/Login"
        )

        filter_str = "debugtalk"
        har_parser = HarParser(self.har_path, filter_str)
        testcases = har_parser.make_testcases()
        self.assertEqual(testcases, [])

    def test_exclude(self):
        exclude_str = "debugtalk"
        har_parser = HarParser(self.har_path, exclude_str=exclude_str)
        testcases = har_parser.make_testcases()
        self.assertEqual(
            testcases[0]["test"]["request"]["url"],
            "https://httprunner.top/api/v1/Account/Login"
        )

        exclude_str = "httprunner"
        har_parser = HarParser(self.har_path, exclude_str=exclude_str)
        testcases = har_parser.make_testcases()
        self.assertEqual(testcases, [])

    def test_exclude_multiple(self):
        exclude_str = "httprunner|v2"
        har_parser = HarParser(self.har_path, exclude_str=exclude_str)
        testcases = har_parser.make_testcases()
        self.assertEqual(testcases, [])

        exclude_str = "http2|v1"
        har_parser = HarParser(self.har_path, exclude_str=exclude_str)
        testcases = har_parser.make_testcases()
        self.assertEqual(testcases, [])

    def test_make_request_data_params(self):
        testcase_dict = {
            "name": "",
            "request": {},
            "validate": []
        }
        entry_json = {
            "request": {
                "method": "POST",
                "postData": {
                    "mimeType": "application/x-www-form-urlencoded; charset=utf-8",
                    "params": [
                        {"name": "a", "value": 1},
                        {"name": "b", "value": "2"}
                    ]
                },
            }
        }
        self.har_parser._make_request_data(testcase_dict, entry_json)
        self.assertEqual(testcase_dict["request"]["method"], "POST")
        self.assertIn("a=1", testcase_dict["request"]["data"])
        self.assertIn("b=2", testcase_dict["request"]["data"])

    def test_make_request_data_json(self):
        testcase_dict = {
            "name": "",
            "request": {},
            "validate": []
        }
        entry_json = {
            "request": {
                "method": "POST",
                "postData": {
                    "mimeType": "application/json; charset=utf-8",
                    "text": "{\"a\":\"1\",\"b\":\"2\"}"
                },
            }
        }
        self.har_parser._make_request_data(testcase_dict, entry_json)
        self.assertEqual(testcase_dict["request"]["method"], "POST")
        self.assertEqual(
            testcase_dict["request"]["json"],
            {'a': '1', 'b': '2'}
        )

    def test_make_validate(self):
        testcase_dict = {
            "name": "",
            "request": {},
            "validate": []
        }
        entry_json = {
            "request": {},
            "response": {
                "status": 200,
                "headers": [
                    {
                        "name": "Content-Type",
                        "value": "application/json; charset=utf-8"
                    },
                ],
                "content": {
                    "size": 71,
                    "mimeType": "application/json; charset=utf-8",
                    # raw response content text is application/jose type
                    "text": "ZXlKaGJHY2lPaUpTVTBFeFh6VWlMQ0psYm1NaU9pSkJNVEk0UTBKRExV",
                    "encoding": "base64"
                }
            }
        }
        self.har_parser._make_validate(testcase_dict, entry_json)
        self.assertEqual(
            testcase_dict["validate"][0],
            {"eq": ["status_code", 200]}
        )
        self.assertEqual(
            testcase_dict["validate"][1],
            {"eq": ["headers.Content-Type", "application/json; charset=utf-8"]}
        )

    def test_make_testset(self):
        har_path = os.path.join(
            os.path.dirname(__file__), "data", "demo-quickstart.har")
        har_parser = HarParser(har_path)
        testset = har_parser.make_testset()
        testset_config = testset[0]
        self.assertIn("config", testset_config)
        self.assertIn("request", testset_config["config"])
        self.assertIn("headers", testset_config["config"]["request"])
        self.assertEqual(testset_config["config"]["request"]["base_url"], "")