繁体   English   中英

如何对访问数据库的python方法进行单元测试?

[英]How do I unittest python method that accesses a database?

def insert_env(self, env):
        """Inserts a new environment into ENV_TABLE

        Keyword arguments:
        env -- name of environment to be inserted
        """
        info = {}
        # populate info dictionary
        sql = (
            """INSERT INTO my_table (...) VALUES (...)""")
        try:
            DML(sql, info)
        except oracleException as e:
            logger.debug('dml {0}  resulted in error {1}'.format(sql, e))

在这里,我有一个函数,该函数可填充info字典并将值插入数据库的表中。 DML是另一个函数的帮助方法,该函数已经存在了一段时间,并且可以调用oracle数据库,而大多数数据库信息已经在该函数中进行了硬编码。 如何对该功能进行单元测试? 我无法模拟数据库,因为辅助函数已硬编码访问我们的生产数据库。

帮助功能DML不属于您要测试的单元; 嘲笑 显然,您需要在insert_env进行测试的唯一事情是,使用适当的参数调用DML ,并且如果DML引发异常,则使用记录器。

在调用DML之后, infoinsert_env的局部变量)不再被使用的事实表明这不是完整的功能。 可能还有更多要测试的内容,但是无法根据给出的信息进行测试。

首先,最好在第二个文件中使sql字符串成为全局常量。 然后模拟数据库调用。

# Need to test exception scenario
class oracleExceptionStub(oracleException):
  # bypass constructor
  def __init__(self):
    pass

class Test...(unittest.Testcase):
  @mock.patch('path_to_DML')
  def test_insert_valid(self, mock_dml):
    test_env = ...
    expected_info = ...
    insert_env(test_env)
    mock_dml.assert_called_once_with(sql_contant, expected_info) 

 @mock.patch('logger.debug')
 @mock.patch('path_to_DML', side_effect=oracleExceptionStub)
 def test_insert_invalid(self, mock_dml, mock_logger):
   insert_env(..., ...)
   self.assertTrue(mock_logger.called)

暂无
暂无

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

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