Я разрабатываю пакет для тестирования под названием dbtest. Этот пакет связан с тем, что я использую MySQLdb для подключения баз данных, и, следовательно, очень утомительно писать запросы sql во время тестирования. Поэтому я создал новый пакет, и ко всем запросам можно получить доступ с помощью отдельных функций. Я избегал django ORM, потому что в моей таблице базы данных есть несколько внешних и первичных ключей.
Ниже представлено часть пакета.
пакет.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]
тесты.py
from package import testcase
class showfiles(testcase):
def setUp(self):
print "setup2"
self.user_table(username='vishnu',email='[email protected]')
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='[email protected]')
Insert_table в пакете выполняет операцию вставки в sql, а метод удаления удаляет последнюю запись от пользователя. empty.sql
создает таблицы для базы данных. На самом деле, когда я запускаю тесты, наконец, flag_user должен содержать только [['vishnu']]
. Но я получаю [['vishnu'],['vishnu']]
, и это потому, что функция удаления при разборке не обновляет значение.
Я думаю, это связано с экземплярами класса? Прав я или нет?
cursor=dbcon.cursor() query="delete from user where username=%s" cursor.execute(query,'vishnu') dbcon.commit() cursor.close()
- person vishnu m c   schedule 25.09.2017tablename
вdelete
иuser_table
? (И уж точно не следует использоватьeval
вdelete_table
.) - person Daniel Roseman   schedule 25.09.2017self.flag_user=[]
вы присваиваете переменной экземпляра flag_user пустой список вместо изменения переменной класса. Используйтеself.flag_user.clear()
, например. - person Ilja Everilä   schedule 26.09.2017del self.flag_user[:]
будет эквивалентом Py2. Но уверены ли вы, что вам нужны переменные класса для начала? - person Ilja Everilä   schedule 26.09.2017select_related
и/илиprefetch_related
и т. д.), либо из-за неправильного определения схемы (отсутствующие индексы, индексы, которые недостаточно дискриминантны, 255 символов полей, когда используется только 10 и т. д.). - person bruno desthuilliers   schedule 26.09.2017list
отсутствие предложенного метода во многом связано с версией Python, которая обсуждалась в тот конкретный момент. Я хорошо осведомлен о проблемах с унаследованным кодом, спасибо, но обычно следует побуждать кажущихся новичков переходить на него — на самом деле это лучше для них в долгосрочной перспективе. Особенно, когда в самом вопросе было указано 0, что это для существующей устаревшей кодовой базы. Это всплыло постфактум. - person Ilja Everilä   schedule 26.09.2017