5eb8d55e51
Now test suite name is taken from environment variable. Change-Id: Ifef5e24cfd5651629ba80d3e2e18c221b6e8a48a
152 lines
5.4 KiB
Python
152 lines
5.4 KiB
Python
# Copyright 2015 Mirantis, Inc.
|
|
#
|
|
# 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 subprocess
|
|
|
|
from joblib import Parallel, delayed
|
|
|
|
from settings import TestRailSettings
|
|
from testrail_client import TestRailProject
|
|
|
|
|
|
TEST_GROUPS = ["API", "CLI", "Scenario", "ThirdParty"]
|
|
TEST_SECTIONS = ["Ceilometer", "Cinder", "Glance", "Heat", "Ironic",
|
|
"Keystone", "Network", "Nova", "Sahara", "Swift", "Other"]
|
|
|
|
|
|
def generate_groups(line):
|
|
section = "Other"
|
|
|
|
for group in [{"names": [".telemetry.", ], "tag": "Ceilometer"},
|
|
{"names": [".volume.", ], "tag": "Cinder"},
|
|
{"names": [".image.", ], "tag": "Glance"},
|
|
{"names": [".orchestration.", ], "tag": "Heat"},
|
|
{"names": [".baremetal.", ], "tag": "Ironic"},
|
|
{"names": [".identity.", ], "tag": "Keystone"},
|
|
{"names": [".network.", ], "tag": "Network"},
|
|
{"names": [".compute.", ], "tag": "Nova"},
|
|
{"names": [".data_processing.", ], "tag": "Sahara"},
|
|
{"names": [".object_storage.", ], "tag": "Swift"}]:
|
|
for name in group["names"]:
|
|
if name in line:
|
|
section = group["tag"]
|
|
|
|
for group in TEST_SECTIONS:
|
|
if group.lower() in line and section == "Other":
|
|
section = group
|
|
|
|
return section
|
|
|
|
|
|
def get_tests_descriptions(milestone_id, tests_include, tests_exclude):
|
|
# To get the Tempest tests list, need to execute the following commands:
|
|
# git clone https://github.com/openstack/tempest & cd tempest & tox -venv
|
|
get_tempest_tests = """cd tempest && .tox/venv/bin/nosetests \\
|
|
--collect-only tempest/{0} -v 2>&1 | grep 'id-.*'"""
|
|
|
|
tests = []
|
|
|
|
for group in TEST_GROUPS:
|
|
p = subprocess.Popen(get_tempest_tests.format(group.lower()),
|
|
shell=True, stdout=subprocess.PIPE)
|
|
|
|
for line in iter(p.stdout.readline, b''):
|
|
if "id-" in line:
|
|
section = generate_groups(line) if group == "API" else group
|
|
|
|
test_class = []
|
|
for r in line.split("."):
|
|
if "id-" in r:
|
|
title = r.strip()
|
|
break
|
|
else:
|
|
test_class.append(r)
|
|
|
|
steps = [{"run this tempest test": "passed"}, ]
|
|
test_case = {
|
|
"title": title,
|
|
"type_id": 1,
|
|
"priority_id": 5,
|
|
"estimate": "1m",
|
|
"refs": "",
|
|
"milestone_id": milestone_id,
|
|
"custom_test_group": ".".join(test_class),
|
|
"custom_test_case_description": title,
|
|
"custom_test_case_steps": steps,
|
|
"section": section
|
|
}
|
|
tests.append(test_case)
|
|
|
|
return tests
|
|
|
|
|
|
def delete_case(testrail_project, test_id):
|
|
testrail_project.delete_case(test_id)
|
|
|
|
|
|
def add_case(testrail_project, test_suite, test_case):
|
|
suite = testrail_project.get_suite_by_name(test_suite)
|
|
section = testrail_project.get_section_by_name(
|
|
suite_id=suite['id'], section_name=test_case["section"])
|
|
testrail_project.add_case(section_id=section["id"], case=test_case)
|
|
|
|
|
|
def upload_tests_descriptions(testrail_project, tests):
|
|
test_suite = TestRailSettings.tests_suite
|
|
suite = testrail_project.get_suite_by_name(test_suite)
|
|
|
|
# remove old sections and test cases
|
|
old_sections = testrail_project.get_sections(suite_id=suite['id'])
|
|
for section in old_sections:
|
|
if section["parent_id"] is None:
|
|
testrail_project.delete_section(section["id"])
|
|
|
|
# create new groups
|
|
for group in TEST_GROUPS:
|
|
testrail_project.create_section(suite["id"], group)
|
|
|
|
api_group = testrail_project.get_section_by_name(suite["id"], "API")
|
|
for section in TEST_SECTIONS:
|
|
testrail_project.create_section(suite["id"], section, api_group["id"])
|
|
|
|
# add test cases to test suite in 100 parallel threads
|
|
Parallel(n_jobs=100)(delayed(add_case)
|
|
(testrail_project, test_suite, test_case)
|
|
for test_case in tests)
|
|
|
|
|
|
def main():
|
|
testrail_project = TestRailProject(
|
|
url=TestRailSettings.url,
|
|
user=TestRailSettings.user,
|
|
password=TestRailSettings.password,
|
|
project=TestRailSettings.project
|
|
)
|
|
|
|
testrail_milestone = testrail_project.get_milestone_by_name(
|
|
name=TestRailSettings.milestone)
|
|
|
|
tests_descriptions = get_tests_descriptions(
|
|
milestone_id=testrail_milestone['id'],
|
|
tests_include=TestRailSettings.tests_include,
|
|
tests_exclude=TestRailSettings.tests_exclude
|
|
)
|
|
|
|
upload_tests_descriptions(testrail_project=testrail_project,
|
|
tests=tests_descriptions)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|