【问题标题】:Django: Split tests across multiple files, but share same database?Django:跨多个文件拆分测试,但共享同一个数据库?
【发布时间】:2015-08-07 22:07:24
【问题描述】:

我正在使用 Django 1.8。我一直在一个名为test_api.py 的长文件中为我的Django API 编写测试。文件结构如下:

def setUpModule():
  management.call_command('loaddata', 'frontend/fixtures/data.json',
                        verbosity=0)
  management.call_command('my_custom_command')

def tearDownModule():
  management.call_command('flush', verbosity=0, interactive=False)


class TestAPIBNFViews(TestCase):
  def test_api_view_list_all(self):
    url = '/api/1.0/bnf_code'
    # do testing

def test_api_view_query(self):
    # more testint

在所有测试运行之前加载一次固定装置和管理命令,到目前为止效果很好。

但是现在文件变得又长又笨重,我想将它拆分成多个文件。我创建了多个名为 test_listtest_query 的文件,并为每个文件提供了如上所述的 setUpModule 部分。

但是,首先这不是 DRY,其次当我运行 python manage.py test 时,许多测试都失败,并出现重复的外键错误,例如:

ProgrammingError: relation "frontend_sha_id" already exists

我想这并不奇怪,因为测试尝试多次创建测试数据库。

但是,如果我从除第一个测试(按文件名字母顺序列出)之外的所有测试中删除 setUpModule,其他测试将失败,因为它们看不到任何数据。

如何在所有测试运行之前运行一次setUpModule,并且仍将测试保存在单独的文件中以方便使用?

【问题讨论】:

  • 快速而肮脏的解决方案:在运行数据库创建之前,您可以在每个文件中检查它是否已经存在。
  • 我想我可以拥有一个名为 test_all.py 的文件,然后我可以将其他所有内容作为模块导入...这样行吗?

标签: python django unit-testing


【解决方案1】:

除了对两个测试类都使用全局 setUpModule 外,您还可以在每个 TestCase 类中使用一次 setUpTestData。来自Django documentation: Testing tools

类级别原子块...允许在类级别创建初始数据,一次用于整个TestCase

【讨论】:

  • 这难道不会给我留下同样的问题,必须将所有内容都放在一个很长的文件中吗?
  • 您可以在每个类中定义一次setUpTestData(我想每个文件一次,除非每个文件有多个类)。然后,您可以让此函数调用 n 个测试文件之一中的另一个函数,该文件实际上设置了数据以避免 DRY。
  • 谢谢!虽然那样我不会以同样的错误结束,关于数据库已经存在......?
  • 欢迎您!我不相信,这就是我的做法,尽管在一个包含多个类的文件中。试一试应该不会太难,也请告诉我!
  • 谢谢,我试过了,但出于某种原因,它只会让我的测试永远挂起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多