【问题标题】:Testing database in django other than django models在 django 中测试数据库而不是 django 模型
【发布时间】:2017-08-21 05:28:40
【问题描述】:

我正在使用 mysql-server 和 MySQLdb 来访问我的数据库。我什至没有使用 django 模型来访问数据库表。

现在问题出现在测试中。所有 django 文档都在谈论使用 django 模型进行测试。在测试数据时,我必须使用cursor.execute() 函数将数据插入数据库,然后我必须从中读取。但这浪费了我的时间。

TestCase 类也在事务中运行所有数据库查询,我怀疑这对于 mysql-server 和 myqldb 是否相同?

我正在使用 MySQLdb,因为它比 django 模型快。谁能告诉我如何使测试更简单?如何在 django 中测试数据库?

【问题讨论】:

  • 您是否考虑过使用TestCasedjango-testing-docs.readthedocs.io/en/latest/…setUptearDown 方法?由于您没有使用 Django 模型进行创建和更新,因此 django TestCase 在事务中运行查询 的语句不适用。
  • 是的,现在我正在使用两者。在设置中,我将数据插入表中,在拆卸中,我将删除这些数据。但这些都是在实际数据库上进行的。有什么方法可以像 django 那样创建测试数据库进行测试。

标签: python mysql django unit-testing automated-tests


【解决方案1】:

比覆盖TestCasesetUptearDown 方法更好的设置数据库的方法是通过实现setUpTestData 来摆脱Django。

from django.db import connections

class BasicTest(TestCase):
     @classmethod
     def setUpTestData(cls):
         alias = 'default'
         cursor = connections[alias].cursor()
         query = 'your query here'
         cursor.execute(query)

Django 将在tearDownClass 上删除测试数据库。

如果您的数据库在settings.py 中没有配置条目,您需要为您的TestCase 提供自己的setUptearDown

@classmethod
def setUpClass(cls):
    super(BasicTest, self).setUpClass()
    db = MySQLdb.connect(host="localhost",user="root",passwd="toor")
    cls.cursor = db.cursor()

    query = 'CREATE DATABASE IF NOT EXISTS test;'
    cls.cursor.execute(query)

    query = 'USE test;'
    cls.cursor.execute(query)

@classmethod
def tearDownClass(cls):
    query = 'DROP DATABASE test;'
    cls.cursor.execute(query)
    cls.cursor.close()

这样,您仍然可以在setUpTestData 中进行其他数据操作,但您将在此处使用的光标是cls.cursor

参考

【讨论】:

  • 但这需要定义数据库后台引擎,对吧?
  • 我没有使用任何数据库后端。我在 python 中通过 MySQLdb 使用 mysql-server。
  • 是的。你的意思是settings.py没有设置数据库?
  • 是的,我没有。
猜你喜欢
  • 1970-01-01
  • 2018-12-28
  • 2014-06-13
  • 1970-01-01
  • 2018-12-19
  • 2010-09-13
  • 2021-01-04
  • 2017-05-21
  • 1970-01-01
相关资源
最近更新 更多