import sqlite3import unittestfrom contextlib import contextmanager@contextmanagerdef create_in_memory_db(): """创建内存数据库上下文管理器""" conn = sqlite3.connect(':memory:') try: yield conn finally: conn.close()class TestEmployeesWithoutManager(unittest.TestCase): def setUp(self): """创建内存数据库并初始化表结构""" self.conn = sqlite3.connect(':memory:') self.cursor = self.conn.cursor() # 创建Employees表 self.cursor.execute(''' CREATE TABLE Employees ( employee_id INTEGER PRIMARY KEY, name TEXT NOT NULL, manager_id INTEGER, salary INTEGER NOT NULL ) ''') self.conn.commit() def tearDown(self): """关闭数据库连接""" self.conn.close() def execute_query(self): """执行目标SQL查询并返回结果""" query = """ SELECT e.employee_id FROM Employees e LEFT JOIN Employees m ON e.manager_id = m.employee_id WHERE e.salary < 30000 AND e.manager_id IS NOT NULL AND m.employee_id IS NULL ORDER BY e.employee_id; """ self.cursor.execute(query) return [row[0] for row in self.cursor.fetchall()] # 返回employee_id列表 def load_data(self, data): """向Employees表加载测试数据""" self.cursor.executemany( "INSERT INTO Employees (employee_id, name, manager_id, salary) VALUES (?, ?, ?, ?)", data ) self.conn.commit() def test_example_case(self): """测试示例数据""" # 示例数据 data = [ (3, 'Mila', 9, 60301), (12, 'Antonella', None, 31000), (13, 'Emery', None, 67084), (1, 'Kalel', 11, 21241), (9, 'Mikaela', None, 50937), (11, 'Joziah', 6, 28485) ] self.load_data(data) # 执行查询 results = self.execute_query() # 验证结果 self.assertEqual(results, [11]) # 应输出employee_id=11 def test_no_employees_meet_criteria(self): """测试没有员工满足条件的情况""" data = [ (1, 'Alice', 2, 35000), # 薪水过高 (2, 'Bob', None, 28000), # 无经理 (3, 'Charlie', 4, 29000), # 经理存在 (4, 'David', 5, 25000) # 经理存在 ] self.load_data(data) results = self.execute_query() self.assertEqual(results, []) # 应返回空列表 def test_multiple_employees_meet_criteria(self): """测试多个员工满足条件的情况""" data = [ (1, 'Alice', 10, 25000), # 经理不存在 (2, 'Bob', 20, 28000), # 经理不存在 (3, 'Charlie', 30, 29000), # 经理不存在 (4, 'David', 1, 22000), # 经理存在 (5, 'Eve', None, 27000) # 无经理 ] self.load_data(data) results = self.execute_query() self.assertEqual(sorted(results), [1, 2, 3]) # 应输出1,2,3(按升序) def test_employee_with_null_manager(self): """测试经理ID为NULL的员工""" data = [ (1, 'Alice', None, 25000), # 无经理 (2, 'Bob', 3, 28000), # 经理存在 (3, 'Charlie', 4, 29000), # 经理存在 (4, 'David', None, 20000) # 无经理 ] self.load_data(data) results = self.execute_query() self.assertEqual(results, []) # 应返回空列表 def test_employee_with_existing_manager(self): """测试有有效经理的员工""" data = [ (1, 'Alice', 2, 25000), # 经理存在 (2, 'Bob', 3, 28000), # 经理存在 (3, 'Charlie', 1, 29000) # 经理存在 ] self.load_data(data) results = self.execute_query() self.assertEqual(results, []) # 应返回空列表 def test_employee_with_non_existent_manager(self): """测试经理不存在的员工""" data = [ (1, 'Alice', 100, 25000), # 经理不存在 (2, 'Bob', 200, 28000), # 经理不存在 (3, 'Charlie', 300, 29000) # 经理不存在 ] self.load_data(data) results = self.execute_query() self.assertEqual(sorted(results), [1, 2, 3]) # 应输出1,2,3 def test_salary_boundary_conditions(self): """测试薪水边界条件""" data = [ (1, 'Alice', 10, 29999), # 刚好低于30000 (2, 'Bob', 20, 30000), # 等于30000(不满足) (3, 'Charlie', 30, 30001) # 高于30000 ] self.load_data(data) results = self.execute_query() self.assertEqual(results, [1]) # 应输出1 def test_manager_is_self(self): """测试经理是自己的情况(循环依赖)""" data = [ (1, 'Alice', 1, 25000) # 经理是自己 ] self.load_data(data) results = self.execute_query() self.assertEqual(results, []) # 应返回空(因为经理存在) def test_complex_hierarchy(self): """测试复杂层级关系""" data = [ (1, 'CEO', None, 100000), (2, 'Manager', 1, 60000), (3, 'Employee1', 2, 25000), # 有效经理 (4, 'Employee2', 5, 28000), # 经理不存在 (5, 'Ex-Manager', None, 55000), # 经理已离职 (6, 'Employee3', 7, 29000), # 经理不存在 (7, 'Ex-Manager2', 8, 52000), # 经理存在 (8, 'Ex-Manager3', None, 51000) # 经理已离职 ] self.load_data(data) results = self.execute_query() # 应返回4和6(Employee2和Employee3) self.assertEqual(sorted(results), [4, 6]) def test_empty_table(self): """测试空表情况""" results = self.execute_query() self.assertEqual(results, []) # 应返回空列表 def test_negative_salary(self): """测试负薪水情况""" data = [ (1, 'Alice', 10, -5000), # 负薪水 (2, 'Bob', 20, 28000) # 正薪水 ] self.load_data(data) results = self.execute_query() # 负薪水也满足<30000,且经理不存在 self.assertEqual(results, [1])if __name__ == '__main__': unittest.main(verbosity=2)