【问题标题】:global set up in django test framework?在 django 测试框架中设置全局?
【发布时间】:2010-03-03 19:11:50
【问题描述】:

是否有某种方式(使用标准 Django.test.TestCase 框架)来执行某些变量的全局初始化,以便它只发生一次

设置 setUp() 可以在每次测试之前初始化变量,当设置涉及昂贵的操作时,这会降低性能。我想运行一次设置类型功能,然后让这里初始化的变量对我的所有测试都是可见的。

我不想重写测试运行器框架。

我正在考虑类似于 Ruby/RSpec 世界中的 before(:all) 的东西。

-S

【问题讨论】:

    标签: python django testing


    【解决方案1】:

    您不需要“重新编写整个测试运行程序框架”,但您需要创建一个自定义 test_runner(您只需 copy the existing one 并对其进行修改以包含您的全局设置代码)。大约有 100 行代码。然后将TEST_RUNNER 设置为指向您的自定义跑步者,然后离开。

    【讨论】:

    • 对 - 我试图避免使用自定义测试运行器 - 看起来我可能没有选择。我使用 Django 的次数越多,我就越想念 Rails。 Python 有更好的科学库支持,所以我想我可以接受它。
    • 我认为测试运行器过去在旧 Django 版本中就像 15-30 行代码,所以他们可能不认为复制它并创建一个新版本有什么大不了的。它变成了一个完整的类,并在以后的版本中扩大了规模。您总是可以建议添加功能请求以运行一些额外的设置代码(可能在 setup_test_environment() 中)而不指定全新的运行器(额外的设置或全局信号)?
    • 再次感谢您的提示 - 我一直在寻找一种很好的声明方式来按照 setUp() 的方式执行此操作,但看起来我可能需要安装一个跑步者。功能请求是有意义的。
    • @shreddd,嗨,你的新功能请求被 django 接受了吗?我也想要这样的功能。
    • @linebreak - 抱歉,最初的问题/答案来自 2010 年,这可能是我最后一次真正使用 Django。 :( 也许为 v1.8 提出一个新问题?
    【解决方案2】:

    这在较新版本的 python/django 中由 setUpClass() 部分解决,这至少允许我运行类级别设置。

    【讨论】:

      【解决方案3】:

      带有静态变量的类呢? 类似的东西:

      class InitialSetup(object):
          GEOLOCATOR = GeoLocator()
          DEFAULT_LOCATION = GEOLOCATOR.get_geocode_object(settings.DEFAULT_ADDRESS, with_country=True)
      
          def setUp(self):
              self.geolocator = InitialSetup.GEOLOCATOR
              self.default_location = InitialSetup.DEFAULT_LOCATION
              p = Page.objects.create(site_id=settings.SITE_ID, template='home_page.html')
              p.publish()
              self.client = Client()
      
      
      class AccessTest(InitialSetup, Testcase):  # Diamond inheritance issue! inheritance order matters
          def setUp(self):
              super(AccessTest, self).setUp()
      
      
          def test_access(self):
              # Issue a GET request.
              response = self.client.get('/')
      
              # Check that the response is 200 OK.
              self.assertEqual(response.status_code, 200)
      

      【讨论】:

      • 嗨 Maazza - 是的,可以通过设置静态或类变量来解决问题。但是,我正在寻找一个声明性的内置解决方案。看起来这在新版本的 python 中使用 setUpClass() 函数得到了部分解决。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 2018-07-21
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多