Jenkins+python+接口自动化遇到的问题

一.命令行运行报ModuleNotFoundError: No module named ‘XXX‘,找不到自定义模块

解决方案:
在需要执行的.py文件中,加上以下这段代码,就是在import模块文件前,先将模块路径,添加到sys.path
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(file))))

在这里插入图片描述

二.把生成的html报告放到tomcat/webapps/ROOT目录下这样就可以直接访问不需要登录jenkins

(\cp会强制覆盖)

python3 /opt/AutoTest/testapi/test_cases.py
\cp -f /opt/AutoTest/report/小程序测试报告.html /usr/local/apache-tomcat-7.0.78/webapps/ROOT/xiaochen

三.会用到一些函数参数,每次整体运行用例前设置为环境变量

 # 把定义的变量名称以及值 以属性的方式设置到DynamicParam类中,实现动态存储
order_num = time.strftime("%Y%m%d%H%M%S", time.gmtime())
setattr(DynamicParam, 'order_num', order_num)
invoiceNumber = ''.join(map(str, random.sample(range(0, 9), 8)))
setattr(DynamicParam, 'invoiceNumber', invoiceNumber)
ran_string = "".join(random.choice(string.ascii_uppercase) for _ in range(6))
setattr(DynamicParam, 'pingtaiorderno', 'autotest' + order_num)
setattr(DynamicParam, 'pingtaisku', ran_string)
ordertime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
setattr(DynamicParam, 'ordertime', ordertime)

四.报错{‘statusCode’: 1, ‘message’: ‘Invalid argument supplied for foreach()’}

原因:经过safe_substitute字符串替换后list会变成字符串,传值到后端无法解析

解决方案:data = eval(str(data).replace('"[', '[').replace(']"', ']'))
# 进行参数替换
def relace(ori_data, replace_data):
    # 对象格式化为str
    ori_data = json.dumps(ori_data)
    # 处理字符串的类,实例化并初始化原始字符
    s = Template(ori_data)
    # 使用新的字符,替换

    return s.safe_substitute(replace_data)

五.逐层获取dict指定字段值的时候,针对list的处理

# 根据var,逐层获取dict格式的值,num默认0是指取默认取dict中包含的list中的第一个的值
def parse_relation(var, resdata, num=0):
    # 判断变量var是否存在
    if not var:
        # 不存在直接返回resdata内容
        return resdata
    else:
        if isinstance(resdata, dict):
            # 存在则获取数组第1个内容
            resdata = resdata.get(var[0])
            # 从数组中删除第1个内容
            del var[0]
        else:
            resdata = resdata[num]
        # 递归
        return parse_relation(var, resdata,num)

#测试代码
if __name__ == '__main__':
relation = 'data.list.order_id'.split('.')
    print('relation', relation)
    resdata = {
        "statusCode": 0,
        "message": "success",
        "data": {
            "count": 1,
            "list": [
                {
                    "order_id": 348818,
                    "order_sn": "AUTOTEST20220511020050"
                },
                {
                    "order_id": 1582,
                    "order_sn": "AUTOTEST20220511020050"
                }
            ]
        }
    }
    print(parse_relation(relation, resdata,1))

六.请求数据写入数据库报错相关处理

字段值超长
a.设置数据库字段类型为text
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax

CREATE TABLE `test_result_record` (
  `requestdata` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci,
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `case_id` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `times` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `response` json DEFAULT NULL COMMENT '实际结果',
  `result` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=5292 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

b.from pymysql.converters import escape_string

data=escape_string(json.dumps(data, ensure_ascii=False))#然后把data放到insert语句里面

七.eval使用时报错:Error: name ‘false’ is not defined解决(eval太坑了)

#添加全局变量
global false, null, true
        false = False
        null = 'null'
        true = True

八.NameError: name ‘XXX‘ is not defined

#变量名前加上self
self.report_cases['right_cases']

九.Jenkins集成的时候shell命令执行报错的时候希望继续执行($?是指shell命令的执行结果1是失败,0是成功)

这里的逻辑是如果pytest执行失败后面继续执行,失败的还返回失败exit 1,这样整个Jenkins构建结果也是失败

set +e
cd /root/.jenkins/workspace/testcase
python3 -m pytest
if [ $? == 1 ]
then
echo "有失败的用例"
exit 1
else
echo "全部成功"
fi

十.生成html报告引用的外部js文件加载慢,导致html加载半天—js下载到本地服务器

十一.参数化运行,命令行参数化运行–传参

python3 -m pytest --run_project_uri dadmin --run_project_uri_key url_api --run_project dadmin
import pytest

from utils.readmysql import RdTestcase


def pytest_addoption(parser):
    parser.addoption("--run_project", action="store", default=None, help="choice which project to run")
    parser.addoption("--run_project_uri", action="store", default=None, help="choice which uri to run")
    parser.addoption("--run_project_uri_key", action="store", default=None, help="choice which uri to run")


@pytest.fixture
def run_project(request):
    return request.config.getoption("--run_project")


@pytest.fixture
def run_project_uri(request):
    return request.config.getoption("--run_project_uri")


@pytest.fixture
def run_project_uri_key(request):
    return request.config.getoption("--run_project_uri_key")


# conftest中使用钩子参数化
def pytest_generate_tests(metafunc):
    web_name = metafunc.config.getoption("--run_project")
    cases_data = RdTestcase().is_run_data(web_name)  # 自己写的一个方法,根据传入的参数,构造所有测试用例数据,返回的一个列表
    metafunc.parametrize("case", cases_data)
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值