我正在尝试使用旧版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模拟)
所以我可以想到其他一些选择-
db_service
方法。但是,据我所知,在这种情况下,它将不再是单元测试,因为我不是在测试功能单元,而是在测试它所依赖的服务。因此,它更像是一个集成测试。 db_service
中创建所有表/视图/存储的procs /函数,并手动将一些数据插入表中,但这又非常麻烦,因为有很多表/存储过程/ ..创建。 (不相关的问题:如果我采用这种方法,它将仍然被视为单元测试还是集成测试?)setUpTestData
进行测试(类似于2,但在django中不使用--keepdb
,只需在SQL Server中创建它并保留它)我是测试的初学者,并且不确定在这种情况下使用哪种方法。如果有人可以提供一些建议和建议,那么将不胜感激!
谢谢!