[英]How to call multiple SQLAlchemy `asyncio.run()` functions from within the same test in Pytest?
[英]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.