【问题标题】:Django initialize data test for all test classesDjango为所有测试类初始化数据测试
【发布时间】:2019-02-20 13:33:34
【问题描述】:

我需要在我的 django 项目中添加测试,我需要在执行测试之前创建数据测试。我在this question 中阅读了有关设置测试数据的信息。我可以在 setUpClass 中为类中的所有测试创建数据。创建完整的数据测试是一种耗时的方法,所以我想为所有测试类运行一次,是否有任何方法可以为所有测试类设置一次数据?

【问题讨论】:

  • 您可以为所有测试类创建一个基类并在那里实现setUpClass 和/或setUp
  • @MikhailBurshteyn 成功了,感谢您的评论。
  • 我检查它是否有 2 个从我的主测试类继承的类,我在 setUpClass 方法的主测试类中创建数据测试,但它会为每个继承的类重新创建数据测试,在之前的评论中我检查了一个继承测试类。可以解释更多吗?
  • unittest 仅支持类级别和模块级别的设备(请参阅docs)。这两种方法可能都不适合你,所以我建议切换到py.test,在那里你可以拥有具有会话范围的固定装置。

标签: python django python-3.x testing automated-tests


【解决方案1】:

我找到了我的答案,希望它可以帮助别人。基于djangodocs.

测试运行器是定义 run_tests() 方法的类。 Django 附带一个 DiscoverRunner 类,它定义了默认的 Django 测试行为。此类定义 run_tests() 入口点,以及 run_tests() 用来设置、执行和拆除测试套件的其他方法的选择。

对于这个问题,这个类中有 2 个有用的方法。setup_databasesteardown_databases 所以我们可以覆盖它们来初始化所有测试类的数据。

from django.test.runner import DiscoverRunner as BaseRunner

class MyMixinRunner(object):
    def setup_databases(self, *args, **kwargs):
        temp_return = super(MyMixinRunner, self).setup_databases(*args, **kwargs)
        # do something
        return temp_return

    def teardown_databases(self, *args, **kwargs):
        # do somthing
        return super(MyMixinRunner, self).teardown_databases(*args, **kwargs)

class MyTestRunner(MyMixinRunner, BaseRunner):
    pass

定义测试运行器类后,我们需要在设置中添加TEST_RUNNER

TEST_RUNNER = 'path.to.MyTestRunner'

【讨论】:

  • 感谢您的提问和回答!您决定使用 mixin 而不是常规继承的原因是什么?
  • 老实说,我不记得我为什么选择 mixin,现在这对我来说也是个谜 :)
  • 这个问题(和答案!)启发我写了一篇article关于django测试框架的两级嵌套事务机制。那里有更多细节和一些图表。你会看看吗?
  • 我读了你的文章,它有更多的细节,有助于更好地理解这个话题。如果您出于灵感在您的文章中添加对此问题的引用,我将很高兴。 :)
  • 实际上,这篇文章自 2017 年我写关于 transactions in django tests vs pytest 的文章以来一直是草稿。那时我不认为其他任何人都需要项目范围的初始化。你的问题告诉我,它可能不仅对我感兴趣——所以值得写。
猜你喜欢
  • 2015-12-17
  • 2012-07-08
  • 1970-01-01
  • 2013-01-16
  • 2011-05-13
  • 2013-08-05
  • 1970-01-01
  • 2020-09-06
  • 2018-06-20
相关资源
最近更新 更多