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
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"
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"
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
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"
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
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"
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"
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"
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)
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
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"
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"