wob*_*col 6 migration django automated-tests
我有一个包含大量迁移的应用程序,包括在某些模型上设置外键的数据迁移。
当我尝试运行 tests.py 时,它失败了,因为数据迁移正在查询数据库以查找测试数据库中不存在的数据。
有没有办法禁用数据迁移?(我想保留架构迁移,而不是完全禁用迁移)。
或者在运行数据迁移之前从设备加载数据?
小智 5
我受到测试时禁用迁移和@A的启发。格里年科。我没有自定义TestRunner,我只是检查是否0002_data_migration.py被django test调用。
代码:
class Migration(migrations.Migration):
dependencies = [
('backend', '0001_initial'),
]
operations = [
migrations.RunPython(setup_data, rollback_setup, atomic=True)
] if 'test' not in sys.argv[1:] else []
Run Code Online (Sandbox Code Playgroud)
首先我应该注意到这个解决方案是一个肮脏的把戏:)
我认为您应该检查测试是否正在运行,如果答案为 True,则从执行中排除数据迁移。要检查测试是否正在运行,您可以定义自己的 DiscoverRunner 并设置一个变量来显示测试正在运行。
测试运行器是定义 run_tests() 方法的类。Django 附带了一个 DiscoverRunner 类,它定义了默认的 Django 测试行为。此类定义了 run_tests() 入口点,以及 run_tests() 用于设置、执行和拆除测试套件的其他方法的选择。
例如,在您的设置中定义 TEST_RUNNER。
from django.conf import settings
from django.test.runner import DiscoverRunner
class MyTestSuiteRunner(DiscoverRunner):
def __init__(self, *args, **kwargs):
settings.TEST_RUN = True
super().__init__(*args, **kwargs)
TEST_RUNNER = 'project_name.test_settings.MyTestSuiteRunner'
Run Code Online (Sandbox Code Playgroud)
让我们假设您的应用程序中只有两个迁移:
因此,您应该在 data_migration 中检查测试是否正在运行以及是否包含您的操作。
from your_app.settings import settings
class Migration(migrations.Migration):
dependencies = [
('your_app', '0001_initial.py'),
]
operations = [
migrations.RunPython(data_migration_method),
] if not settings.TEST_RUN else []
Run Code Online (Sandbox Code Playgroud)
我再一次注意到,在我看来这是一种肮脏的黑客行为,阅读它应该如何以正确的方式制作会很有趣,但这个解决方案可能有助于解决您保存迁移依赖项的问题。请注意,您还可以在 test_settings 中添加 TEST_RUNNER 来运行您的测试,因为建议使用 AR7。
另请检查 TEST_RUNNER 文档(https://docs.djangoproject.com/en/1.11/topics/testing/advanced/#defining-a-test-runner)。我希望它能帮助您找到更好的解决方案。
另一个解决方案是使用 django-pytest 而不是标准的单元测试模块。Pytest 提供了一组用于测试 Django 应用程序和项目的有用工具。它还有助于禁用 Django 迁移并通过检查所有模型来创建数据库。只需使用 --nomigrations 标志运行您的测试。阅读文档以获取更多信息(https://pytest-django.readthedocs.io/en/latest/database.html#nomigrations-disable-django-1-7-migrations)
| 归档时间: |
|
| 查看次数: |
4611 次 |
| 最近记录: |