【问题标题】:Django/unittest run command at the end of the test runner测试运行器结束时的 Django/unittest 运行命令
【发布时间】:2018-03-16 05:43:01
【问题描述】:

我正在使用 Django 测试运行程序来运行我的单元测试。其中一些测试使用在我的本地系统上创建大量文件的工厂。它们都有一个可检测的名称,并且可以相当容易地删除。

我尽量避免这样做

  1. 让删除文件的 cron 作业保持运行
  2. 如果它检测到我们正在测试,请更改我的自定义图像模型的代码以删除该文件。相反,我希望在测试运行结束时运行一次(且仅一次)命令,以清理测试生成的所有文件。

我写了一个小的管理命令来删除符合预期约定的文件。有没有办法让测试运行器在完成整个测试套件后运行call_command(而不仅仅是在特定测试的tearDowntearDownClass 方法中)?

【问题讨论】:

    标签: python django unit-testing python-unittest factory-boy


    【解决方案1】:

    所以我们最终要做的是通过在 settings.py 中添加以下行来创建自定义测试运行器:

    TEST_RUNNER = 'myapp.test_runner.MyTestRunner'
    

    然后在测试运行器中,我们从继承自现有 Juno 测试运行器的测试运行器的“teardown_test_environment”方法中删除图像。

    import os                                                                                  
    import shutil
    
    from django.conf import settings
    from junorunner.testrunner import TestSuiteRunner
    
    
    class MyTestRunner(TestSuiteRunner):
    
        def teardown_test_environment(self, *args, **kwargs):
            # Remove test-created media files
            if all([
                os.path.isdir(settings.MEDIA_ROOT),
                'test' in settings.MEDIA_ROOT,
            ]):
                shutil.rmtree(settings.MEDIA_ROOT)
            super(MyTestRunner, self).teardown_test_environment(*args, **kwargs)
    

    这个方法在测试方法被拆解时被调用,并且似乎是一个很好的地方来确保它在最后被调用一次,并且只被调用一次。

    【讨论】:

      【解决方案2】:

      如果您在与 models.py 相同的文件夹中创建一个 services.py 文件,您可以将清理代码放在那里,然后从管理命令和测试 tearDown 调用它,同时保持它 DRY。

      【讨论】:

        【解决方案3】:

        您可能会利用 django 测试运行程序对测试进行排序的方式(请参阅https://docs.djangoproject.com/en/1.11/topics/testing/overview/#order-in-which-tests-are-executed

        如果您的测试用例继承自 django 的 TestCase 类,您可以创建一个直接从 unittest.TestCase 继承的虚拟清理测试用例。测试运行程序将最后执行,您可以在那里进行清理。

        但是,如果 django 开发人员决定更改测试顺序,这将中断。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-30
          相关资源
          最近更新 更多