sqlserver_test.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import unittest
  2. from tools.db_helper.sqlserver_helper import SQLServerHelper
  3. from tools.db_helper.base import Base
  4. from sqlalchemy import Column, Integer, String
  5. from typing import Dict, Any
  6. import time
  7. class TestTable(Base):
  8. __tablename__ = 'test_table'
  9. id = Column(Integer, primary_key=True)
  10. name = Column(String(50), nullable=False)
  11. class TestSQLServerHelper(unittest.TestCase):
  12. @classmethod
  13. def setUpClass(cls):
  14. """测试类初始化,创建数据库帮助类实例"""
  15. cls.db_helper = SQLServerHelper()
  16. cls.database = 'Iwb_RecoData2024' # 使用配置文件中定义的测试数据库
  17. def setUp(self):
  18. """每个测试用例开始前的准备工作"""
  19. self.start_time = time.time()
  20. # 创建测试表
  21. engine = self.db_helper.get_engine(self.database)
  22. Base.metadata.create_all(engine)
  23. def tearDown(self):
  24. """每个测试用例结束后的清理工作"""
  25. # 删除测试表
  26. engine = self.db_helper.get_engine(self.database)
  27. Base.metadata.drop_all(engine)
  28. test_duration = time.time() - self.start_time
  29. print(f"\n测试用例耗时: {test_duration:.3f}秒")
  30. @classmethod
  31. def tearDownClass(cls):
  32. """测试类结束时的清理工作"""
  33. cls.db_helper.dispose_all()
  34. def test_singleton(self):
  35. """测试单例模式"""
  36. helper1 = SQLServerHelper()
  37. helper2 = SQLServerHelper()
  38. self.assertIs(helper1, helper2)
  39. def test_database_connection(self):
  40. """测试数据库连接"""
  41. try:
  42. # 测试获取数据库引擎
  43. engine = self.db_helper.get_engine(self.database)
  44. self.assertIsNotNone(engine, "数据库引擎创建失败")
  45. # 测试会话作用域
  46. with self.db_helper.session_scope(self.database) as session:
  47. self.assertIsNotNone(session, "数据库会话创建失败")
  48. # 测试简单查询
  49. result = session.execute("SELECT 1").scalar()
  50. self.assertEqual(result, 1, "数据库连接测试失败")
  51. except Exception as e:
  52. self.fail(f"数据库连接测试失败: {str(e)}")
  53. def test_basic_operations(self):
  54. """测试基本数据库操作"""
  55. try:
  56. # 测试查询操作
  57. query_result = self.db_helper.execute_query(self.database, 'SELECT @@VERSION')
  58. self.assertIsNotNone(query_result, "查询操作失败")
  59. self.assertTrue(len(query_result) > 0, "查询结果为空")
  60. # 测试标量查询
  61. scalar_result = self.db_helper.execute_scalar(self.database, 'SELECT DB_NAME()')
  62. self.assertIsNotNone(scalar_result, "标量查询失败")
  63. self.assertEqual(scalar_result, self.database, "数据库名称不匹配")
  64. # 测试非查询操作
  65. # 创建临时表并插入数据
  66. self.db_helper.execute_non_query(
  67. self.database,
  68. "CREATE TABLE #temp_test (id INT, name NVARCHAR(50))"
  69. )
  70. insert_result = self.db_helper.execute_non_query(
  71. self.database,
  72. "INSERT INTO #temp_test (id, name) VALUES (:id, :name)",
  73. {"id": 1, "name": "test"}
  74. )
  75. self.assertEqual(insert_result, 1, "插入操作失败")
  76. # 验证插入结果
  77. result = self.db_helper.execute_scalar(
  78. self.database,
  79. "SELECT name FROM #temp_test WHERE id = 1"
  80. )
  81. self.assertEqual(result, "test", "数据验证失败")
  82. except Exception as e:
  83. self.fail(f"基本操作测试失败: {str(e)}")
  84. def test_session_management(self):
  85. """测试会话管理和事务"""
  86. try:
  87. # 测试事务回滚
  88. with self.assertRaises(Exception):
  89. with self.db_helper.session_scope(self.database) as session:
  90. test_record = TestTable(name="test_rollback")
  91. session.add(test_record)
  92. raise Exception("触发回滚")
  93. # 验证回滚成功
  94. with self.db_helper.session_scope(self.database) as session:
  95. result = session.query(TestTable).filter_by(name="test_rollback").first()
  96. self.assertIsNone(result, "事务回滚失败")
  97. # 测试正常事务提交
  98. with self.db_helper.session_scope(self.database) as session:
  99. test_record = TestTable(name="test_commit")
  100. session.add(test_record)
  101. # 验证提交成功
  102. with self.db_helper.session_scope(self.database) as session:
  103. result = session.query(TestTable).filter_by(name="test_commit").first()
  104. self.assertIsNotNone(result, "事务提交失败")
  105. self.assertEqual(result.name, "test_commit")
  106. except Exception as e:
  107. self.fail(f"会话管理测试失败: {str(e)}")
  108. if __name__ == '__main__':
  109. unittest.main()