繁体   English   中英

Pytest - 如何调用多个函数并从 JSON 的随机输入中执行 sql 查询?

[英]Pytest - How to call multiple functions and execute sql queries from random inputs from JSON?

我打算调用多个函数并从 JSON 的随机输入中执行 SQL 查询

实际代码

def daily():
    db_connection = DatabaseConnection()

    aaa(db_connection)
    bbb(db_connection)

    return {'success': True}


def aaa(db_connection):
    database_table = 'aaa'
    symbols_list = [{'code': 'XXX', 'database_column': 'aaa_1'}, {'code': 'YYY', 'database_column': 'aaa_2'}]
    load_data_from_api_to_database(db_connection, database_table, symbols_list)


def load_data_from_api_to_database(db_connection, database_table, symbols_list):
    http_request = HttpRequest()
    for _, symbol in enumerate(symbols_list):
        code = symbol['code']
        database_column = symbol['database_column']

        response = http_request.get(f'https://api.example.com/value/{code}', headers={'accept': 'application/json', 'appkey': api_key})

        json_data = json.loads(response.text)

        if response.status_code != 200:
            return

        data_points = json_data['dataPoint']
        for x, _ in enumerate(data_points):
            value = data_points[x]['value']
            date = data_points[x]['date']
            db_connection.execute(f'INSERT INTO "{database_table}" ("{database_date_column}") VALUES (%(date_time)s) ON CONFLICT ("{database_date_column}") DO NOTHING', {'date_time': date})
            db_connection.execute(f'UPDATE "{database_table}" SET "{database_column}" = %(value)s WHERE "{database_date_column}" = %(date_time)s', {'value': value, 'date_time': date})
        db_connection.commit()

bbb()类似于aaa()只是不同的 json 数组值

测试代码

class TestDailyHandler(unittest.TestCase):
    @classmethod
    def setup_class(cls):
        cls.mock_get_patcher = patch('src.daily_handler.HttpRequest.get')
        cls.mock_get = cls.mock_get_patcher.start()
        cls.mock_database_connection_patcher = patch('src.daily_handler.DatabaseConnection')
        cls.mock_database_connection = cls.mock_database_connection_patcher.start()

    def load_data_from_api_to_database(self):
        assert load_data_from_api_to_database({}, None) == {'success': True}

        symbols_list = [{'code': 'XXX', 'database_column': 'aaa_1'}, {'code': 'YYY', 'database_column': 'aaa_2'}]

        for x in range(len(symbols_list)):
            code = [x]['code']
            self.mock_get.assert_any_call(f'https://api.example.com/value/symbols_list{code}', headers={'accept': 'application/json', 'appkey': self.mock_get_aws_secret.return_value})

        db_execute_many_args_list = self.mock_database_connection.return_value.execute_many.call_args_list
        daily_table_insert_command_length = len([x for x in db_execute_many_args_list if re.search(r'INSERT INTO ', str(x), re.IGNORECASE)])

        self.assertEqual(daily_table_insert_command_length, len(db_execute_many_args_list))
        self.assertEqual(self.mock_database_connection.return_value.commit.call_count, daily_table_insert_command_length)

        db_execute_many_args_list = self.mock_database_connection.return_value.execute_many.call_args_list
        daily_table_update_command_length = len([x for x in db_execute_many_args_list if re.search(r'UPDATE ', str(x), re.IGNORECASE)])

        self.assertEqual(daily_table_update_command_length, len(db_execute_many_args_list))
        self.assertEqual(self.mock_database_connection.return_value.commit.call_count, daily_table_update_command_length)

顺便说一句,我不确定如何调用多个函数aaa()bbb() 我想从daily()开始测试,而不是load_data_from_api_to_database() function。 还有来自每个 function 的 JSON 数组输入。 目前其 static 值。

警告:以下代码仅供参考

举个例子我有一个字符串,其内容是一个function名称,如何在Python中引用对应的function?

附加阅读将函数存储在列表中并稍后调用它们

新答案


def aaa(db_connection, data):
    # bind from data
    symbols_list = data
    # ... 

def bbb(db_connection, data):
    # bind from data
    symbols_list = data
    # ...

dispatcher = { "aaa" : aaa, "bbb" : bbb }

def daily():
    db_connection = DatabaseConnection()

    #loop the dict for functions
    for fn in dispatcher:
        if(callable(dispatcher[func_name]))
            json_str = input('Enter your JSON data:')
            try
                data = json.load(json_str);
                dispatcher[func_name](db_connection, data)
            except JSONDecodeError
                print('Error loading json')
                return None

    return {'success': True}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM