测试人社区

如何替换变量中的变量的数据

测试用例的输入数据通过yaml定义的,获取后结构如下:

 {
             'module_name': 'tsdb_ddl_建库',
             'module_case_name': '创建和检查一个新的库',
             'name_id': 'create_database_01',
             'isRun': 1,
             'db_tb_name':
                 {
                    'db_name': 'rocdb',
                    'tb_name': 'roctb'
                 },
             'exec_order': ['sql', 'check_td', 'sql1', 'check_td'],
             'exe_sql':
                 {
                     'sql': 'create database {db_name}',
                     'check_td': 'show databases',
                     'sql1': 'drop database if exists {db_name}'
                 }
}

在执行这个测试用例时,exec_sql是要执行的sql语句,exec_order是语句的执行顺序,db_tb_name是sql语句中要使用到的库名
我代码是这样写的

db_name = case["db_tb_name"]["db_name"]
tb_name = case["db_tb_name"]["tb_name"]
exec_order = case["exec_order"]
exec_sql = case["exec_sql"]

for item in exec_order:
    try:
        self.db_obj.execute_sql(exec_sql[item])
    except Exception as e:
        print(f"SQL执行报错, {e}")

我想问的是,怎么用之前获取到的db_name的值来替换sql语句中{db_name}的值

dic =  {
             'module_name': 'tsdb_ddl_建库',
             'module_case_name': '创建和检查一个新的库',
             'name_id': 'create_database_01',
             'isRun': 1,
             'db_tb_name':
                 {
                    'db_name': 'rocdb',
                    'tb_name': 'roctb'
                 },
             'exec_order': ['sql', 'check_td', 'sql1', 'check_td'],
             'exe_sql':
                 {
                     'sql': 'create database {db_name}',
                     'check_td': 'show databases',
                     'sql1': 'drop database if exists {db_name}'
                 }
}
# 获取 sql1的值
dic_db_name = dic["exe_sql"]["sql1"]
此时dic_db_name是一个字符串,替换字符串内的db_name即可
方案二:
db_name = case["db_tb_name"]["db_name"]
db_name_str = f"drop database if exists {db_name}"
让把dic内sql1对应的value更新下即可

好的,谢谢,我翻了下书,看了下示例代码,是使用字符串replace来替换对应的变量的,本想着还能不能有其他的方法。

用模板技术也可以,jinja2 mustache 还可以用eval表达式