Django单元测试的坑
坑一
环境:Django5.0 +python3.10 +Pycharm2023
问题:在Pycharm自带的manage工具中执行test单元测试报错
return super(DjangoTeamcityTestRunner, self).run_tests(test_labels, extra_tests, **kwargs) TypeError: DiscoverRunner.run_tests() takes 2 positional arguments but 3 were given
原因
Django 在 Django 5.0 中删除了参数extra_tests
并且PyCharm的测试运行程序仍然提供它。
参见 django 的发行说明:
DiscoverRunner.build_suite() 和 DiscoverRunner.run_tests() 的 extra_tests 参数已删除。
存在与此弃用相关的 Pycharm 问题,请参阅 PY-53355。
解决
1.您可以降级到 django 4.2,直到此问题得到解决。
2.也可以在终端中执行命令python manage.py test
坑二
Django每次运行单元测试时,都会临时新建一个数据库,首先是执行Setup方法,有多少个测试方法就执行多少次Setup方法进行初始化数据。执行完之后,就会把刚才的数据全部清空。这看着是一个优点,测试不影响实际数据库中的数据,但是如果Settiing文件中设置的测试数据库名与生产环境的数据库名一样(如下所示)并且执行的时候没有 - -keepdb 参数 ,单元测试执行完后,就会把生产环境中的数据库删除!!!
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'test', # 数据库名
'USER': 'root', # 用户
'PASSWORD': 'root', # 密码
'HOST': '127.0.0.1', # 地址
'PORT': '3306', # 端口
'TEST': { # 测试数据库配置
'NAME': 'test',
}
},
}