Exemple #1
0
def get_test_case(pro_name):
    """
    根据项目获取测试用例列表(上线的排在前面)
    :param pro_name:
    :return: 返回值
    """
    test_case_list = []
    on_line_list = []
    off_line_list = []
    with MongodbUtils(ip=cfg.MONGODB_ADDR,
                      database=cfg.MONGODB_DATABASE,
                      collection=pro_name) as pro_db:
        try:
            results = pro_db.find({}, {"_id": 0})
            for res in results:
                test_case_dict = dict()
                test_case_dict["case_status"] = res.get("case_status")
                test_case_dict["test_case_name"] = res.get("test_case_name")
                test_case_dict["test_class_name"] = res.get("test_class_name")
                test_case_dict["test_method_name"] = res.get(
                    "test_method_name")
                test_case_dict["run_status"] = res.get("run_status")
                test_case_dict["start_time"] = res.get("start_time")
                test_case_dict["run_time"] = res.get("run_time")
                test_case_dict["create_time"] = res.get("create_time")
                if res.get("case_status"):
                    on_line_list.append(test_case_dict)
                else:
                    off_line_list.append(test_case_dict)
            test_case_list = on_line_list + off_line_list
        except Exception as e:
            mongo_exception_send_DD(e=e, msg="获取'" + pro_name + "'项目测试用例列表")
            return "mongo error"
        finally:
            return test_case_list
Exemple #2
0
def get_progress_info(pro_name):
    """
    获取项目用例执行进度信息:总执行数(上线数)、已执行数(上线数中'已停止'的数量)、进度百分比
    :param pro_name:
    :return:
    """
    with MongodbUtils(ip=cfg.MONGODB_ADDR, database=cfg.MONGODB_DATABASE, collection=pro_name) as pro_db:
        try:
            progress_info = dict()
            results = pro_db.find({"case_status": True})
            on_line_run_status_list = [res.get("run_status") for res in results]
            run_num = len(on_line_run_status_list)
            if run_num == 0:
                progress_info["run_num"] = 0
                progress_info["done_num"] = 0
                progress_info["percent"] = 0
            else:
                progress_info["run_num"] = run_num
                # 将 '上线的运行状态列表'中'run_status=stopping'的运行状态保存入列表
                has_stop_run_status_list = [run_status for run_status in on_line_run_status_list if run_status == "stopping"]
                stop_num = len(has_stop_run_status_list)
                progress_info["done_num"] = stop_num
                # 计算百分比
                percent = int(float(stop_num) / float(run_num) * 100)
                progress_info["percent"] = percent
            return progress_info
        except Exception as e:
            mongo_exception_send_DD(e=e, msg="获取'" + pro_name + "项目用例执行进度信息")
            return "mongo error"
Exemple #3
0
def stop_case_run_status(pro_name, test_method_name):
    """
    停止测试用例:设置用例的'运行状态=stopping'和'运行时间'
    :param pro_name:
    :param test_method_name:
    :return:
    """
    from Tools.mongodb import MongodbUtils
    with MongodbUtils(ip=cfg.MONGODB_ADDR,
                      database=cfg.MONGODB_DATABASE,
                      collection=pro_name) as pro_db:
        try:
            # 获取 开始时间
            query_dict = {"test_method_name": test_method_name}
            result = pro_db.find_one(query_dict, {"_id": 0})
            start_time = result.get("start_time")
            # 获取 当前时间
            now_str = time.strftime("%Y-%m-%dT%H:%M:%S",
                                    time.localtime(time.time()))
            now_time = parser.parse(now_str)
            # 更新数据
            update_dict = {
                "$set": {
                    "run_status": "stopping",
                    "run_time": str(now_time - start_time)
                }
            }
            print(update_dict)
            pro_db.update(query_dict, update_dict)
        except Exception as e:
            mongo_exception_send_DD(e=e, msg="停止'" + pro_name + "'项目中的测试用例")
            return "mongo error"
Exemple #4
0
    def get_online_case_to_suite(pro_name, connected_android_device_list=[]):
        """
        将'测试类'列表中的'上线'的'测试方法'添加入 suite 实例对象中
        :param pro_name:
        :param connected_android_device_list: 已连接设备信息列表
        :return:
        【 添 加 步 骤 】
        1.从mongo中获取'上线'状态的'测试用例'列表
        2.重置 上线用例的'运行状态:pending、开始时间:----、运行时间:----'
        3.通过'项目名称'获取'测试类'列表
        4.循环获取'测试类'列表中的所有'测试方法名称'
        5.将这些'测试方法名称'与mongo中'上线'的'测试方法名称'作比较
        6.匹配成功的,则实例化'测试类'时,并添加入'suite'实例对象中
        【 备 注 】
          实例化'测试类'时,必须带上该类中存在的以'test_'开头的方法名
        """
        with MongodbUtils(ip=cfg.MONGODB_ADDR,
                          database=cfg.MONGODB_DATABASE,
                          collection=pro_name) as pro_db:
            try:
                # 获取上线用例列表
                query_dict = {"case_status": True}
                results = pro_db.find(query_dict, {"_id": 0})
                on_line_test_method_name_list = [
                    result.get("test_method_name") for result in results
                ]
                # 重置 上线用例的'运行状态:pending、开始时间:----、运行时间:----'
                update_dict = {
                    "$set": {
                        "run_status": "pending",
                        "start_time": "----",
                        "run_time": "----"
                    }
                }
                pro_db.update(query_dict, update_dict, multi=True)
            except Exception as e:
                on_line_test_method_name_list = []
                mongo_exception_send_DD(e=e,
                                        msg="获取'" + pro_name + "'项目'上线'测试用例数据")
                return "mongo error", on_line_test_method_name_list

        from Config.pro_config import get_test_class_list
        test_class_list = get_test_class_list(pro_name)
        test_loader = unittest.TestLoader()
        suite = unittest.TestSuite()
        for test_class in test_class_list:
            test_methods_name = test_loader.getTestCaseNames(test_class)
            for test_method_name in test_methods_name:
                if test_method_name in on_line_test_method_name_list:  # 匹配'测试方法'名称
                    test_instance = test_class(pro_name=pro_name,
                                               test_method=test_method_name,
                                               connected_android_device_list=
                                               connected_android_device_list)
                    suite.addTest(test_instance)
        return suite, on_line_test_method_name_list
Exemple #5
0
def stop_case_run_status(pro_name):
    """
    强行修改项目用例运行状态 -> 停止
    :param pro_name:
    :return:
    """
    with MongodbUtils(ip=cfg.MONGODB_ADDR, database=cfg.MONGODB_DATABASE, collection=pro_name) as pro_db:
        try:
            update_dict = {"$set": {"run_status": "stopping"}}
            pro_db.update({}, update_dict, multi=True)
            return True
        except Exception as e:
            mongo_exception_send_DD(e=e, msg="强行修改'" + pro_name + "'项目用例运行状态")
            return "mongo error"
Exemple #6
0
def is_exist_online_case(pro_name):
    """
    判断项目是否存在 上线的用例
    :param pro_name:
    :return:
    """
    from Tools.mongodb import MongodbUtils
    with MongodbUtils(ip=cfg.MONGODB_ADDR, database=cfg.MONGODB_DATABASE, collection=pro_name) as pro_db:
        try:
            results = pro_db.find({}, {"_id": 0})
            case_status_list = [res.get("case_status") for res in results]
        except Exception as e:
            mongo_exception_send_DD(e=e, msg="获取'" + pro_name + "'项目测试用例列表")
            return "mongo error"
    return True in case_status_list and True or False
Exemple #7
0
def case_import_mongo(pro_name):
    """
    更新项目测试用例数据 同步入mongo库中,默认状态为'下线'
    :param pro_name:
    :return:
    【 备 注 】
    1.run_status :运行状态 ( pending 待运行、runninng 运行中、stopping 已停止)
    2.start_time :运行开始时间
    3.run_time :运行时间
    """
    test_class_list = get_test_class_list(pro_name)
    if test_class_list:
        insert_list = []
        test_loader = unittest.TestLoader()
        for test_class in test_class_list:
            test_methods_name = test_loader.getTestCaseNames(test_class)
            for test_method_name in test_methods_name:
                # 生成'测试方法'的实例对象,并反射获取'测试方法'
                test_instance = test_class(pro_name=pro_name,
                                           test_method=test_method_name)
                testMethod = getattr(test_instance, test_method_name)
                # 获取'测试方法'中的备注,作为'测试用例名称'
                test_case_name = testMethod.__doc__.split("\n")[0].strip()
                test_case_dict = {}
                test_case_dict["pro_name"] = pro_name
                test_case_dict["test_class_name"] = test_class.__name__
                test_case_dict["test_method_name"] = test_method_name
                test_case_dict["test_case_name"] = test_case_name
                test_case_dict["case_status"] = False
                test_case_dict["run_status"] = "stopping"
                test_case_dict["start_time"] = "----"
                test_case_dict["run_time"] = "----"
                test_case_dict["create_time"] = get_current_iso_date()
                insert_list.append(test_case_dict)
        # 将'测试用例'列表更新入对应项目的数据库中
        with MongodbUtils(ip=cfg.MONGODB_ADDR,
                          database=cfg.MONGODB_DATABASE,
                          collection=pro_name) as pro_db:
            try:
                pro_db.drop()
                pro_db.insert_many(insert_list)
            except Exception as e:
                mongo_exception_send_DD(e=e,
                                        msg="更新'" + pro_name + "'项目测试用例数据")
                return "mongo error"
        return insert_list
    else:
        return "no such pro"
Exemple #8
0
def start_case_run_status(pro_name, test_method_name):
    """
    启动测试用例:设置用例的'运行状态=running'和'开始时间'
    :param pro_name:
    :param test_method_name:
    :return:
    """
    from Tools.mongodb import MongodbUtils
    with MongodbUtils(ip=cfg.MONGODB_ADDR, database=cfg.MONGODB_DATABASE, collection=pro_name) as pro_db:
        try:
            query_dict = {"test_method_name": test_method_name}
            update_dict = {"$set": {"run_status": "running", "start_time": get_current_iso_date()}}
            pro_db.update(query_dict, update_dict, multi=True)
        except Exception as e:
            mongo_exception_send_DD(e=e, msg="启动'" + pro_name + "'项目中的测试用例")
            return "mongo error"
Exemple #9
0
def update_case_status_all(pro_name, case_status=False):
    """
    更新项目所有测试用例状态(上下线)
    :param pro_name:
    :param case_status:
    :return: 返回 test_method_name_list 列表
    """
    with MongodbUtils(ip=cfg.MONGODB_ADDR, database=cfg.MONGODB_DATABASE, collection=pro_name) as pro_db:
        try:
            update_dict = {"$set": {"case_status": case_status}}
            pro_db.update({}, update_dict, multi=True)
            results = pro_db.find({}, {"_id": 0})
            return [res.get("test_method_name") for res in results]
        except Exception as e:
            mongo_exception_send_DD(e=e, msg="更新'" + pro_name + "'项目所有测试用例状态")
            return "mongo error"
Exemple #10
0
def import_mongodb(pro_name, excel_list, import_method):
    """
    将excel中的用例按照导入方式,导入mongo
    :param pro_name
    :param excel_list:
    :param import_method: 导入方式(batch_insert、all_replace、batch_insert_and_replace)
    :return:

    【 备 注 】
    all_replace:先清空数据库,然后全部插入
    batch_insert:先找出不在数据库中的用例列表,然后插入
    batch_insert_and_replace:先区分'不在数据库中的用例列表'和'需要更新的用例列表',分别执行插入和更新操作

    【 步 骤 】

    """
    with MongodbUtils(ip=cfg.MONGODB_ADDR, database=cfg.MONGODB_DATABASE, collection=pro_name) as pro_db:
        try:

            if import_method == "all_replace":
                pro_db.drop()
                pro_db.insert_many(filled_other_field(excel_list))
            else:
                # 获取数据库中的'接口名称列表'
                all_case_in_db = pro_db.find()
                interface_name_list_in_db = [case.get("interface_name") for case in all_case_in_db]
                # 区分'不在数据库中的用例列表'和'需要更新的用例列表'
                update_list = []
                insert_list = []
                for index, line_dict in enumerate(excel_list):
                    if line_dict["interface_name"] in interface_name_list_in_db:
                        update_list.append(line_dict)
                    else:
                        insert_list.append(line_dict)
                print(insert_list)
                print(update_list)
                # 插入新增的数据
                if not is_null(insert_list):
                    pro_db.insert_many(filled_other_field(insert_list))
                # 更新数据
                if not is_null(update_list) and import_method == "batch_insert_and_replace":
                    for line_dict in update_list:
                        line_dict["update_time"] = get_current_iso_date()
                        query_dict = {"interface_name": line_dict["interface_name"]}
                        update_dict = {"$set": line_dict}
                        pro_db.update(query_dict, update_dict)
Exemple #11
0
def is_exist_start_case(pro_name):
    """
    判断项目是否存在 启动的用例(pending、running)
    :param pro_name:
    :return:
      判断逻辑:若存在'pending'或'running',则表示存在启动的用例
      备注:若返回'mongo error', 默认表示'存在'运行中的用例
    """
    from Tools.mongodb import MongodbUtils
    with MongodbUtils(ip=cfg.MONGODB_ADDR, database=cfg.MONGODB_DATABASE, collection=pro_name) as pro_db:
        try:
            results = pro_db.find({}, {"_id": 0})
            run_status_list = [res.get("run_status") for res in results]
        except Exception as e:
            mongo_exception_send_DD(e=e, msg="获取'" + pro_name + "'项目测试用例列表")
            return "mongo error"
    return "pending" in run_status_list or "running" in run_status_list
Exemple #12
0
def update_case_status(pro_name, test_method_name):
    """
    更新项目测试用例状态
    :param pro_name:
    :param test_method_name:
    :return:
    """
    with MongodbUtils(ip=cfg.MONGODB_ADDR, database=cfg.MONGODB_DATABASE, collection=pro_name) as pro_db:
        try:
            query_dict = {"test_method_name": test_method_name}
            result = pro_db.find_one(query_dict, {"_id": 0})
            old_case_status = result.get("case_status")
            new_case_status = bool(1 - old_case_status)  # 布尔值取反
            update_dict = {"$set": {"case_status": new_case_status}}
            pro_db.update_one(query_dict, update_dict)
            return new_case_status
        except Exception as e:
            mongo_exception_send_DD(e=e, msg="更新'" + pro_name + "'项目测试用例状态(单个)")
            return "mongo error"
Exemple #13
0
def get_case_run_status(pro_name):
    """
    获取项目用例的运行状态
    :param pro_name:
    :return:
    """
    case_run_status_list = []
    with MongodbUtils(ip=cfg.MONGODB_ADDR, database=cfg.MONGODB_DATABASE, collection=pro_name) as pro_db:
        try:
            results = pro_db.find({"case_status": True}, {"_id": 0})
            for res in results:
                test_case_dict = dict()
                test_case_dict["test_method_name"] = res.get("test_method_name")
                test_case_dict["run_status"] = res.get("run_status")
                test_case_dict["start_time"] = str(res.get("start_time"))
                test_case_dict["run_time"] = str(res.get("run_time"))
                case_run_status_list.append(test_case_dict)
            return case_run_status_list
        except Exception as e:
            mongo_exception_send_DD(e=e, msg="获取'" + pro_name + "'项目用例的运行状态")
            return "mongo error"