如何让django-silk在Django测试环境中采集API性能分析数据?
解决django-silk在Django测试环境无法留存性能数据的问题
问题根源是Django测试默认用事务,每个测试结束后回滚,把silk存到数据库的分析数据也删了。下面是几个实用的解决办法:
方案1:禁用测试的事务特性
Django的TestCase自带事务回滚,咱们可以换用不依赖事务的测试类,或者直接关闭事务:
换用
SimpleTestCase:
如果你的测试不需要操作数据库(只是调用接口验证响应),直接继承SimpleTestCase就行,它不会用事务回滚:from django.test import SimpleTestCase class APIPerformanceTest(SimpleTestCase): def test_api_response(self): response = self.client.get('/api/your-endpoint/') self.assertEqual(response.status_code, 200)在
TestCase里关闭事务:
要是测试需要创建数据库数据,就在测试类里加transaction_test_case = False,Django会用创建/删除表的方式代替事务回滚,这样silk的数据就不会被删了:from django.test import TestCase class APIPerformanceTest(TestCase): transaction_test_case = False def setUp(self): # 这里创建的测试数据不会被回滚 pass def test_api_response(self): response = self.client.get('/api/your-endpoint/') self.assertEqual(response.status_code, 200)
方案2:手动提交silk的事务
不想改测试的事务规则?那就在测试结束后,手动把silk的数据提交到数据库,绕过测试的回滚:
在测试类的tearDown方法里,针对silk的核心模型执行提交操作:
from django.test import TestCase from django.db import transaction from silk.models import Request, Response, SQLQuery class APIPerformanceTest(TestCase): def tearDown(self): # 强制提交silk的请求、响应、SQL查询数据,避免被测试回滚 with transaction.atomic(): Request.objects.all().update() Response.objects.all().update() SQLQuery.objects.all().update() super().tearDown() def test_api_response(self): response = self.client.get('/api/your-endpoint/') self.assertEqual(response.status_code, 200)
原理很简单:测试的回滚只针对未提交的数据库操作,手动提交后,silk的数据就留在数据库里了。
方案3:测试后导出silk数据归档
如果不想碰数据库事务,也可以在测试结束后把silk的数据导出成文件,之后再导入查看:
- 在测试类的
tearDownClass里调用silk的导出命令:
from django.test import TestCase from django.core.management import call_command class APIPerformanceTest(TestCase): @classmethod def tearDownClass(cls): # 把silk数据导出到JSON文件 call_command('silk_export', output='silk_test_data.json') super().tearDownClass()
- 测试跑完后,用导入命令把数据恢复到数据库:
python manage.py silk_import silk_test_data.json
之后就能正常在silk后台查看测试产生的性能分析数据了。
注意点
- 禁用事务后,测试速度会变慢,因为每次测试都要重建数据库表,适合少量性能测试用例。
- 手动提交事务的方法,要确保覆盖silk的所有核心模型,避免遗漏数据。
- 导出导入的方法适合需要长期保存测试性能数据的场景。
内容的提问来源于stack exchange,提问作者msln
相关产品推荐
相关产品推荐

