У меня есть два файла: database_config.py, используемый для проверки соединения с базой данных через файл конфигурации DatabaseConfig.yml. Мне нужно написать несколько тестов для моего конфигурационного файла, включающего в себя несколько сценариев ios:
- Если база данных пуста, тестовый сценарий не пройден.
- Если база данных не Sqlite или Postgre, тестовый пример не пройден.
Я создал тестовый файл, но при попытке его реализовать у меня появляется ошибка
ValueError: dictionary update sequence element #0 has length 1; 2 is required
.
Может ли кто-нибудь помочь мне в этом?
My DatabaseConfig.yml:
database:
dbopt:
host: None
port: 6313
dbname: spam_eggs2
query:
select * from manufacturing_product
My database_config.py:
import yaml
class InvalidConfigError(Exception):
pass
class DB():
def __init__(self, dbconf):
self._dbconf = dict(dbconf)
# checking for database type
dbtype = self.get_db_type()
if dbtype != 'sqlite' and dbtype != 'postgres':
raise InvalidConfigError(
'E01001', 'Invalid database type, should be sqlite or postgres.')
else:
self.dbtype = dbtype
def get_db_type(self):
return self._dbconf['database']
with open('DatabaseConfig.yml') as f:
data = yaml.full_load(f)
for item, doc in data.items():
print(item, ":", doc)
database = DB(data)
Мой тестовый файл test_db_type.py для database_config.py:
import yaml
import unittest
import database_config
class TestDBtype(unittest.TestCase):
#setUpClass gets calls only once where as setUp gets called before every test
@classmethod
def setUpClass(cls):
cls.init_db()
@classmethod
def init_db(cls):
self.db_instance = database_config.DB('DatabaseConfig.yml')
def test_missing_db(self):
self.assertEqual(self.db_instance, None, "Connection returned None.")
def test_db_type(self):
with self.subTest():
self.assertEqual(self.db_instance, 'postgres')
with self.subTest():
self.assertEqual(self.db_instance, 'sqlite')
if __name__ == '__main__':
unittest.main()
Ошибка трассировки при запуске теста:
(base) D:\Python>python -u "d:\Python\TestDataSource\test_db_type.py"
database : postgres
dbopt : {'host': 'None', 'port': 6313, 'dbname': 'spam_eggs2'}
query : select * from manufacturing_product
E
======================================================================
ERROR: setUpClass (__main__.TestDBtype)
----------------------------------------------------------------------
Traceback (most recent call last):
File "d:\Python\TestDataSource\test_db_type.py", line 9, in setUpClass
cls.init_db()
File "d:\Python\TestDataSource\test_db_type.py", line 13, in init_db
self.db_instance = database_config.DB('DatabaseConfig.yml')
File "d:\Python\TestDataSource\database_config.py", line 8, in __init__
self._dbconf = dict(dbconf)
ValueError: dictionary update sequence element #0 has length 1; 2 is required
----------------------------------------------------------------------
Ran 0 tests in 0.001s
FAILED (errors=1)
(base) D:\Python>C:/Users/duongnb/AppData/Local/Continuum/anaconda3/Scripts/activate
(base) D:\Python>conda activate base
(base) D:\Python>^A