import unittest import requests class TestRuYuanZaiYuanInterfaces(unittest.TestCase): # 配置API基础URL BASE_URL = "http://localhost:8100" # 根据实际运行的服务地址和端口修改 def setUp(self): # 测试前的初始化工作 pass def tearDown(self): # 测试后的清理工作 pass def test_get_education_chart_config_default(self): """测试默认参数下的入园/招生数据接口""" url = f"{self.BASE_URL}/RuYuanZaiYuan/school/chart" response = requests.get(url) self.assertEqual(response.status_code, 200) data = response.json() # 验证返回数据格式 self.assertIn("xAxis_data", data) self.assertIn("series_data_0", data) self.assertIn("series_data_1", data) self.assertIn("series_data_2", data) self.assertIn("series_data_3", data) self.assertIn("series_data_4", data) self.assertIn("education_stage", data) # 默认应该是学前教育 self.assertEqual(data["education_stage"], "学前") # 年份应该包含2015-2035 self.assertIn("2015", data["xAxis_data"]) self.assertIn("2024", data["xAxis_data"]) self.assertIn("2035", data["xAxis_data"]) def test_get_in_school_chart_config_default(self): """测试默认参数下的在园/在校数据接口""" url = f"{self.BASE_URL}/RuYuanZaiYuan/school/inschool/chart" response = requests.get(url) self.assertEqual(response.status_code, 200) data = response.json() # 验证返回数据格式 self.assertIn("xAxis_data", data) self.assertIn("series_data_0", data) self.assertIn("series_data_1", data) self.assertIn("series_data_2", data) self.assertIn("series_data_3", data) self.assertIn("series_data_4", data) self.assertIn("education_stage", data) # 默认应该是学前教育 self.assertEqual(data["education_stage"], "学前") # 年份应该包含2015-2035 self.assertIn("2015", data["xAxis_data"]) self.assertIn("2024", data["xAxis_data"]) self.assertIn("2035", data["xAxis_data"]) def test_with_different_education_stages(self): """测试不同教育阶段参数""" stages = ["preschool", "primary", "junior", "senior", "vocational"] stage_names = {"preschool": "学前", "primary": "小学", "junior": "初中", "senior": "高中", "vocational": "中职"} for stage in stages: # 测试入园/招生接口 url = f"{self.BASE_URL}/RuYuanZaiYuan/school/chart?education_stage={stage}" response = requests.get(url) self.assertEqual(response.status_code, 200) data = response.json() self.assertEqual(data["education_stage"], stage_names[stage]) # 测试在园/在校接口 url = f"{self.BASE_URL}/RuYuanZaiYuan/school/inschool/chart?education_stage={stage}" response = requests.get(url) self.assertEqual(response.status_code, 200) data = response.json() self.assertEqual(data["education_stage"], stage_names[stage]) def test_with_different_area_names(self): """测试不同区域名称参数""" # 注意:这里使用的区域名称需要在数据文件中存在,否则会返回空数据 # 以下测试假设"云南省"和"昆明市"在数据中存在 areas = ["云南省", "昆明市"] for area in areas: # 测试入园/招生接口 url = f"{self.BASE_URL}/RuYuanZaiYuan/school/chart?area_name={area}" response = requests.get(url) self.assertEqual(response.status_code, 200) data = response.json() # 如果区域不存在,会返回空字典 if data: # 只在数据存在时进行验证 self.assertIn("xAxis_data", data) self.assertIn("series_data_3", data) # 总人数数据 # 测试在园/在校接口 url = f"{self.BASE_URL}/RuYuanZaiYuan/school/inschool/chart?area_name={area}" response = requests.get(url) self.assertEqual(response.status_code, 200) data = response.json() # 如果区域不存在,会返回空字典 if data: # 只在数据存在时进行验证 self.assertIn("xAxis_data", data) self.assertIn("series_data_3", data) # 总人数数据 def test_with_invalid_parameters(self): """测试无效参数""" # 测试无效的教育阶段 url = f"{self.BASE_URL}/RuYuanZaiYuan/school/chart?education_stage=invalid_stage" response = requests.get(url) # FastAPI会自动验证参数格式,不符合pattern的参数会返回422 self.assertEqual(response.status_code, 422) url = f"{self.BASE_URL}/RuYuanZaiYuan/school/inschool/chart?education_stage=invalid_stage" response = requests.get(url) self.assertEqual(response.status_code, 422) # 测试不存在的区域名称 # 注意:不存在的区域名称不会返回422,而是返回空数据 url = f"{self.BASE_URL}/RuYuanZaiYuan/school/chart?area_name=不存在的区域" response = requests.get(url) self.assertEqual(response.status_code, 200) data = response.json() self.assertEqual(data, {}) url = f"{self.BASE_URL}/RuYuanZaiYuan/school/inschool/chart?area_name=不存在的区域" response = requests.get(url) self.assertEqual(response.status_code, 200) data = response.json() self.assertEqual(data, {}) def test_data_consistency(self): """测试数据一致性""" # 测试相同参数下两次请求返回相同数据 url = f"{self.BASE_URL}/RuYuanZaiYuan/school/chart" response1 = requests.get(url) response2 = requests.get(url) self.assertEqual(response1.json(), response2.json()) url = f"{self.BASE_URL}/RuYuanZaiYuan/school/inschool/chart" response1 = requests.get(url) response2 = requests.get(url) self.assertEqual(response1.json(), response2.json()) def test_with_combined_parameters(self): """测试组合参数""" # 同时指定教育阶段和区域名称 url = f"{self.BASE_URL}/RuYuanZaiYuan/school/chart?education_stage=primary&area_name=云南省" response = requests.get(url) self.assertEqual(response.status_code, 200) data = response.json() self.assertEqual(data["education_stage"], "小学") url = f"{self.BASE_URL}/RuYuanZaiYuan/school/inschool/chart?education_stage=junior&area_name=云南省" response = requests.get(url) self.assertEqual(response.status_code, 200) data = response.json() self.assertEqual(data["education_stage"], "初中") if __name__ == "__main__": unittest.main()