【发布时间】:2018-03-06 18:39:44
【问题描述】:
我正在为我的测试目的开发一个名为 dbtest 的包。这个包是因为我使用 MySQLdb 连接数据库,因此在测试时编写 sql 查询是非常繁琐的任务。所以我创建了一个新包,所有查询都可以使用单独的函数访问。我避免使用 django ORM,因为我的数据库表有多个外键和主键。
下面是包装的一部分。
package.py
from django.test import TestCase
dbcon='connector'
class testcase(TestCase):
flag_user=[]
@classmethod
def setUpClass(cls):
global dbcon
dbcon=MySQLdb.connect(host=dbHost,port=dbPort,user=dbUser,passwd=dbPasswd,db=dbname)
super(testcase, cls).setUpClass()
cursor = dbcon.cursor()
sql=open("empty.sql").read()
cursor.execute(sql)
cursor.close()
views.MySQLdb=Mockdb()
@classmethod
def tearDownClass(cls):
dbcon.close()
def user_table(self,username=username,email=email):
cache=[username]
self.flag_user.append(cache)
cmpdata=(username,email)
insert_table(tablename_user,cmpdata)
def delete(self,table):
last_entry=self.flag_user[-1]
query_user = 'delete from USER where USERNAME=%s'
cursor=dbcon.cursor()
query=eval('query_%s'%table)
cursor.execute(query,last_entry)
dbcon.commit()
del self.flag_user[-1]
tests.py
from package import testcase
class showfiles(testcase):
def setUp(self):
print "setup2"
self.user_table(username='vishnu',email='vishnu@clartrum.com')
def tearDown(self):
print "teardown2"
self.delete("user")
def test_1(self):
print "test dbtest link feature"
def test_2(self):
print "test health/errorfiles with valid device"
self.user_table(username='vishnu',email='vishnu@clartrum.com')
包中的insert_table 执行sql 中的插入操作,delete 方法删除用户的最后一个条目。 empty.sql 为数据库创建表。
实际上,当我运行测试时,最终 flag_user 应该只包含[['vishnu']]。但我得到[['vishnu'],['vishnu']],这是因为拆卸中的删除功能不会更新值。
我认为这是由于类实例?我说的对吗?
【问题讨论】:
-
也许我遗漏了一些东西,但为什么你在 package.py 中的方法没有缩进到类中?另外,你能告诉我们 delete_table 函数吗?
-
delete_table 只不过是一个 sql 查询
cursor=dbcon.cursor() query="delete from user where username=%s" cursor.execute(query,'vishnu') dbcon.commit() cursor.close() -
@Ben 请调查一下
-
tablename在delete和user_table中来自哪里? (你当然不应该在delete_table中使用eval。) -
Django ORM 开销在我过去十年从事的数十个 django 项目中从来都不是问题(当然,假设你学会了正确使用它,但这只是常识)。在决定“放慢速度”之前,您是否真的关心分析任何内容?
标签: django python-2.7 class subclassing class-variables