问题目录
- **一.命令行运行报ModuleNotFoundError: No module named ‘XXX‘,找不到自定义模块**
- **二.把生成的html报告放到tomcat/webapps/ROOT目录下这样就可以直接访问不需要登录jenkins**
- **三.会用到一些函数参数,每次整体运行用例前设置为环境变量**
- **四.报错{'statusCode': 1, 'message': 'Invalid argument supplied for foreach()'}**
- **五.逐层获取dict指定字段值的时候,针对list的处理**
- **六.请求数据写入数据库报错相关处理**
- **七.eval使用时报错:Error: name 'false' is not defined解决(eval太坑了)**
- **八.NameError: name ‘XXX‘ is not defined**
- **九.Jenkins集成的时候shell命令执行报错的时候希望继续执行($?是指shell命令的执行结果1是失败,0是成功)**
- **十.生成html报告引用的外部js文件加载慢,导致html加载半天**---js下载到本地服务器
- **十一.参数化运行,命令行参数化运行--传参**
一.命令行运行报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)