You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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的数据导出成文件,之后再导入查看:

  1. 在测试类的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()
  1. 测试跑完后,用导入命令把数据恢复到数据库:
python manage.py silk_import silk_test_data.json

之后就能正常在silk后台查看测试产生的性能分析数据了。

注意点

  • 禁用事务后,测试速度会变慢,因为每次测试都要重建数据库表,适合少量性能测试用例。
  • 手动提交事务的方法,要确保覆盖silk的所有核心模型,避免遗漏数据。
  • 导出导入的方法适合需要长期保存测试性能数据的场景。

内容的提问来源于stack exchange,提问作者msln

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 22:10:16