2023-08-07 10:11:54 +08:00
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
# _*_ coding:utf-8 _*_
|
|
|
|
|
|
|
|
|
|
# SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
|
|
|
|
|
|
|
|
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
|
# pylint: disable=C0114
|
2023-08-30 10:37:11 +08:00
|
|
|
|
# pylint: disable=wrong-import-position
|
2023-08-07 10:11:54 +08:00
|
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
|
import traceback
|
|
|
|
|
from argparse import ArgumentParser
|
2024-03-13 18:12:50 +08:00
|
|
|
|
|
2024-03-13 17:49:12 +08:00
|
|
|
|
from setting.globalconfig import GlobalConfig
|
2023-08-07 10:11:54 +08:00
|
|
|
|
|
|
|
|
|
os.environ["DISPLAY"] = ":0"
|
2024-03-05 18:32:53 +08:00
|
|
|
|
os.environ["PIPENV_VERBOSITY"] = "-1"
|
2024-03-13 17:49:12 +08:00
|
|
|
|
os.environ["XAUTHORITY"] = f"/home/{GlobalConfig.USERNAME}/.Xauthority"
|
2023-08-07 10:11:54 +08:00
|
|
|
|
|
|
|
|
|
from setting.globalconfig import SystemPath
|
|
|
|
|
|
|
|
|
|
for i in SystemPath:
|
|
|
|
|
if i.value in sys.path:
|
|
|
|
|
continue
|
|
|
|
|
sys.path.append(i.value)
|
|
|
|
|
|
2024-03-08 18:28:43 +08:00
|
|
|
|
from funnylog import logger
|
2023-08-07 10:11:54 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# pylint: disable=too-many-instance-attributes,broad-except
|
|
|
|
|
class Manage:
|
|
|
|
|
"""执行器"""
|
|
|
|
|
|
2023-09-26 14:45:27 +08:00
|
|
|
|
__author__ = "mikigo<huangmingqiang@uniontech.com>"
|
2023-08-07 10:11:54 +08:00
|
|
|
|
|
|
|
|
|
# pylint: disable=too-many-arguments,too-many-locals,too-many-statements
|
|
|
|
|
def __init__(
|
2024-03-13 18:12:50 +08:00
|
|
|
|
self,
|
|
|
|
|
app=None,
|
|
|
|
|
keywords=None,
|
|
|
|
|
tags=None,
|
|
|
|
|
rerun=None,
|
|
|
|
|
record_failed_case=None,
|
|
|
|
|
clean=None,
|
|
|
|
|
report_formats=None,
|
|
|
|
|
max_fail=None,
|
|
|
|
|
log_level=None,
|
|
|
|
|
timeout=None,
|
|
|
|
|
resolution=None,
|
|
|
|
|
debug=None,
|
|
|
|
|
noskip=None,
|
|
|
|
|
ifixed=None,
|
|
|
|
|
send_pms=None,
|
|
|
|
|
task_id=None,
|
|
|
|
|
trigger=None,
|
|
|
|
|
case_file=None,
|
|
|
|
|
branch=None,
|
|
|
|
|
deb_path=None,
|
|
|
|
|
pms_user=None,
|
|
|
|
|
pms_password=None,
|
|
|
|
|
suite_id=None,
|
|
|
|
|
pms_info_file=None,
|
|
|
|
|
top=None,
|
|
|
|
|
lastfailed=None,
|
|
|
|
|
duringfail=None,
|
|
|
|
|
repeat=None,
|
|
|
|
|
project_name=None,
|
|
|
|
|
build_location=None,
|
|
|
|
|
line=None,
|
|
|
|
|
client=None,
|
|
|
|
|
send_code=None,
|
|
|
|
|
build_env=None,
|
|
|
|
|
client_password=None,
|
|
|
|
|
parallel=None,
|
|
|
|
|
autostart=None,
|
|
|
|
|
pyid2csv=None,
|
|
|
|
|
export_csv_file=None,
|
|
|
|
|
pms2csv=None,
|
|
|
|
|
csv2pms=None,
|
|
|
|
|
csv_name=None,
|
|
|
|
|
pms_link_csv=None,
|
|
|
|
|
send2task=None,
|
|
|
|
|
url=None,
|
|
|
|
|
startdate=None,
|
|
|
|
|
enddate=None,
|
|
|
|
|
git_user=None,
|
|
|
|
|
git_password=None,
|
|
|
|
|
depth=None,
|
2023-08-07 10:11:54 +08:00
|
|
|
|
):
|
|
|
|
|
self.default_app = app
|
|
|
|
|
self.default_keywords = keywords
|
|
|
|
|
self.default_tags = tags
|
|
|
|
|
self.default_rerun = rerun
|
2023-08-10 20:31:06 +08:00
|
|
|
|
self.default_record_failed_case = record_failed_case
|
2023-08-07 10:11:54 +08:00
|
|
|
|
self.default_clean = clean
|
|
|
|
|
self.default_report_formats = report_formats
|
|
|
|
|
self.default_max_fail = max_fail
|
|
|
|
|
self.default_log_level = log_level
|
|
|
|
|
self.default_timeout = timeout
|
|
|
|
|
self.default_resolution = resolution
|
|
|
|
|
self.default_debug = debug
|
|
|
|
|
self.default_noskip = noskip
|
|
|
|
|
self.default_ifixed = ifixed
|
|
|
|
|
self.default_send_pms = send_pms
|
|
|
|
|
self.default_task_id = task_id
|
|
|
|
|
self.default_trigger = trigger
|
|
|
|
|
self.default_case_file = case_file
|
|
|
|
|
self.default_branch = branch
|
|
|
|
|
self.default_deb_path = deb_path
|
|
|
|
|
self.default_pms_user = pms_user
|
|
|
|
|
self.default_pms_password = pms_password
|
|
|
|
|
self.default_suite_id = suite_id
|
|
|
|
|
self.default_pms_info_file = pms_info_file
|
|
|
|
|
self.default_top = top
|
|
|
|
|
self.default_lastfailed = lastfailed
|
|
|
|
|
self.default_duringfail = duringfail
|
|
|
|
|
self.default_repeat = repeat
|
|
|
|
|
self.default_project_name = project_name
|
|
|
|
|
self.default_build_location = build_location
|
|
|
|
|
self.default_line = line
|
|
|
|
|
self.default_client = client
|
|
|
|
|
self.default_send_code = send_code
|
|
|
|
|
self.default_build_env = build_env
|
|
|
|
|
self.default_client_password = client_password
|
|
|
|
|
self.default_parallel = parallel
|
2023-08-29 18:12:45 +08:00
|
|
|
|
self.default_autostart = autostart
|
2023-09-08 16:56:50 +08:00
|
|
|
|
self.default_pyid2csv = pyid2csv
|
|
|
|
|
self.default_export_csv_file = export_csv_file
|
|
|
|
|
self.default_pms2csv = pms2csv
|
2023-09-27 17:46:59 +08:00
|
|
|
|
self.default_csv2pms = csv2pms
|
|
|
|
|
self.default_csv_name = csv_name
|
2023-09-08 16:56:50 +08:00
|
|
|
|
self.default_pms_link_csv = pms_link_csv
|
|
|
|
|
self.default_send2task = send2task
|
2024-03-05 18:32:53 +08:00
|
|
|
|
self.default_url = url
|
2024-03-06 14:44:27 +08:00
|
|
|
|
self.default_startdate = startdate
|
|
|
|
|
self.default_enddate = enddate
|
2024-03-05 18:32:53 +08:00
|
|
|
|
self.default_git_user = git_user
|
|
|
|
|
self.default_git_password = git_password
|
|
|
|
|
self.default_depth = depth
|
2024-03-08 18:28:43 +08:00
|
|
|
|
from src.depends.cfonts import say
|
2023-08-07 10:11:54 +08:00
|
|
|
|
|
|
|
|
|
say(GlobalConfig.PROJECT_NAME)
|
|
|
|
|
version_font = "slick"
|
2023-11-13 14:26:29 +08:00
|
|
|
|
say(GlobalConfig.current_tag, font=version_font, space=False)
|
2023-08-22 18:35:08 +08:00
|
|
|
|
say(f"Code: \033[0;32m{GlobalConfig.GITHUB_URL}\033[0m", font="console", space=False)
|
|
|
|
|
say(f"Docs: \033[0;32m{GlobalConfig.DOCS_URL}\033[0m", font="console", space=False)
|
|
|
|
|
say(f"PyPI: \033[0;32m{GlobalConfig.PyPI_URL}\033[0m", font="console", space=False)
|
2023-08-21 18:16:11 +08:00
|
|
|
|
say("=" * 60, font="console", space=False)
|
2023-08-07 10:11:54 +08:00
|
|
|
|
logger(GlobalConfig.LOG_LEVEL)
|
|
|
|
|
|
2023-08-30 10:37:11 +08:00
|
|
|
|
self.cmd_args = sys.argv[1:]
|
2023-08-07 10:11:54 +08:00
|
|
|
|
parser = ArgumentParser(epilog=self.__author__)
|
|
|
|
|
subparsers = parser.add_subparsers(help="子命令")
|
2024-03-08 18:28:43 +08:00
|
|
|
|
from src.rtk._base import SubCmd
|
|
|
|
|
|
2023-08-07 10:11:54 +08:00
|
|
|
|
sub_parser_remote = subparsers.add_parser(SubCmd.remote.value)
|
|
|
|
|
sub_parser_run = subparsers.add_parser(SubCmd.run.value)
|
2023-09-08 16:56:50 +08:00
|
|
|
|
sub_parser_pms = subparsers.add_parser(SubCmd.pmsctl.value)
|
|
|
|
|
sub_parser_csv = subparsers.add_parser(SubCmd.csvctl.value)
|
2024-03-05 18:32:53 +08:00
|
|
|
|
sub_parser_git = subparsers.add_parser(SubCmd.git.value)
|
2023-08-07 10:11:54 +08:00
|
|
|
|
|
|
|
|
|
help_tip = (
|
2023-08-29 18:12:45 +08:00
|
|
|
|
f"\033[0;32mmanage.py\033[0m 支持 \033[0;32m{[i.value for i in SubCmd]}\033[0m 命令, "
|
2024-01-24 15:18:07 +08:00
|
|
|
|
"\n您需要传入一个命令,可以使用 \033[0;32m-h\033[0m 或 \033[0;32m--help\033[0m 查看每个命令参数的详细使用说明,"
|
2023-08-29 18:12:45 +08:00
|
|
|
|
"\n比如: \033[0;32myouqu manage.py run -h\033[0m \n"
|
|
|
|
|
)
|
2023-08-30 10:37:11 +08:00
|
|
|
|
if not self.cmd_args:
|
2023-08-07 10:11:54 +08:00
|
|
|
|
print(help_tip)
|
|
|
|
|
sys.exit(1)
|
2023-08-30 10:37:11 +08:00
|
|
|
|
if self.cmd_args[0] == SubCmd.remote.value:
|
2023-08-07 10:11:54 +08:00
|
|
|
|
remote_kwargs = self.remote_runner(parser, sub_parser_remote)
|
2024-03-08 18:28:43 +08:00
|
|
|
|
from src.rtk.remote_runner import RemoteRunner
|
|
|
|
|
|
2023-08-07 10:11:54 +08:00
|
|
|
|
RemoteRunner(**remote_kwargs).remote_run()
|
2023-08-30 10:37:11 +08:00
|
|
|
|
elif self.cmd_args[0] == SubCmd.run.value:
|
2023-08-07 10:11:54 +08:00
|
|
|
|
_local_kwargs, _ = self.local_runner(parser, sub_parser_run)
|
2024-03-08 18:28:43 +08:00
|
|
|
|
from src.rtk.local_runner import LocalRunner
|
|
|
|
|
|
2023-08-07 10:11:54 +08:00
|
|
|
|
LocalRunner(**_local_kwargs).local_run()
|
2023-09-08 16:56:50 +08:00
|
|
|
|
elif self.cmd_args[0] == SubCmd.pmsctl.value:
|
2023-08-07 10:11:54 +08:00
|
|
|
|
self.pms_control(parser, sub_parser_pms)
|
2023-09-08 16:56:50 +08:00
|
|
|
|
elif self.cmd_args[0] == SubCmd.csvctl.value:
|
|
|
|
|
self.csv_control(parser, sub_parser_csv)
|
2023-08-30 10:37:11 +08:00
|
|
|
|
elif self.cmd_args[0] == SubCmd.startapp.value:
|
2024-03-05 18:32:53 +08:00
|
|
|
|
start_config_log = f"{SubCmd.startapp.value} 后面直接加工程名称"
|
2023-08-07 10:11:54 +08:00
|
|
|
|
try:
|
2023-09-08 16:56:50 +08:00
|
|
|
|
if self.cmd_args[1] in ("-h", "--help"):
|
|
|
|
|
print(start_config_log)
|
|
|
|
|
sys.exit(0)
|
2023-08-30 10:37:11 +08:00
|
|
|
|
self.start_app(self.cmd_args[1])
|
2023-08-07 10:11:54 +08:00
|
|
|
|
except IndexError:
|
2023-09-08 16:56:50 +08:00
|
|
|
|
logger.error(f"参数异常: {start_config_log}")
|
2024-03-05 18:32:53 +08:00
|
|
|
|
elif self.cmd_args[0] == SubCmd.git.value:
|
|
|
|
|
self.git_control(parser, sub_parser_git)
|
2023-08-30 10:37:11 +08:00
|
|
|
|
elif self.cmd_args[0] in ["-h", "--help"]:
|
2023-08-07 10:11:54 +08:00
|
|
|
|
print(help_tip)
|
|
|
|
|
else:
|
2023-08-30 10:37:11 +08:00
|
|
|
|
print(f"参数异常 \033[0;31m{self.cmd_args}\033[0m!\n{help_tip}")
|
2023-08-07 10:11:54 +08:00
|
|
|
|
|
|
|
|
|
def remote_runner(self, parser, sub_parser_remote):
|
|
|
|
|
"""远程执行"""
|
|
|
|
|
sub_parser_remote.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"-c",
|
|
|
|
|
"--clients",
|
|
|
|
|
default="",
|
2023-08-07 10:11:54 +08:00
|
|
|
|
help=(
|
|
|
|
|
"远程机器的user@ip:password,多个机器用'/'连接,"
|
|
|
|
|
"如果password不传入,默认取setting/remote.ini中CLIENT_PASSWORD的值,"
|
2023-09-11 15:56:10 +08:00
|
|
|
|
"比如: uos@10.8.13.xx:1 或 uos@10.8.13.xx"
|
2024-03-08 18:28:43 +08:00
|
|
|
|
),
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
|
|
|
|
sub_parser_remote.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"-s",
|
|
|
|
|
"--send_code",
|
|
|
|
|
action="store_const",
|
|
|
|
|
const=True,
|
|
|
|
|
default=False,
|
|
|
|
|
help="发送代码到测试机(不含report目录)",
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
|
|
|
|
sub_parser_remote.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"-e",
|
|
|
|
|
"--build_env",
|
|
|
|
|
action="store_const",
|
|
|
|
|
const=True,
|
|
|
|
|
default=False,
|
|
|
|
|
help="搭建测试环境,如果为yes,不管send_code是否为yes都会发送代码到测试机.",
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
|
|
|
|
sub_parser_remote.add_argument(
|
2023-09-08 16:56:50 +08:00
|
|
|
|
"-cp", "--client_password", default="", help="测试机密码(全局)"
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
|
|
|
|
sub_parser_remote.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"-y",
|
|
|
|
|
"--parallel",
|
|
|
|
|
default="",
|
2023-08-07 10:11:54 +08:00
|
|
|
|
help=(
|
|
|
|
|
"yes:表示所有测试机并行跑,执行相同的测试用例;"
|
|
|
|
|
"no:表示测试机分布式执行,服务端会根据收集到的测试用例自动分配给各个测试机执行。"
|
2024-03-08 18:28:43 +08:00
|
|
|
|
),
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
|
|
|
|
local_kwargs, args = self.local_runner(parser, sub_parser_remote)
|
2024-03-08 18:28:43 +08:00
|
|
|
|
from src.rtk._base import Args
|
|
|
|
|
|
2023-08-07 10:11:54 +08:00
|
|
|
|
remote_kwargs = {
|
|
|
|
|
Args.clients.value: args.clients or self.default_client,
|
|
|
|
|
Args.send_code.value: args.send_code or self.default_send_code,
|
|
|
|
|
Args.build_env.value: args.build_env or self.default_build_env,
|
|
|
|
|
Args.client_password.value: args.client_password or self.default_client_password,
|
|
|
|
|
Args.parallel.value: args.parallel or self.default_parallel,
|
|
|
|
|
}
|
|
|
|
|
_remote_kwargs = {
|
|
|
|
|
"remote_kwargs": remote_kwargs,
|
|
|
|
|
"local_kwargs": local_kwargs,
|
|
|
|
|
}
|
|
|
|
|
return _remote_kwargs
|
|
|
|
|
|
|
|
|
|
def local_runner(self, parser, sub_parser_run):
|
|
|
|
|
"""本地执行"""
|
|
|
|
|
sub_parser_run.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"-a",
|
|
|
|
|
"--app",
|
|
|
|
|
default="",
|
|
|
|
|
help="应用名称:apps/autotest_deepin_music 或 autotest_deepin_music",
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
|
|
|
|
sub_parser_run.add_argument(
|
|
|
|
|
"-k", "--keywords", default="", help="用例的关键词,支持and/or/not逻辑组合"
|
|
|
|
|
)
|
|
|
|
|
sub_parser_run.add_argument(
|
|
|
|
|
"-t", "--tags", default="", help="用例的标签,支持and/or/not逻辑组合"
|
|
|
|
|
)
|
2024-03-08 18:28:43 +08:00
|
|
|
|
sub_parser_run.add_argument("--rerun", default="", help="失败重跑次数")
|
2023-08-10 20:31:06 +08:00
|
|
|
|
sub_parser_run.add_argument(
|
|
|
|
|
"--record_failed_case", default="", help="失败录屏从第几次失败开始录制视频"
|
|
|
|
|
)
|
2024-03-08 18:28:43 +08:00
|
|
|
|
sub_parser_run.add_argument("--clean", choices=["yes", ""], default="", help="清理环境")
|
|
|
|
|
sub_parser_run.add_argument("--report_formats", default="", help="测试报告格式")
|
|
|
|
|
sub_parser_run.add_argument("--max_fail", default="", help="最大失败率")
|
|
|
|
|
sub_parser_run.add_argument("--log_level", default="", help="日志输出级别")
|
|
|
|
|
sub_parser_run.add_argument("--timeout", default="", help="单条用例超时时间")
|
|
|
|
|
sub_parser_run.add_argument("--resolution", default="", help="检查分辨率")
|
|
|
|
|
sub_parser_run.add_argument("--debug", default="", help="调试模式")
|
2023-08-07 10:11:54 +08:00
|
|
|
|
sub_parser_run.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"--noskip",
|
|
|
|
|
choices=["yes", ""],
|
|
|
|
|
default="",
|
|
|
|
|
help="csv文件里面标记了skip跳过的用例不生效",
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
|
|
|
|
sub_parser_run.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"--ifixed", choices=["yes", ""], default="", help="fixed不生效,仅通过skip跳过用例"
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
|
|
|
|
sub_parser_run.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"--send_pms", choices=["", "async", "finish"], default="", help="数据回填"
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
2024-03-08 18:28:43 +08:00
|
|
|
|
sub_parser_run.add_argument("--task_id", default="", help="测试单ID")
|
2023-08-07 10:11:54 +08:00
|
|
|
|
sub_parser_run.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"--trigger", choices=["", "auto", "hand"], default="", help="触发者"
|
|
|
|
|
)
|
|
|
|
|
sub_parser_run.add_argument("-f", "--case_file", default="", help="根据文件执行用例")
|
|
|
|
|
sub_parser_run.add_argument("--deb_path", default="", help="需要安装deb包的本地路径")
|
|
|
|
|
sub_parser_run.add_argument("-u", "--pms_user", default="", help="pms 用户名")
|
|
|
|
|
sub_parser_run.add_argument("-p", "--pms_password", default="", help="pms 密码")
|
|
|
|
|
sub_parser_run.add_argument("--suite_id", default="", help="pms 测试套ID")
|
|
|
|
|
sub_parser_run.add_argument("--pms_info_file", default="", help="pms 信息文件")
|
|
|
|
|
sub_parser_run.add_argument("--top", default="", help="过程中记录top命令中的值")
|
2023-08-07 10:11:54 +08:00
|
|
|
|
sub_parser_run.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"--lastfailed",
|
|
|
|
|
action="store_const",
|
|
|
|
|
const=True,
|
|
|
|
|
default=False,
|
|
|
|
|
help="仅执行上次失败用例",
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
2023-08-29 18:12:45 +08:00
|
|
|
|
sub_parser_run.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"--duringfail",
|
|
|
|
|
action="store_const",
|
|
|
|
|
const=True,
|
|
|
|
|
default=False,
|
|
|
|
|
help="测试过程中立即显示报错",
|
|
|
|
|
)
|
|
|
|
|
sub_parser_run.add_argument("--repeat", default="", help="指定用例执行次数")
|
|
|
|
|
sub_parser_run.add_argument("--project_name", default="", help="工程名称(写入json文件)")
|
|
|
|
|
sub_parser_run.add_argument("--build_location", default="", help="构建地区(写入json文件)")
|
|
|
|
|
sub_parser_run.add_argument("--line", default="", help="执行的业务线(写入json文件)")
|
|
|
|
|
sub_parser_run.add_argument("--autostart", default="", help="重启类场景开启letmego执行方案")
|
2023-08-07 10:11:54 +08:00
|
|
|
|
args = parser.parse_args()
|
2024-03-08 18:28:43 +08:00
|
|
|
|
from src.rtk._base import Args
|
|
|
|
|
|
2023-08-07 10:11:54 +08:00
|
|
|
|
local_kwargs = {
|
|
|
|
|
Args.app_name.value: args.app or self.default_app,
|
|
|
|
|
Args.keywords.value: args.keywords or self.default_keywords,
|
|
|
|
|
Args.tags.value: args.tags or self.default_tags,
|
|
|
|
|
Args.reruns.value: args.rerun or self.default_rerun,
|
2024-03-08 18:28:43 +08:00
|
|
|
|
Args.record_failed_case.value: args.record_failed_case
|
2024-03-13 18:12:50 +08:00
|
|
|
|
or self.default_record_failed_case,
|
2023-08-07 10:11:54 +08:00
|
|
|
|
Args.clean.value: args.clean or self.default_clean,
|
2024-03-08 18:28:43 +08:00
|
|
|
|
Args.report_formats.value: args.report_formats or self.default_report_formats,
|
2023-08-07 10:11:54 +08:00
|
|
|
|
Args.max_fail.value: args.max_fail or self.default_max_fail,
|
|
|
|
|
Args.log_level.value: args.log_level or self.default_log_level,
|
|
|
|
|
Args.timeout.value: args.timeout or self.default_timeout,
|
|
|
|
|
Args.debug.value: args.debug or self.default_debug,
|
|
|
|
|
Args.noskip.value: args.noskip or self.default_noskip,
|
|
|
|
|
Args.ifixed.value: args.ifixed or self.default_ifixed,
|
|
|
|
|
Args.send_pms.value: args.send_pms or self.default_send_pms,
|
|
|
|
|
Args.task_id.value: args.task_id or self.default_task_id,
|
|
|
|
|
Args.trigger.value: args.trigger or self.default_trigger,
|
|
|
|
|
Args.resolution.value: args.resolution or self.default_resolution,
|
|
|
|
|
Args.case_file.value: args.case_file or self.default_case_file,
|
|
|
|
|
Args.deb_path.value: args.deb_path or self.default_deb_path,
|
|
|
|
|
Args.pms_user.value: args.pms_user or self.default_pms_user,
|
|
|
|
|
Args.pms_password.value: args.pms_password or self.default_pms_password,
|
|
|
|
|
Args.suite_id.value: args.suite_id or self.default_suite_id,
|
|
|
|
|
Args.pms_info_file.value: args.pms_info_file or self.default_pms_info_file,
|
|
|
|
|
Args.top.value: args.top or self.default_top,
|
|
|
|
|
Args.lastfailed.value: args.lastfailed or self.default_lastfailed,
|
|
|
|
|
Args.duringfail.value: args.duringfail or self.default_duringfail,
|
|
|
|
|
Args.repeat.value: args.repeat or self.default_repeat,
|
|
|
|
|
Args.project_name.value: args.project_name or self.default_project_name,
|
|
|
|
|
Args.build_location.value: args.build_location or self.default_build_location,
|
|
|
|
|
Args.line.value: args.line or self.default_line,
|
2023-08-29 18:12:45 +08:00
|
|
|
|
Args.autostart.value: args.autostart or self.default_autostart,
|
2023-08-07 10:11:54 +08:00
|
|
|
|
}
|
2023-08-30 10:37:11 +08:00
|
|
|
|
if local_kwargs.get(Args.autostart.value) or GlobalConfig.AUTOSTART:
|
|
|
|
|
import letmego
|
2024-03-08 18:28:43 +08:00
|
|
|
|
|
2023-08-30 10:37:11 +08:00
|
|
|
|
letmego.conf.setting.PASSWORD = GlobalConfig.PASSWORD
|
|
|
|
|
letmego.register_autostart_service(
|
|
|
|
|
user=GlobalConfig.USERNAME,
|
|
|
|
|
working_directory=GlobalConfig.ROOT_DIR,
|
2024-03-08 18:28:43 +08:00
|
|
|
|
cmd=f"pipenv run python manage.py {' '.join(self.cmd_args)}",
|
2023-08-30 10:37:11 +08:00
|
|
|
|
)
|
2023-08-07 10:11:54 +08:00
|
|
|
|
return local_kwargs, args
|
|
|
|
|
|
|
|
|
|
def pms_control(self, parser=None, sub_parser_pms=None):
|
|
|
|
|
"""pms相关功能命令行参数"""
|
|
|
|
|
sub_parser_pms.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"-a",
|
|
|
|
|
"--app",
|
|
|
|
|
default="",
|
|
|
|
|
help="应用名称:apps/autotest_deepin_music 或 autotest_deepin_music",
|
2023-09-08 16:56:50 +08:00
|
|
|
|
)
|
2024-03-08 18:28:43 +08:00
|
|
|
|
sub_parser_pms.add_argument("-u", "--pms_user", default="", help="pms 用户名")
|
|
|
|
|
sub_parser_pms.add_argument("-p", "--pms_password", default="", help="pms 密码")
|
2023-09-08 16:56:50 +08:00
|
|
|
|
sub_parser_pms.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"-plc",
|
|
|
|
|
"--pms_link_csv",
|
|
|
|
|
default="",
|
|
|
|
|
help="pms 和 csv 的映射关系,比如:music:81/album:82,多个配置使用'/'分隔",
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
|
|
|
|
sub_parser_pms.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"-p2c",
|
|
|
|
|
"--pms2csv",
|
|
|
|
|
action="store_const",
|
|
|
|
|
const=True,
|
|
|
|
|
default=False,
|
|
|
|
|
help="从PMS爬取用例标签到csv文件",
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
|
|
|
|
sub_parser_pms.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"--send2task", choices=["yes", ""], default="", help="回填数据到pms测试单"
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
2024-03-08 18:28:43 +08:00
|
|
|
|
sub_parser_pms.add_argument("--task_id", default="", help="测试单ID")
|
2023-08-07 10:11:54 +08:00
|
|
|
|
sub_parser_pms.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"--trigger", choices=["auto", "hand", ""], default="", help="触发者"
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
|
|
|
|
args = parser.parse_args()
|
2024-03-08 18:28:43 +08:00
|
|
|
|
from src.rtk._base import Args
|
|
|
|
|
|
2023-09-08 16:56:50 +08:00
|
|
|
|
pms_kwargs = {
|
|
|
|
|
Args.app_name.value: args.app or self.default_app,
|
|
|
|
|
Args.pms_user.value: args.pms_user or self.default_pms_user,
|
|
|
|
|
Args.pms_password.value: args.pms_password or self.default_pms_password,
|
|
|
|
|
Args.pms2csv.value: args.pms2csv or self.default_pms2csv,
|
|
|
|
|
Args.pms_link_csv.value: args.pms_link_csv or self.default_pms_link_csv,
|
|
|
|
|
Args.send2task.value: args.send2task or self.default_send2task,
|
|
|
|
|
Args.task_id.value: args.task_id or GlobalConfig.TASK_ID,
|
|
|
|
|
Args.trigger.value: args.trigger or GlobalConfig.TRIGGER,
|
|
|
|
|
}
|
|
|
|
|
if pms_kwargs.get(Args.pms2csv.value):
|
2024-03-08 18:28:43 +08:00
|
|
|
|
from src.pms.pms2csv import Pms2Csv
|
|
|
|
|
|
2023-09-08 16:56:50 +08:00
|
|
|
|
Pms2Csv(
|
|
|
|
|
app_name=pms_kwargs.get(Args.app_name.value),
|
|
|
|
|
user=pms_kwargs.get(Args.pms_user.value) or GlobalConfig.PMS_USER,
|
|
|
|
|
password=pms_kwargs.get(Args.pms_password.value) or GlobalConfig.PMS_PASSWORD,
|
|
|
|
|
pms_link_csv=pms_kwargs.get(Args.pms_link_csv.value),
|
|
|
|
|
).write_new_csv()
|
2023-09-11 15:56:10 +08:00
|
|
|
|
elif (
|
2024-03-13 18:12:50 +08:00
|
|
|
|
pms_kwargs.get(Args.send2task.value)
|
|
|
|
|
and pms_kwargs.get(Args.task_id.value)
|
|
|
|
|
and pms_kwargs.get(Args.trigger.value) == "hand"
|
2023-09-11 15:56:10 +08:00
|
|
|
|
):
|
2024-03-08 18:28:43 +08:00
|
|
|
|
from src.pms.send2pms import Send2Pms
|
|
|
|
|
|
2023-08-07 10:11:54 +08:00
|
|
|
|
Send2Pms().send2pms(
|
2023-09-08 16:56:50 +08:00
|
|
|
|
Send2Pms.case_res_path(pms_kwargs.get(Args.task_id.value)),
|
2024-03-08 18:28:43 +08:00
|
|
|
|
Send2Pms.data_send_result_csv(pms_kwargs.get(Args.trigger.value)),
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
2023-09-27 17:46:59 +08:00
|
|
|
|
else:
|
|
|
|
|
raise ValueError
|
2023-08-07 10:11:54 +08:00
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def start_app(startapp=None):
|
|
|
|
|
"""新建app工程"""
|
|
|
|
|
if startapp:
|
2024-03-08 18:28:43 +08:00
|
|
|
|
from src.startapp import StartApp
|
|
|
|
|
|
2023-08-07 10:11:54 +08:00
|
|
|
|
start = StartApp(startapp)
|
|
|
|
|
start.copy_template_to_apps()
|
|
|
|
|
start.rewrite()
|
|
|
|
|
|
2023-09-08 16:56:50 +08:00
|
|
|
|
def csv_control(self, parser=None, sub_parser_csv=None):
|
|
|
|
|
"""csv相关功能命令参数"""
|
|
|
|
|
sub_parser_csv.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"-a",
|
|
|
|
|
"--app",
|
|
|
|
|
default="",
|
|
|
|
|
help="应用名称:apps/autotest_deepin_music 或 autotest_deepin_music",
|
2023-08-07 10:11:54 +08:00
|
|
|
|
)
|
2024-03-08 18:28:43 +08:00
|
|
|
|
sub_parser_csv.add_argument("-k", "--keywords", default="", help="用例的关键词")
|
|
|
|
|
sub_parser_csv.add_argument("-t", "--tags", default="", help="用例的标签")
|
2023-09-08 16:56:50 +08:00
|
|
|
|
sub_parser_csv.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"-p2c",
|
|
|
|
|
"--pyid2csv",
|
|
|
|
|
action="store_const",
|
|
|
|
|
const=True,
|
|
|
|
|
default=False,
|
|
|
|
|
help="将用例py文件的case id同步到对应的csv文件中",
|
2023-09-08 16:56:50 +08:00
|
|
|
|
)
|
|
|
|
|
sub_parser_csv.add_argument(
|
2023-09-11 15:56:10 +08:00
|
|
|
|
"-ec", "--export_csv_file", default="", help="导出csv文件名称,比如:case_list.csv"
|
2023-09-08 16:56:50 +08:00
|
|
|
|
)
|
2023-08-07 10:11:54 +08:00
|
|
|
|
args = parser.parse_args()
|
2024-03-08 18:28:43 +08:00
|
|
|
|
from src.rtk._base import Args
|
|
|
|
|
|
2023-09-08 16:56:50 +08:00
|
|
|
|
csv_kwargs = {
|
2023-08-07 10:11:54 +08:00
|
|
|
|
Args.app_name.value: args.app or self.default_app,
|
|
|
|
|
Args.keywords.value: args.keywords or self.default_keywords,
|
|
|
|
|
Args.tags.value: args.tags or self.default_tags,
|
2024-03-08 18:28:43 +08:00
|
|
|
|
Args.pyid2csv.value: args.pyid2csv
|
2024-03-13 18:12:50 +08:00
|
|
|
|
or self.default_pyid2csv
|
|
|
|
|
or GlobalConfig.PY_ID_TO_CSV,
|
2023-09-08 16:56:50 +08:00
|
|
|
|
Args.export_csv_file.value: args.export_csv_file or self.default_export_csv_file,
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"collection_only": True,
|
2023-08-07 10:11:54 +08:00
|
|
|
|
}
|
2023-09-08 16:56:50 +08:00
|
|
|
|
if csv_kwargs.get(Args.pyid2csv.value) or GlobalConfig.PY_ID_TO_CSV:
|
|
|
|
|
from src.csvctl import CsvControl
|
2024-03-08 18:28:43 +08:00
|
|
|
|
|
2023-09-11 13:07:59 +08:00
|
|
|
|
_csv = CsvControl(csv_kwargs.get(Args.app_name.value))
|
|
|
|
|
_csv.delete_mark_in_csv_if_not_exists_py()
|
|
|
|
|
_csv.async_mark_to_csv()
|
2023-09-28 17:29:06 +08:00
|
|
|
|
elif csv_kwargs.get(Args.export_csv_file.value):
|
2024-03-08 18:28:43 +08:00
|
|
|
|
from src.rtk.local_runner import LocalRunner
|
|
|
|
|
|
2023-09-28 17:29:06 +08:00
|
|
|
|
LocalRunner(**csv_kwargs).local_run()
|
2023-09-08 16:56:50 +08:00
|
|
|
|
else:
|
2023-09-08 17:22:50 +08:00
|
|
|
|
logger.error(
|
|
|
|
|
f"需要传递一些有用参数或配置项:{Args.pyid2csv.value} 或 {Args.export_csv_file.value}"
|
|
|
|
|
",您可以使用 -h 或 --help 查看支持的参数"
|
|
|
|
|
)
|
2023-08-07 10:11:54 +08:00
|
|
|
|
|
2024-03-05 18:32:53 +08:00
|
|
|
|
def git_control(self, parser=None, sub_parser_csv=None):
|
2024-03-06 14:44:27 +08:00
|
|
|
|
"""git相关功能命令参数"""
|
2024-03-05 18:32:53 +08:00
|
|
|
|
sub_parser_csv.add_argument(
|
2024-03-08 18:28:43 +08:00
|
|
|
|
"-a",
|
|
|
|
|
"--app",
|
|
|
|
|
default="",
|
|
|
|
|
help="应用名称:apps/autotest_deepin_music 或 autotest_deepin_music",
|
|
|
|
|
)
|
|
|
|
|
sub_parser_csv.add_argument("-u", "--user", default="", help="git仓库用户名")
|
|
|
|
|
sub_parser_csv.add_argument("-p", "--password", default="", help="git仓库地密码")
|
|
|
|
|
sub_parser_csv.add_argument("-l", "--url", default="", help="git仓库地址")
|
|
|
|
|
sub_parser_csv.add_argument("-b", "--branch", default="", help="分支")
|
|
|
|
|
sub_parser_csv.add_argument("-d", "--depth", default="", help="git仓库克隆深度")
|
|
|
|
|
sub_parser_csv.add_argument("-s", "--startdate", default="", help="统计开始时间")
|
|
|
|
|
sub_parser_csv.add_argument("-e", "--enddate", default="", help="统计结束时间")
|
2024-03-05 18:32:53 +08:00
|
|
|
|
args = parser.parse_args()
|
2024-03-08 18:28:43 +08:00
|
|
|
|
from src.rtk._base import Args
|
|
|
|
|
|
2024-03-05 18:32:53 +08:00
|
|
|
|
git_kwargs = {
|
|
|
|
|
Args.app_name.value: args.app or self.default_app,
|
|
|
|
|
Args.url.value: args.url or self.default_url,
|
|
|
|
|
Args.user.value: args.user or self.default_git_user,
|
|
|
|
|
Args.password.value: args.password or self.default_git_password,
|
|
|
|
|
Args.branch.value: args.branch or self.default_branch,
|
|
|
|
|
Args.depth.value: args.depth or self.default_depth,
|
2024-03-06 14:44:27 +08:00
|
|
|
|
Args.startdate.value: args.startdate or self.default_startdate,
|
|
|
|
|
Args.enddate.value: args.enddate or self.default_enddate,
|
2024-03-05 18:32:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
from src.git.check import check_git_installed
|
|
|
|
|
|
|
|
|
|
if git_kwargs.get(Args.url.value):
|
|
|
|
|
if all(
|
2024-03-13 18:12:50 +08:00
|
|
|
|
[
|
|
|
|
|
git_kwargs.get(Args.user.value),
|
|
|
|
|
git_kwargs.get(Args.password.value),
|
|
|
|
|
]
|
2024-03-05 18:32:53 +08:00
|
|
|
|
):
|
|
|
|
|
from src.git.clone import sslclone as git_clone
|
|
|
|
|
else:
|
|
|
|
|
from src.git.clone import clone as git_clone
|
|
|
|
|
check_git_installed()
|
|
|
|
|
git_clone(**git_kwargs)
|
|
|
|
|
|
|
|
|
|
if all(
|
2024-03-13 18:12:50 +08:00
|
|
|
|
[
|
|
|
|
|
git_kwargs.get(Args.app_name.value),
|
2024-03-15 17:51:26 +08:00
|
|
|
|
git_kwargs.get(Args.startdate.value),
|
2024-03-13 18:12:50 +08:00
|
|
|
|
]
|
2024-03-05 18:32:53 +08:00
|
|
|
|
):
|
|
|
|
|
from src.git.code_statistics import CodeStatistics
|
2024-03-08 18:28:43 +08:00
|
|
|
|
|
2024-03-05 18:32:53 +08:00
|
|
|
|
check_git_installed()
|
2024-03-08 13:29:36 +08:00
|
|
|
|
CodeStatistics(**git_kwargs).codex()
|
2024-03-05 18:32:53 +08:00
|
|
|
|
|
2023-09-11 15:56:10 +08:00
|
|
|
|
|
2023-08-07 10:11:54 +08:00
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
try:
|
|
|
|
|
Manage()
|
|
|
|
|
except Exception as exc:
|
|
|
|
|
traceback.print_exception(*sys.exc_info())
|