Example #1
0
def checkDatabase(databaseExpect, databaseResult, result, fact):
    if databaseResult is None:
        result[FACT] = fact.text
        result[ISPASS] = BLOCK
        result[TIME] = get_now().strftime(FORMORT)
        result[REASON] = "用例sql语句书写错误"
        return
    if databaseExpect:
        result[DATABASEEXPECT] = databaseExpect
    else:
        result[DATABASEEXPECT] = " "
    if not databaseResult:
        result[DATABASERESUTL] = " "
    if databaseResult is not "" and databaseExpect is "":
        result[ISPASS] = BLOCK
        result[FACT] = fact.text
        result[TIME] = get_now().strftime(FORMORT)
        result[REASON] = "数据库检查点未设置"
        return
    if databaseExpect:
        if int(databaseExpect) == len(databaseResult):
            result[FACT] = fact.text
            result[ISPASS] = PASS
            result[TIME] = get_now().strftime(FORMORT)
        else:
            result[FACT] = fact.text
            result[ISPASS] = FAIL
            result[TIME] = get_now().strftime(FORMORT)
            result[REASON] = "数据库检查失败,预期返回{}条数据,实际返回{}条数据".format(int(databaseExpect),
                                                                  len(databaseResult))
Example #2
0
def update_message(number):
    """
    更新t_user_verify表信息
    :param number: 用户手机号,从apiParams中获取
    :return:
    """
    result = con_server.query_one(
        "select * from t_user_verify where number ={}".format(number))
    # 十分钟前的时间
    timedelta = datetime.datetime.now() - datetime.timedelta(minutes=10)
    if not result:
        con_server.insert_data("t_user_verify",
                               number=number,
                               call_sid=generate_random_str(32),
                               verify="4883",
                               date_created=get_now().strftime(FORMORT),
                               status=1)
        return
    if result["date_created"] < timedelta:
        sql = "update t_user_verify set date_created='{}'where number={}". \
            format(get_now().strftime(FORMORT), number)
        con_server.update_data(sql)
    if result["status"] == 0:
        con_server.update_data(
            "update t_user_verify set status=1 where number={}".format(number))
Example #3
0
def checkDatabase(databaseExpect, databaseResult, result, fact):
    """
    数据库验证
    :param databaseExpect: 数据库期望
    :param databaseResult: sql执行结果
    :param result: 报告模板
    :param fact: 接口返回实际结果
    :return:
    """
    if databaseExpect:
        result[DATABASEEXPECT] = json.dumps(databaseExpect, ensure_ascii=False)
    else:
        result[DATABASEEXPECT] = " "
    if not databaseResult:
        result[DATABASERESUTL] = " "
    if databaseExpect and databaseResult:
        for key, values in databaseExpect.items():
            value = values.split(",") or values.split(",")
            for i in value:
                k, v = i.split("=")
                if k is None or v is None:
                    result[FACT] = fact.text
                    result[ISPASS] = BLOCK
                    result[TIME] = get_now().strftime(FORMORT)
                    result[REASON] = "用例sql语句书写错误"
                    return
                if k == "len":
                    if str(len(databaseResult[key])) != v:
                        result[FACT] = fact.text
                        result[ISPASS] = FAIL
                        result[TIME] = get_now().strftime(FORMORT)
                        result[REASON] = "数据库{}检查点检查失败,预期返回{}条数据,实际返回{}条数据" \
                            .format(k, v, len(databaseResult[key]))
                    continue
                if k not in databaseResult[key][0].keys():
                    result[FACT] = fact.text
                    result[ISPASS] = BLOCK
                    result[TIME] = get_now().strftime(FORMORT)
                    result[REASON] = "用例sql语句书写错误或数据库返回错误,{}不在数据库返回字段中" \
                        .format(k)
                    return
                if str(databaseResult[key][0][k]) != v:
                    result[FACT] = fact.text
                    result[ISPASS] = FAIL
                    result[TIME] = get_now().strftime(FORMORT)
                    result[REASON] = "数据库{}.{}检查点检查失败,预期为:{},实际为:{}" \
                        .format(key, k, v, databaseResult[key][0][k])
                    return
Example #4
0
def updata_message(number):
    result = con_server.query_one("select * from t_user_verify where number ={}".format(number))
    timedelta = datetime.datetime.now() - datetime.timedelta(minutes=10)  # 十分钟前的时间
    if not result:
        con_server.insert_data("t_user_verify", number=number, call_sid=generate_random_str(32), verify="4883",
                               date_created=get_now().strftime(FORMORT),
                               status=1)
        return
    if result["date_created"] < timedelta:
        sql = f"update t_user_verify set date_created='{get_now().strftime(FORMORT)}'where number={number}"
        con_server.update_data(sql)
    if result["status"] == 0:
        con_server.update_data(
            "update t_user_verify set status=1 where number={}".format(number)
        )
Example #5
0
def check(fact, expect, result):
    if "ERRRR" in fact:
        result[ISPASS] = FAIL
        result[REASON] = fact
        result[TIME] = get_now().strftime(FORMORT)
        return
    try:
        response = fact.json()
        temp = ""
        if not expect:
            result[ISPASS] = BLOCK
            result[FACT] = fact.text
            result[TIME] = get_now().strftime(FORMORT)
            result[REASON] = "检查点未设置"
            return
        for key in expect.keys():
            if key not in response.keys():
                result[FACT] = fact.text
                result[ISPASS] = FAIL
                result[TIME] = get_now().strftime(FORMORT)
                result[REASON] = "实际结果中没有{}这个字段,检查用例是否错误或接口返回结果错误".format(key)
                return
            if not isinstance(expect[key], dict):
                # 判断检查点中的字段是否在响应结果中
                # 判断检查点中字段的值和返回结果字段的值是否一致
                if not str(expect[key]).__eq__(str(response[key])):
                    result[FACT] = fact.text
                    result[ISPASS] = FAIL
                    result[TIME] = get_now().strftime(FORMORT)
                    temp += "{}的值预期为:{},实际为:{}\n".format(key, expect[key], response[key])
                    result[REASON] = temp
                else:
                    # 判断是否有检查点判断失败,如果有,ispass值仍然为fail
                    if result[ISPASS].__eq__(FAIL):
                        result[ISPASS] = FAIL
                    else:
                        result[FACT] = fact.text
                        result[ISPASS] = PASS
                    result[TIME] = get_now().strftime(FORMORT)
            # 判断双重检查点,例如payload.message的形式
            else:
                for key1 in expect[key].keys():
                    if not key1 in response[key].keys():
                        result[FACT] = fact.text
                        result[ISPASS] = FAIL
                        result[TIME] = get_now().strftime(FORMORT)
                        result[REASON] = "实际结果中没有{}:{}这个字段,检查用例是否错误或接口返回结果错误".format(key, key1)
                        return
                    if str(response[key][key1]).__eq__(str(expect[key][key1])):
                        result[FACT] = fact.text
                        result[ISPASS] = PASS
                        result[TIME] = get_now().strftime(FORMORT)
                    else:
                        result[FACT] = fact.text
                        result[ISPASS] = FAIL
                        result[TIME] = get_now().strftime(FORMORT)
                        temp += "{}的值预期为:{},实际为:{}\n".format(key, expect[key], response[key])
                        result[REASON] = temp
    except Exception as e:
        result[ISPASS] = FAIL
        result[FACT] = ""
        result[TIME] = get_now().strftime(FORMORT)
        result[REASON] = "程序出错:{}".format(str(e))
        log.error(e)
        return
Example #6
0
def check(fact, expect, result):
    """
    弃用
    检查点验证
    :param fact:实际结果
    :param expect: 预期结果
    :param result: 报告模板
    :return:
    """
    if "ERRRR" in fact:
        result[ISPASS] = FAIL
        result[REASON] = fact
        result[TIME] = get_now().strftime(FORMORT)
        return
    if isinstance(fact, tuple):
        result[PARMAS] = json.dumps(fact[-1], ensure_ascii=False)
        fact = fact[0]
    else:
        try:
            response = fact.json()
        except:
            if "err_code" in expect.keys():
                if expect["err_code"] != fact.status_code:
                    result[FACT] = fact.text
                    result[ISPASS] = FAIL
                    result[TIME] = get_now().strftime(FORMORT)
                    reason = "{}的值预期为:{},实际为:{}" \
                        .format("err_code", expect["err-code"], fact.status_code)
                    result[REASON] = reason
                else:
                    # 判断是否有检查点判断失败,如果有,ispass值仍然为fail
                    if result[ISPASS].__eq__(FAIL):
                        result[ISPASS] = FAIL
                    else:
                        result[FACT] = fact.text
                        result[ISPASS] = PASS
                    result[TIME] = get_now().strftime(FORMORT)
        temps = ""
        if not expect:
            result[ISPASS] = BLOCK
            result[FACT] = fact.text
            result[EXPECT] = " "
            result[TIME] = get_now().strftime(FORMORT)
            result[REASON] = "检查点未设置或用例检查点格式错误"
            return
        # temp_except = expect
        # temp_response = response
        for keys in expect.keys():
            index = 0
            value = expect[keys]
            if "," in value:
                value = value.split(",")
            if "," in value:
                value = value.split(",")
            item = keys.split(".")
            temp_response = response
            r = re.compile(r"\[(.*?)]")
            for key in item:
                if key not in temp_response:
                    result[FACT] = fact.text
                    result[ISPASS] = FAIL
                    result[TIME] = get_now().strftime(FORMORT)
                    result[REASON] = "实际结果中没有{}这个字段," \
                                     "检查用例是否错误或接口返回结果错误".format(key)
                    return
                temp_response = temp_response[key]
                if index == len(item) - 1:
                    if isinstance(temp_response, list):
                        if not temp_response and value:
                            result[FACT] = fact.text
                            result[ISPASS] = FAIL
                            result[TIME] = get_now().strftime(FORMORT)
                            result[REASON] = "{}实际返回为空,预期不为空".format(key)
                            return
                        if not value and temp_response:
                            result[FACT] = fact.text
                            result[ISPASS] = FAIL
                            result[TIME] = get_now().strftime(FORMORT)
                            result[REASON] = "{}实际返回不为空,预期为空".format(key)
                            return
                        if not value and not temp_response:
                            result[FACT] = fact.text
                            result[ISPASS] = PASS
                            result[TIME] = get_now().strftime(FORMORT)
                            continue
                        for rp in temp_response:
                            for vl in value:
                                k, v = vl.split("=")
                                if k not in rp:
                                    result[FACT] = fact.text
                                    result[ISPASS] = FAIL
                                    result[TIME] = get_now().strftime(FORMORT)
                                    result[REASON] = "实际结果中没有{}这个字段," \
                                                     "检查用例是否错误或接口返回结果错误".format(k)
                                    return
                                if not str(rp[k]) == str(v):
                                    result[FACT] = fact.text
                                    result[ISPASS] = FAIL
                                    result[TIME] = get_now().strftime(FORMORT)
                                    temps += "{}的值预期为:{},实际为:{}\n" \
                                        .format(k, v, rp[k])
                                    result[REASON] = temps
                                else:
                                    # 判断是否有检查点判断失败,如果有,ispass值仍然为fail
                                    if result[ISPASS].__eq__(FAIL):
                                        result[ISPASS] = FAIL
                                    else:
                                        result[FACT] = fact.text
                                        result[ISPASS] = PASS
                                    result[TIME] = get_now().strftime(FORMORT)
                    if not str(temp_response) == str(value):
                        result[FACT] = fact.text
                        result[ISPASS] = FAIL
                        result[TIME] = get_now().strftime(FORMORT)
                        temps += "{}的值预期为:{},实际为:{}\n".format(
                            key, value, temp_response)
                        result[REASON] = temps
                    else:
                        # 判断是否有检查点判断失败,如果有,ispass值仍然为fail
                        if result[ISPASS].__eq__(FAIL):
                            result[ISPASS] = FAIL
                        else:
                            result[FACT] = fact.text
                            result[ISPASS] = PASS
                        result[TIME] = get_now().strftime(FORMORT)
                index += 1
Example #7
0
def check(expect, fact, result, databaseResult="", databaseExpect=""):
    # 默认结果为pass
    result["ispass"] = "******"
    # if fact.status_code == 200:
    try:
        response = fact.json()
        # 循环检查点与响应结果是否匹配
        temp = ""
        if not expect:
            result["ispass"] = "******"
            result["time"] = get_now().strftime("%Y/%m/%d %H:%M:%S")
            result["reason"] = "检查点未设置"
            return
        if databaseResult and not databaseExpect:
            result["ispass"] = "******"
            result["time"] = get_now().strftime("%Y/%m/%d %H:%M:%S")
            result["reason"] = "数据库检查点未设置"
            return
        if databaseExpect:
            if int(databaseExpect) == len(databaseResult):
                result["ispass"] = "******"
                result["time"] = get_now().strftime("%Y/%m/%d %H:%M:%S")
            else:
                result["ispass"] = "******"
                result["time"] = get_now().strftime("%Y/%m/%d %H:%M:%S")
                result["reason"] = "数据库检查失败,预期返回{}条数据,实际返回{}条数据".format(int(databaseExpect), len(databaseResult))

        for key in expect.keys():
            if not isinstance(expect[key], dict):
                # 判断检查点中的字段是否在响应结果中
                if key not in response.keys():
                    result["ispass"] = "******"
                    result["time"] = get_now().strftime("%Y/%m/%d %H:%M:%S")
                    result["reason"] = "实际结果中没有{}这个字段,检查用例是否错误或接口返回结果错误".format(key)
                    return
                # 判断检查点中字段的值和返回结果字段的值是否一致
                if not str(expect[key]).__eq__(str(response[key])):
                    result["ispass"] = "******"
                    result["time"] = get_now().strftime("%Y/%m/%d %H:%M:%S")
                    temp += "{}的值预期为:{},实际为:{}\n".format(key, expect[key], response[key])
                    result["reason"] = temp
                else:
                    # 判断是否有检查点判断失败,如果有,ispass值仍然为fail
                    if result["ispass"].__eq__("fail"):
                        result["ispass"] = "******"
                    else:
                        result["ispass"] = "******"
                    result["time"] = get_now().strftime("%Y/%m/%d %H:%M:%S")
            # 判断双重检查点,例如payload.message的形式
            else:
                for key1 in expect[key].keys:
                    if str(response[key][key1]).__eq__(str(expect[key][key1])):
                        result["ispass"] = "******"
                        result["time"] = get_now().strftime("%Y/%m/%d %H:%M:%S")
                        temp += "{}的值预期为:{},实际为:{}\n".format(key, expect[key], response[key])
                        result["reason"] = temp
                    else:
                        result["ispass"] = "******"
                        result["time"] = get_now().strftime("%Y/%m/%d %H:%M:%S")
    except Exception as e:
        result["ispass"] = "******"
        result["time"] = get_now().strftime("%Y/%m/%d %H:%M:%S")
        result["reason"] = "程序出错:{}".format(str(e))
    return result
Example #8
0
def runAll():
    """
    运行所有用例
    :return:
    """
    init()  # 初始化
    resultSet = []  # 执行结果集
    cases = get_all_case()  # 测试用例集
    start_time = time.time()
    if not cases:
        log.error("用例为空,无匹配格式的.xlsx文件或文件中暂无用例数据")
        return
    log.info("共获取{}条用例".format(len(cases)))
    for case in cases:
        # 将用例存入数据库临时保存,testData不入库保存
        con.insert_data(TABLECASE, **case)
        # 将接口数据插入数据库apiInfo表中暂时保存
        apiInfo = {
            APIID: int(case[APIID]),
            APIHOST: case[APIHOST],
            PARMAS: case[PARMAS],
            METHOD: case[METHOD],
            APIHEADERS: case[APIHEADERS],
            RELATEDAPI: case[RELATEDAPI],
            RELEATEDPARAMS: case[RELEATEDPARAMS]
        }
        # 如果数据库中不存在apiId的接口,则插入
        if not con.query_all("select * from {}  where apiId={}".format(
                TABLEAPIINFO, apiInfo[APIID])):
            con.insert_data(TABLEAPIINFO, **apiInfo)

    for case in cases:
        log.info("正在执行caseId={}的用例".format(case[CASEID]))
        databaseExpect = case[DATABASEEXPECT]
        sqlStatement = case[SQLSTATEMENT]
        sqlResult = {}
        # 执行用例
        res = new_excute_case(case)
        # sql语句参数化
        if sqlStatement:
            for key in sqlStatement.keys():
                result = con_server.query_all(params_replace(
                    sqlStatement[key]))
                if result is not None:
                    sqlResult[key] = result
                else:
                    sqlResult[key] = None
        else:
            sqlResult = {}
        # 报告模板
        result = get_report_data(caseID=case[CASEID],
                                 caseDesciribe=case[CASEDESCRIBE],
                                 apiHost=case[APIHOST],
                                 method=case[METHOD],
                                 apiParams=case[PARMAS],
                                 expect=json.dumps(case[EXPECT],
                                                   ensure_ascii=False),
                                 fact=res,
                                 databaseExpect=json.dumps(databaseExpect,
                                                           ensure_ascii=False,
                                                           cls=MyEncoder),
                                 databaseResult=json.dumps(sqlResult,
                                                           ensure_ascii=False,
                                                           cls=MyEncoder))
        # 检查点验证
        test(fact=res, exp=case[EXPECT], result=result)
        # 数据库验证
        checkDatabase(databaseExpect=databaseExpect,
                      databaseResult=sqlResult,
                      result=result,
                      fact=res)

        # 将执行结果写入数据库临时保存
        con.insert_data(TABLERESULT, **result)
        resultSet.append(result)
    end_time = time.time()
    time_consum = end_time - start_time  # 测试耗时
    case_count = con.query_all(
        "SELECT caseId FROM {}".format(TABLERESULT))  # 执行用例
    fail_case = con.query_all("SELECT caseId "
                              "FROM {} WHERE ispass='******'".format(
                                  TABLERESULT, FAIL))  # 执行失败的用例
    block_case = con.query_all(
        "SELECT caseId FROM {} WHERE ispass='******'".format(TABLERESULT,
                                                         BLOCK))  # 执行阻塞的用例
    success_case = con.query_all(
        "SELECT caseId FROM {} WHERE ispass='******'".format(TABLERESULT,
                                                         PASS))  # 执行成功的用例
    if case_count is None:
        case_count = 0
    else:
        case_count = len(case_count)
    if fail_case is None:
        fail_case = 0
    else:
        fail_case = len(fail_case)
    if block_case is None:
        block_case = 0
    else:
        block_case = len(block_case)
    if success_case is None:
        success_case = 0
    else:
        success_case = len(success_case)
    result_info = "本次测试执行完毕,本次测试环境为:{}," \
                  "共耗时{}秒,共执行用例:{}条," \
                  "成功:{}条,失败:{}条,阻塞:{}条" \
        .format(test_env[7:11], float("%.2f" % time_consum),
                case_count, success_case,
                fail_case, block_case)
    log.info(result_info)
    # 将测试结果写入测试报告
    report.set_result_info(result_info)
    print(resultSet)
    exc_path, part_name = report.get_report(resultSet)

    #生成html报告
    html_title = "%s接口自动化测试报告" % (get_now().strftime("%Y/%m/%d"))
    html_path = html_body(total=case_count,
                          starttime=time.strftime(FORMORT,
                                                  time.localtime(start_time)),
                          endtime=time.strftime(FORMORT,
                                                time.localtime(end_time)),
                          during=time_consum,
                          passd=success_case,
                          fail=fail_case,
                          block=block_case,
                          titles=html_title,
                          details=resultSet)
    con.close()
    con_server.close()
    # 测试完成发送邮件
    send_email_for_all(msg=result_info, part_path=[exc_path, html_path])
Example #9
0
def test(exp, fact, result):
    r = re.compile(r"\[(.*?)]")
    if "ERRRR" in fact:
        result[ISPASS] = FAIL
        result[REASON] = fact
        result[TIME] = get_now().strftime(FORMORT)
        return
    if isinstance(fact, tuple):
        result[PARMAS] = json.dumps(fact[-1], ensure_ascii=False)
        fact = fact[0]
    else:
        try:
            res = fact.json()
        except:
            if "err_code" in exp.keys():
                if str(exp["err_code"]) != str(fact.status_code):
                    result[FACT] = fact.text
                    result[ISPASS] = FAIL
                    result[TIME] = get_now().strftime(FORMORT)
                    reason = "{}的值预期为:{},实际为:{}" \
                        .format("err_code", exp["err_code"], fact.status_code)
                    result[REASON] = reason
                else:
                    # 判断是否有检查点判断失败,如果有,ispass值仍然为fail
                    if result[ISPASS].__eq__(FAIL):
                        result[ISPASS] = FAIL
                    else:
                        result[FACT] = fact.text
                        result[ISPASS] = PASS
                    result[TIME] = get_now().strftime(FORMORT)
            return
        if not exp:
            result[ISPASS] = BLOCK
            result[FACT] = fact.text
            result[EXPECT] = " "
            result[TIME] = get_now().strftime(FORMORT)
            result[REASON] = "检查点未设置或用例检查点格式错误"
            return
        keys = exp.keys()
        for key in keys:
            values = exp[key].split(",")
            items = key.split(".")
            temp_res = res
            for item in items:
                if item not in temp_res.keys():
                    result[FACT] = fact.text
                    result[ISPASS] = FAIL
                    result[TIME] = get_now().strftime(FORMORT)
                    result[REASON] = "实际结果中没有{}这个字段," \
                                     "检查用例是否错误或接口返回结果错误".format(item)
                    return
                temp_res = temp_res[item]
            for value in values:
                t = []
                if re.findall(r, value):
                    value = re.findall(r, value)
                    for i in value:
                        k, v = i.split("=")
                        for j in temp_res:
                            if k not in j.keys():
                                result[FACT] = fact.text
                                result[ISPASS] = FAIL
                                result[TIME] = get_now().strftime(FORMORT)
                                result[REASON] = "实际结果中没有{}这个字段," \
                                                 "检查用例是否错误或接口返回结果错误".format(k)
                                return
                            t.append(j[k])
                        try:
                            v = int(v)
                        except:
                            v = v
                        if v not in t:
                            result[FACT] = fact.text
                            result[ISPASS] = FAIL
                            result[TIME] = get_now().strftime(FORMORT)
                            reason = "{}字段预期的值不在返回结果集中,预期{}={},实际{}=[{}]" \
                                .format(k, k, v, k, t)
                            result[REASON] = reason
                else:
                    if str(temp_res) != str(value):
                        result[FACT] = fact.text
                        result[ISPASS] = FAIL
                        result[TIME] = get_now().strftime(FORMORT)
                        reason = "{}字段预期为{},实际为{}]".format(
                            key, temp_res, value)
                        result[REASON] = reason
                    else:
                        # 判断是否有检查点判断失败,如果有,ispass值仍然为fail
                        if result[ISPASS].__eq__(FAIL):
                            result[ISPASS] = FAIL
                        else:
                            result[FACT] = fact.text
                            result[ISPASS] = PASS
                        result[TIME] = get_now().strftime(FORMORT)