针对测试的数据库数据与数据集的差异比较
项目描述
django-dbdiff
在编写现有代码的测试时,我相当懒惰,然而在重复的手动测试操作方面,我更加懒惰。
这个包旨在去除从django-representatives和django-representatives-votes中重复的数据导入测试,这些测试在django-cities-light中被重用。
数据库状态断言
测试数据导入脚本的一个好方法是创建一个源数据配置文件,包含数据子集,即只包含10个城市而不是28K个,或者只包含3个欧洲议会代表而不是3600个,将导入函数用这些数据喂养,然后比较数据库状态和Django配置文件。这看起来就像我以前做的那样。
使用以下命令创建一个小数据提取:shuf -n3 cities15000.txt > cities_light/tests/cities_test_fixture.txt,
在干净的数据库上对该导入脚本进行测试,
手动验证数据库,并运行django-admin dumpdata –indent=4 cities_light > cities_light/tests/cities_test_expected.txt
然后,创建一个调用配置文件和导入脚本的测试用例,
编写和维护一些有趣(模糊?)重复的测试代码,以确保数据库处于预期状态。
当修复了一个错误时,只需将案例添加到配置文件中,并重复此过程以创建新的预期数据转储,使用覆盖率确保没有遗漏任何案例。
使用django-dbdiff,我只需要维护初始数据提取,并用Fixture('appname/path/to/fixture', models=[YourModelToTest]).assertNoDiff()在django.test.TransactionTestCase中进行测试,该测试用例具有reset_sequences=True
如果相关的配置文件不存在,它将在第一次运行时自动创建,并引发“FixtureCreated”异常以失败测试并告知创建的配置文件路径,这样就不会误导用户认为测试通过现有的配置文件,
如果配置文件存在,它将在相关模型上运行dumpdata并与配置文件进行GNU diff,如果有任何输出,它将在“DiffFound”异常中引发,失败测试并打印差异。
用法
示例
from django import TransactionTestCase
from dbdiff.fixture import Fixture
class YourImportTest(test.TransactionTestCase):
reset_sequences = True
def test_your_import(self):
your_import()
Fixture('yourapp/tests/yourtest.json',
models=[YourModel]).assertNoDiff()
第一次运行时,将引发FixtureCreated异常,测试将失败。这是为了告知用户测试实际上并没有运行。然而,在下一次运行时,它将通过。
如果在数据库和测试配置文件之间发现任何差异,则diff()将返回GNU diff输出的差异。
如果您需要全局忽略字段,请设置类级别变量exclude。
Fixture.exclude = {'mrsrequest.mrsrequest': ['token']}
而不是在运行测试前手动删除配置文件以重新生成它们,只需用FIXTURE_REWRITE=1环境变量运行您的测试。这将覆盖配置文件并使测试看起来像通过了。
请参阅测试和文档字符串以获取详细信息。
需求
支持MySQL、SQLite和PostgreSQL,Python 3.8至3.12以及Django 3.2至5.0 - 总是支持Django的主分支会更好,这样我们就可以在它发布时轻松升级,这是拥有100%覆盖率的卖点之一。
安装
使用pip安装django-dbdiff并将dbdiff添加到INSTALLED_APPS。
Django模型观察者
值得注意的是,存在一个相关且可能类似的应用程序:https://github.com/Griffosx/djmo