使用旧版SQL Server驱动的应用程序在Django中进行单元测试

时间:2018-09-12 16:35:55

标签: sql-server django unit-testing mocking integration-testing

我正在尝试使用旧版SQL Server数据库为django应用程序编写单元测试。

这是我当前从数据库访问数据的方式。我创建了一个名为db_service.py的文件。目的是执行views.py请求的原始sql查询,并将结果返回。查询通常相当复杂,并且已经创建(在旧的Perl CGI应用程序中)。因此,我不太热衷于创建模型并使用Django的queryset实现相同的功能。下面显示了一个示例。

views.py

@login_required
def view_load_from_db (request):
    params     = request.GET.get('params')
    result     = db_service.get_something_from_db(params)
    do something with result and return as JsonResponse

db_serivce.py

def get_something_from_db(params):
   query  = '''complex sql query with stored procedures/joins/outer apply etc'''
   result = cursor.execute(query)
   return result

对于单元测试视图,我正在模拟db_service方法并返回静态的预定结果,如下所示:

test_views.py

class ExampleTest(TestCase):
   @mock.patch('app.db_service.get_something_from_db')
   def test_view_load_from_db (self, mock_get_something_from_db):
       mock_get_something_from_db.return_value = {some static value}
       response = self.client.get(url_to_view_load_from_db , params)
       self.assertEquals(response.status_code, 200)

但是,由于大多数逻辑都位于db_service本身,所以我觉得我实际上并没有进行任何测试,而且我还能看到模拟的维护也非常麻烦(如果多个{{1} }用于单个视图,每种方法都需要使用patch模拟)

所以我可以想到其他一些选择-

  1. 使用开发数据库(每周与prod数据库同步)并直接使用它,而不是模拟db_service方法。但是,据我所知,在这种情况下,它将不再是单元测试,因为我不是在测试功能单元,而是在测试它所依赖的服务。因此,它更像是一个集成测试。
  2. 使用django创建的空测试数据库,并为每个Test类在db_service中创建所有表/视图/存储的procs /函数,并手动将一些数据插入表中,但这又非常麻烦,因为有很多表/存储过程/ ..创建。 (不相关的问题:如果我采用这种方法,它将仍然被视为单元测试还是集成测试?)
  3. 将生产数据库复制到没有SQL Server本身数据的测试数据库中,并在其中插入一些模拟数据,然后使用setUpTestData进行测试(类似于2,但在django中不使用--keepdb ,只需在SQL Server中创建它并保留它)

我是测试的初学者,并且不确定在这种情况下使用哪种方法。如果有人可以提供一些建议和建议,那么将不胜感激!

谢谢!

0 个答案:

没有答案