У меня есть функция get_table, которая принимает оператор sql «sql» и движок SQLAlchemy «engine» в качестве параметров, пытается прочитать базу данных с помощью pandas «read_sql_query» с этими параметрами и возвращает указанную базу данных, а также перехватывает определенные исключения. должен ли 'read_sql_query' столкнуться с какими-либо ошибками. В зависимости от перехваченного исключения перед возникновением исключения выводится другое сообщение журнала. Я написал тестовый класс для функции get_table, который гарантирует, что когда read_sql_query возвращает таблицу, эта таблица возвращается функцией get_table, и проверяет, что когда read_sql_query вызывает каждое отдельное исключение, которое это исключение перехватывается блоком try-кроме. Учитывая, что единственная разница в поведении — это содержимое сообщения журнала, являются ли тесты на основе исключений пустой тратой времени? Я не писал никакого кода для проверки параметров, передаваемых в «get_table», поскольку исключения, создаваемые «read_sql_query», предоставляют необходимую информацию о любых проблемах с ними, поэтому требуется ли вообще много тестирования для функции «get_table»? Поскольку это, по сути, просто функция read_sql_query с некоторыми дополнительными деталями.
Как примечание: все тесты на конкретные исключения будут пройдены, если существует общий случай «Исключения» в конец блока try-кроме. Есть ли способ проверить, что конкретное исключение было вызвано в его собственном случае, а не как часть общего случая?
функция get_table:
def get_table(sql, engine):
try:
df = pd.read_sql_query(sql, engine)
log.info("Imported table from product database using query: " + sql)
except exc.ObjectNotExecutableError as e:
log.critical('Invalid \'sql\' parameter - string object not passed: ' + str(e))
raise
except exc.ArgumentError as e:
log.critical('Invalid \'engine\' parameter - engine object not passed: ' + str(e))
raise
except exc.ProgrammingError as e:
log.critical("Could not import table from product database. Invalid query text using read_sql_query: " + str(e))
raise
except exc.OperationalError as e:
log.critical(
"Could not import table from product database. Failed to connect to database: "
+ str(e)
)
raise
except Exception as e:
log.critical("Could import table from product database due to unexpected exception: " + str(e))
raise
return df
Тестовый код:
class TestGetTable:
def test_success(self, mock_df, monkeypatch):
monkeypatch.setattr(pd, 'read_sql_query', lambda x, y: mock_df)
result = udd.get_table('mock_sql', 'mock_engine')
expected = mock_df
assert pd.testing.assert_frame_equal(left=result, right=expected, check_dtype=False) is None
def test_failure_object_not_executable_error(self, mock_read_sql_query_one_error):
with pytest.raises(exc.ObjectNotExecutableError):
udd.get_table('mock_sql', 'mock_engine')
def test_failure_argument_error(self, mock_read_sql_query_argument_error):
with pytest.raises(exc.ArgumentError):
udd.get_table('mock_sql', 'mock_engine')
def test_failure_programming_error(self, mock_read_sql_query_programming_error):
with pytest.raises(exc.ProgrammingError):
udd.get_table('mock_sql', 'mock_engine')
def test_failure_operational_error(self, mock_read_sql_query_operational_error):
with pytest.raises(exc.OperationalError):
udd.get_table('mock_sql', 'mock_engine')
def test_failure_generic_exception(self, mock_read_sql_query_generic_exception):
with pytest.raises(Exception):
udd.get_table('mock_sql', 'mock_engine')
Фикстуры conftest.py:
@pytest.fixture
def mock_df():
return pd.DataFrame({'col_a': [1, 2, 4], 'col_b': ['red', 'blue', 'green']})
@pytest.fixture
def mock_read_sql_query(monkeypatch, mock_df):
monkeypatch.setattr('read_sql_query', mock_df)
# one_error means ObjectNotExecutableError
@pytest.fixture
def mock_read_sql_query_one_error(monkeypatch):
def fail_read_sql_query(sql, engine):
raise exc.ObjectNotExecutableError(sql)
monkeypatch.setattr(pd, 'read_sql_query', fail_read_sql_query)
@pytest.fixture
def mock_read_sql_query_argument_error(monkeypatch):
def fail_read_sql_query(sql, engine):
raise exc.ArgumentError()
monkeypatch.setattr(pd, 'read_sql_query', fail_read_sql_query)
@pytest.fixture
def mock_read_sql_query_programming_error(monkeypatch):
def fail_read_sql_query(sql, engine):
raise exc.ProgrammingError('mock_statement', None, Exception())
monkeypatch.setattr(pd, 'read_sql_query', fail_read_sql_query)
@pytest.fixture
def mock_read_sql_query_operational_error(monkeypatch):
def fail_read_sql_query(sql, engine):
raise exc.OperationalError('mock_statement', None, Exception())
monkeypatch.setattr(pd, 'read_sql_query', fail_read_sql_query)
@pytest.fixture
def mock_read_sql_query_generic_exception(monkeypatch):
def fail_read_sql_query(sql, engine):
raise Exception()
monkeypatch.setattr(pd, 'read_sql_query', fail_read_sql_query)
Подробнее здесь: https://stackoverflow.com/questions/793 ... d-a-functi
Является ли модульное тестирование отдельных случаев исключений в блоке try-Exception вокруг вызова функции из сторонней ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Перехват ошибок из асинхронной функции в блоке try..catch вне асинхронной функции
Anonymous » » в форуме Javascript - 0 Ответы
- 40 Просмотры
-
Последнее сообщение Anonymous
-