staran 1.0.8__py3-none-any.whl → 1.0.10__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,10 +2,10 @@
2
2
  # -*- coding: utf-8 -*-
3
3
 
4
4
  """
5
- 彩色测试运行器
6
- ======= print(f"{chr(129514)} Staran v1.0.2 测试套件")====
5
+ 彩色测试运行器 v1.0.9
6
+ ==================
7
7
 
8
- 为Staran项目提供美观的彩色测试输出。
8
+ 为Staran项目提供美观的彩色测试输出,支持v1.0.9新功能测试。
9
9
  """
10
10
 
11
11
  import unittest
@@ -18,6 +18,25 @@ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..', '..'))
18
18
 
19
19
  from staran.date.tests.test_core import *
20
20
 
21
+ # 尝试导入v1.0.8和v1.0.9的新功能测试
22
+ try:
23
+ from staran.date.tests.test_v108_features import *
24
+ V108_AVAILABLE = True
25
+ except ImportError:
26
+ V108_AVAILABLE = False
27
+
28
+ try:
29
+ from staran.date.tests.test_v109_features import *
30
+ V109_AVAILABLE = True
31
+ except ImportError:
32
+ V109_AVAILABLE = False
33
+
34
+ try:
35
+ from staran.date.tests.test_enhancements import *
36
+ ENHANCEMENTS_AVAILABLE = True
37
+ except ImportError:
38
+ ENHANCEMENTS_AVAILABLE = False
39
+
21
40
 
22
41
  class ColoredTestResult(unittest.TextTestResult):
23
42
  """彩色测试结果"""
@@ -65,15 +84,60 @@ class ColoredTestRunner(unittest.TextTestRunner):
65
84
 
66
85
  def main():
67
86
  """主函数"""
68
- print(f"{chr(129514)} Staran v1.0.1 测试套件")
87
+ print(f"{chr(129514)} Staran v1.0.9 测试套件")
69
88
  print("=" * 50)
70
89
  print(f"Python版本: {sys.version}")
71
90
  print(f"开始时间: {time.strftime('%Y-%m-%d %H:%M:%S')}")
91
+
92
+ # 显示可用的测试模块
93
+ available_modules = ["核心功能测试"]
94
+ if V108_AVAILABLE:
95
+ available_modules.append("v1.0.8新功能测试")
96
+ if V109_AVAILABLE:
97
+ available_modules.append("v1.0.9新功能测试")
98
+ if ENHANCEMENTS_AVAILABLE:
99
+ available_modules.append("增强功能测试")
100
+
101
+ print(f"可用测试模块: {', '.join(available_modules)}")
72
102
  print()
73
103
 
74
104
  # 创建测试套件
75
105
  loader = unittest.TestLoader()
76
- suite = loader.loadTestsFromModule(sys.modules[__name__])
106
+ suite = unittest.TestSuite()
107
+
108
+ # 添加核心测试
109
+ core_tests = loader.loadTestsFromModule(sys.modules[__name__])
110
+ suite.addTests(core_tests)
111
+
112
+ # 尝试添加其他测试模块
113
+ test_counts = {"核心功能": core_tests.countTestCases()}
114
+
115
+ if V108_AVAILABLE:
116
+ try:
117
+ import staran.date.tests.test_v108_features as v108_module
118
+ v108_tests = loader.loadTestsFromModule(v108_module)
119
+ suite.addTests(v108_tests)
120
+ test_counts["v1.0.8新功能"] = v108_tests.countTestCases()
121
+ except Exception as e:
122
+ print(f"警告: 无法加载v1.0.8测试: {e}")
123
+
124
+ if V109_AVAILABLE:
125
+ try:
126
+ import staran.date.tests.test_v109_features as v109_module
127
+ v109_tests = loader.loadTestsFromModule(v109_module)
128
+ suite.addTests(v109_tests)
129
+ test_counts["v1.0.9新功能"] = v109_tests.countTestCases()
130
+ except Exception as e:
131
+ print(f"警告: 无法加载v1.0.9测试: {e}")
132
+
133
+ if ENHANCEMENTS_AVAILABLE:
134
+ try:
135
+ import staran.date.tests.test_enhancements as enh_module
136
+ enh_tests = loader.loadTestsFromModule(enh_module)
137
+ suite.addTests(enh_tests)
138
+ test_counts["增强功能"] = enh_tests.countTestCases()
139
+ except Exception as e:
140
+ print(f"警告: 无法加载增强功能测试: {e}")
77
141
 
78
142
  # 运行测试
79
143
  runner = ColoredTestRunner(verbosity=2)
@@ -81,11 +145,18 @@ def main():
81
145
  result = runner.run(suite)
82
146
  end_time = time.time()
83
147
 
84
- # 生成报告
148
+ # 生成详细报告
85
149
  print("\n" + "=" * 50)
86
150
  print(f"{chr(128202)} 测试报告")
87
151
  print("=" * 50)
88
152
  print(f"运行时间: {end_time - start_time:.3f}秒")
153
+
154
+ # 显示各模块测试数量
155
+ total_tests = sum(test_counts.values())
156
+ print(f"测试分布:")
157
+ for module, count in test_counts.items():
158
+ print(f" {module}: {count}项")
159
+
89
160
  print(f"测试总数: {result.testsRun}")
90
161
  success_count = result.testsRun - len(result.failures) - len(result.errors)
91
162
  print(f"成功: {success_count}")
@@ -0,0 +1,495 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+
4
+ """
5
+ Date类v1.0.10新功能测试
6
+ ======================
7
+
8
+ 测试v1.0.10版本新增的功能:
9
+ - 时区支持
10
+ - 日期表达式解析
11
+ - 二十四节气
12
+ - 数据可视化
13
+ - 增强日期范围操作
14
+ """
15
+
16
+ import unittest
17
+ import datetime
18
+ import sys
19
+ import os
20
+
21
+ # 添加项目根目录到路径
22
+ sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..', '..'))
23
+
24
+ from staran.date.core.core import Date, DateRange
25
+ from staran.date import get_version_info, parse_expression
26
+
27
+ class TestV1010TimezoneSupport(unittest.TestCase):
28
+ """测试时区支持功能"""
29
+
30
+ def setUp(self):
31
+ self.date = Date("2025-07-29")
32
+
33
+ def test_get_supported_timezones(self):
34
+ """测试获取支持的时区"""
35
+ try:
36
+ timezones = Date.get_supported_timezones()
37
+ self.assertIsInstance(timezones, list)
38
+ if timezones: # 如果功能可用
39
+ self.assertIn('UTC', timezones)
40
+ self.assertIn('UTC+8', timezones)
41
+ except NotImplementedError:
42
+ self.skipTest("时区功能不可用")
43
+
44
+ def test_get_timezone_info(self):
45
+ """测试获取时区信息"""
46
+ try:
47
+ tz_info = self.date.get_timezone_info('UTC+8')
48
+ self.assertIsInstance(tz_info, dict)
49
+ self.assertIn('name', tz_info)
50
+ self.assertIn('current_offset', tz_info)
51
+ self.assertIn('offset_string', tz_info)
52
+ except NotImplementedError:
53
+ self.skipTest("时区功能不可用")
54
+
55
+ def test_timezone_conversion(self):
56
+ """测试时区转换"""
57
+ try:
58
+ time_part = datetime.time(12, 0, 0)
59
+ result = self.date.to_timezone('UTC+8', time_part)
60
+ self.assertIsInstance(result, datetime.datetime)
61
+ self.assertEqual(result.date(), self.date.to_date_object())
62
+ except NotImplementedError:
63
+ self.skipTest("时区功能不可用")
64
+
65
+ class TestV1010ExpressionParsing(unittest.TestCase):
66
+ """测试日期表达式解析功能"""
67
+
68
+ def test_simple_expressions(self):
69
+ """测试简单表达式"""
70
+ try:
71
+ # 基本表达式
72
+ today = Date.today()
73
+
74
+ tomorrow = parse_expression("明天")
75
+ if tomorrow: # 如果功能可用
76
+ expected_tomorrow = today.add_days(1)
77
+ self.assertEqual(tomorrow.to_date_object(), expected_tomorrow.to_date_object())
78
+
79
+ yesterday = parse_expression("昨天")
80
+ if yesterday:
81
+ expected_yesterday = today.add_days(-1)
82
+ self.assertEqual(yesterday.to_date_object(), expected_yesterday.to_date_object())
83
+ except NotImplementedError:
84
+ self.skipTest("表达式解析功能不可用")
85
+
86
+ def test_detailed_parsing(self):
87
+ """测试详细解析"""
88
+ try:
89
+ result = Date.parse_expression_detailed("明天")
90
+ self.assertIsInstance(result, dict)
91
+ self.assertIn('success', result)
92
+ self.assertIn('confidence', result)
93
+ self.assertIn('matched_pattern', result)
94
+ except NotImplementedError:
95
+ self.skipTest("表达式解析功能不可用")
96
+
97
+ def test_expression_matching(self):
98
+ """测试表达式匹配"""
99
+ try:
100
+ today = Date.today()
101
+ self.assertTrue(today.matches_expression("今天"))
102
+ except NotImplementedError:
103
+ self.skipTest("表达式解析功能不可用")
104
+
105
+ class TestV1010SolarTerms(unittest.TestCase):
106
+ """测试二十四节气功能"""
107
+
108
+ def setUp(self):
109
+ self.date = Date("2025-07-29")
110
+ self.year = 2025
111
+
112
+ def test_get_year_solar_terms(self):
113
+ """测试获取年份节气"""
114
+ try:
115
+ terms = Date.get_year_solar_terms(self.year)
116
+ self.assertIsInstance(terms, list)
117
+ if terms: # 如果功能可用
118
+ self.assertEqual(len(terms), 24)
119
+ # 检查第一个节气
120
+ first_term = terms[0]
121
+ self.assertEqual(first_term.name, '立春')
122
+ except NotImplementedError:
123
+ self.skipTest("节气功能不可用")
124
+
125
+ def test_get_season_solar_terms(self):
126
+ """测试获取季节节气"""
127
+ try:
128
+ spring_terms = Date.get_season_solar_terms(self.year, '春季')
129
+ self.assertIsInstance(spring_terms, list)
130
+ if spring_terms: # 如果功能可用
131
+ self.assertEqual(len(spring_terms), 6)
132
+ self.assertEqual(spring_terms[0].name, '立春')
133
+ except NotImplementedError:
134
+ self.skipTest("节气功能不可用")
135
+
136
+ def test_solar_term_queries(self):
137
+ """测试节气查询"""
138
+ try:
139
+ # 获取当前最近节气
140
+ current_term = self.date.get_solar_term()
141
+ if current_term: # 如果功能可用
142
+ self.assertIsNotNone(current_term.name)
143
+ self.assertIsNotNone(current_term.season)
144
+
145
+ # 获取下一个节气
146
+ next_term = self.date.get_next_solar_term()
147
+ if next_term:
148
+ self.assertIsNotNone(next_term.name)
149
+
150
+ # 获取上一个节气
151
+ prev_term = self.date.get_previous_solar_term()
152
+ if prev_term:
153
+ self.assertIsNotNone(prev_term.name)
154
+
155
+ # 到下个节气的天数
156
+ days = self.date.days_to_next_solar_term()
157
+ self.assertIsInstance(days, int)
158
+ self.assertGreaterEqual(days, 0)
159
+
160
+ except NotImplementedError:
161
+ self.skipTest("节气功能不可用")
162
+
163
+ def test_is_solar_term(self):
164
+ """测试是否节气日"""
165
+ try:
166
+ is_term = self.date.is_solar_term()
167
+ self.assertIsInstance(is_term, bool)
168
+ except NotImplementedError:
169
+ self.skipTest("节气功能不可用")
170
+
171
+ def test_solar_term_season(self):
172
+ """测试获取节气季节"""
173
+ try:
174
+ season = self.date.get_solar_term_season()
175
+ self.assertIsInstance(season, str)
176
+ except NotImplementedError:
177
+ self.skipTest("节气功能不可用")
178
+
179
+ class TestV1010Visualization(unittest.TestCase):
180
+ """测试数据可视化功能"""
181
+
182
+ def setUp(self):
183
+ self.dates = [Date("2025-07-29"), Date("2025-07-30"), Date("2025-07-31")]
184
+ self.events = ["事件1", "事件2", "事件3"]
185
+
186
+ def test_create_timeline_chart(self):
187
+ """测试创建时间轴图表"""
188
+ try:
189
+ from staran.date import create_timeline_chart
190
+ chart_data = create_timeline_chart(self.dates, self.events, 'echarts')
191
+
192
+ self.assertIsNotNone(chart_data)
193
+ self.assertEqual(chart_data.chart_type, 'timeline')
194
+ self.assertEqual(chart_data.library, 'echarts')
195
+ self.assertIsInstance(chart_data.data, list)
196
+ except (NotImplementedError, ImportError):
197
+ self.skipTest("可视化功能不可用")
198
+
199
+ def test_create_calendar_heatmap(self):
200
+ """测试创建日历热力图"""
201
+ try:
202
+ date_values = {
203
+ Date("2025-07-29"): 85,
204
+ Date("2025-07-30"): 92,
205
+ Date("2025-07-31"): 78
206
+ }
207
+
208
+ chart_data = Date.create_calendar_heatmap(date_values, 2025, 'echarts')
209
+
210
+ self.assertIsNotNone(chart_data)
211
+ self.assertEqual(chart_data.chart_type, 'calendar_heatmap')
212
+ self.assertEqual(chart_data.library, 'echarts')
213
+ except NotImplementedError:
214
+ self.skipTest("可视化功能不可用")
215
+
216
+ def test_create_time_series_chart(self):
217
+ """测试创建时间序列图"""
218
+ try:
219
+ time_series_data = [
220
+ (Date("2025-07-29"), 100),
221
+ (Date("2025-07-30"), 120),
222
+ (Date("2025-07-31"), 95)
223
+ ]
224
+
225
+ chart_data = Date.create_time_series_chart(time_series_data, 'echarts')
226
+
227
+ self.assertIsNotNone(chart_data)
228
+ self.assertEqual(chart_data.chart_type, 'time_series')
229
+ self.assertEqual(chart_data.library, 'echarts')
230
+ except NotImplementedError:
231
+ self.skipTest("可视化功能不可用")
232
+
233
+ def test_create_date_distribution_chart(self):
234
+ """测试创建日期分布图"""
235
+ try:
236
+ chart_data = Date.create_date_distribution_chart(self.dates, 'month', 'echarts')
237
+
238
+ self.assertIsNotNone(chart_data)
239
+ self.assertEqual(chart_data.chart_type, 'distribution')
240
+ self.assertEqual(chart_data.library, 'echarts')
241
+ except NotImplementedError:
242
+ self.skipTest("可视化功能不可用")
243
+
244
+ class TestV1010EnhancedDateRanges(unittest.TestCase):
245
+ """测试增强的日期范围功能"""
246
+
247
+ def setUp(self):
248
+ self.start_date = Date("2025-07-29")
249
+ self.end_date = Date("2025-08-15")
250
+
251
+ def test_create_range_to(self):
252
+ """测试创建到指定日期的范围"""
253
+ date_range = self.start_date.create_range_to(self.end_date)
254
+
255
+ self.assertIsInstance(date_range, DateRange)
256
+ self.assertEqual(date_range.start, self.start_date)
257
+ self.assertEqual(date_range.end, self.end_date)
258
+
259
+ def test_create_range_with_days(self):
260
+ """测试创建指定天数的范围"""
261
+ # 未来10天
262
+ future_range = self.start_date.create_range_with_days(10)
263
+ self.assertEqual(future_range.start, self.start_date)
264
+ self.assertEqual(future_range.end, self.start_date.add_days(10))
265
+
266
+ # 过去5天
267
+ past_range = self.start_date.create_range_with_days(-5)
268
+ self.assertEqual(past_range.start, self.start_date.add_days(-5))
269
+ self.assertEqual(past_range.end, self.start_date)
270
+
271
+ def test_in_range(self):
272
+ """测试是否在范围内"""
273
+ test_date = Date("2025-08-01")
274
+
275
+ # 在范围内
276
+ self.assertTrue(test_date.in_range(self.start_date, self.end_date))
277
+
278
+ # 不在范围内
279
+ out_of_range_date = Date("2025-09-01")
280
+ self.assertFalse(out_of_range_date.in_range(self.start_date, self.end_date))
281
+
282
+ def test_create_date_sequence(self):
283
+ """测试创建日期序列"""
284
+ sequence = Date.create_date_sequence(self.start_date, self.start_date.add_days(6), 2)
285
+
286
+ self.assertIsInstance(sequence, list)
287
+ self.assertEqual(len(sequence), 4) # 0, 2, 4, 6天
288
+ self.assertEqual(sequence[0], self.start_date)
289
+ self.assertEqual(sequence[1], self.start_date.add_days(2))
290
+
291
+ def test_find_common_dates(self):
292
+ """测试查找共同日期"""
293
+ list1 = [Date("2025-07-29"), Date("2025-07-30"), Date("2025-07-31")]
294
+ list2 = [Date("2025-07-30"), Date("2025-07-31"), Date("2025-08-01")]
295
+ list3 = [Date("2025-07-31"), Date("2025-08-01"), Date("2025-08-02")]
296
+
297
+ common_dates = Date.find_common_dates([list1, list2, list3])
298
+
299
+ self.assertIsInstance(common_dates, list)
300
+ self.assertEqual(len(common_dates), 1)
301
+ self.assertEqual(common_dates[0], Date("2025-07-31"))
302
+
303
+ class TestV1010UtilityMethods(unittest.TestCase):
304
+ """测试v1.0.10实用工具方法"""
305
+
306
+ def setUp(self):
307
+ self.date = Date("2025-07-29")
308
+
309
+ def test_get_version_info(self):
310
+ """测试获取版本信息"""
311
+ version_info = self.date.get_version_info()
312
+
313
+ self.assertIsInstance(version_info, dict)
314
+ self.assertIn('version', version_info)
315
+ self.assertEqual(version_info['version'], '1.0.10')
316
+ self.assertIn('enhanced_features', version_info)
317
+ self.assertIn('available_modules', version_info)
318
+ self.assertIn('api_count', version_info)
319
+
320
+ def test_get_feature_status(self):
321
+ """测试获取功能状态"""
322
+ feature_status = Date.get_feature_status()
323
+
324
+ self.assertIsInstance(feature_status, dict)
325
+ self.assertIn('core_date_operations', feature_status)
326
+ self.assertTrue(feature_status['core_date_operations'])
327
+ self.assertIn('lunar_calendar', feature_status)
328
+ self.assertTrue(feature_status['lunar_calendar'])
329
+ self.assertIn('multilingual_support', feature_status)
330
+ self.assertTrue(feature_status['multilingual_support'])
331
+
332
+ def test_help_system(self):
333
+ """测试帮助系统"""
334
+ # 测试创建方法帮助
335
+ help_creation = self.date.help('creation')
336
+ self.assertIsInstance(help_creation, str)
337
+ self.assertIn('Date', help_creation)
338
+
339
+ # 测试格式化帮助
340
+ help_formatting = self.date.help('formatting')
341
+ self.assertIsInstance(help_formatting, str)
342
+ self.assertIn('format', help_formatting)
343
+
344
+ # 测试计算帮助
345
+ help_calculations = self.date.help('calculations')
346
+ self.assertIsInstance(help_calculations, str)
347
+ self.assertIn('add_days', help_calculations)
348
+
349
+ # 测试全部帮助
350
+ help_all = self.date.help('all')
351
+ self.assertIsInstance(help_all, str)
352
+ self.assertIn('Date', help_all)
353
+
354
+ class TestV1010Integration(unittest.TestCase):
355
+ """测试v1.0.10集成功能"""
356
+
357
+ def test_version_consistency(self):
358
+ """测试版本一致性"""
359
+ from staran.date import __version__, get_version_info
360
+
361
+ # 检查模块版本
362
+ self.assertEqual(__version__, "1.0.10")
363
+
364
+ # 检查版本信息函数
365
+ version_info = get_version_info()
366
+ self.assertEqual(version_info['version'], "1.0.10")
367
+
368
+ def test_backwards_compatibility(self):
369
+ """测试向后兼容性"""
370
+ # 确保所有v1.0.8和v1.0.9的功能仍然可用
371
+ date = Date("2025-07-29")
372
+
373
+ # 基础功能
374
+ self.assertEqual(date.format_iso(), "2025-07-29")
375
+ self.assertEqual(date.format_chinese(), "2025年07月29日")
376
+
377
+ # 农历功能
378
+ lunar = date.to_lunar()
379
+ self.assertIsNotNone(lunar)
380
+
381
+ # 多语言功能
382
+ Date.set_language('zh_CN')
383
+ localized = date.format_localized()
384
+ self.assertIsInstance(localized, str)
385
+
386
+ # 计算功能
387
+ tomorrow = date.add_days(1)
388
+ self.assertEqual(tomorrow.to_date_object(), datetime.date(2025, 7, 30))
389
+
390
+ def test_api_count_increase(self):
391
+ """测试API数量增加"""
392
+ date = Date("2025-07-29")
393
+ version_info = date.get_version_info()
394
+
395
+ # v1.0.10应该比之前版本有更多API
396
+ api_count = version_info['api_count']
397
+ self.assertGreater(api_count, 120) # 应该超过120个API方法
398
+
399
+ # 测试运行器
400
+ class TestV1010Runner:
401
+ """v1.0.10测试运行器"""
402
+
403
+ @staticmethod
404
+ def run_all_tests():
405
+ """运行所有v1.0.10测试"""
406
+ loader = unittest.TestLoader()
407
+ suite = unittest.TestSuite()
408
+
409
+ # 添加所有测试类
410
+ test_classes = [
411
+ TestV1010TimezoneSupport,
412
+ TestV1010ExpressionParsing,
413
+ TestV1010SolarTerms,
414
+ TestV1010Visualization,
415
+ TestV1010EnhancedDateRanges,
416
+ TestV1010UtilityMethods,
417
+ TestV1010Integration
418
+ ]
419
+
420
+ for test_class in test_classes:
421
+ tests = loader.loadTestsFromTestCase(test_class)
422
+ suite.addTests(tests)
423
+
424
+ # 运行测试
425
+ runner = unittest.TextTestRunner(verbosity=2)
426
+ result = runner.run(suite)
427
+
428
+ return result
429
+
430
+ @staticmethod
431
+ def run_specific_test(test_class_name: str):
432
+ """运行特定测试类"""
433
+ test_classes = {
434
+ 'timezone': TestV1010TimezoneSupport,
435
+ 'expressions': TestV1010ExpressionParsing,
436
+ 'solar_terms': TestV1010SolarTerms,
437
+ 'visualization': TestV1010Visualization,
438
+ 'ranges': TestV1010EnhancedDateRanges,
439
+ 'utilities': TestV1010UtilityMethods,
440
+ 'integration': TestV1010Integration
441
+ }
442
+
443
+ test_class = test_classes.get(test_class_name)
444
+ if test_class:
445
+ loader = unittest.TestLoader()
446
+ suite = loader.loadTestsFromTestCase(test_class)
447
+ runner = unittest.TextTestRunner(verbosity=2)
448
+ return runner.run(suite)
449
+ else:
450
+ print(f"测试类 '{test_class_name}' 不存在")
451
+ print(f"可用的测试类: {list(test_classes.keys())}")
452
+
453
+ if __name__ == "__main__":
454
+ print("🧪 Staran v1.0.10 新功能测试")
455
+ print("=" * 50)
456
+
457
+ # 检查命令行参数
458
+ if len(sys.argv) > 1:
459
+ test_name = sys.argv[1]
460
+ print(f"运行特定测试: {test_name}")
461
+ TestV1010Runner.run_specific_test(test_name)
462
+ else:
463
+ print("运行所有v1.0.10新功能测试")
464
+ result = TestV1010Runner.run_all_tests()
465
+
466
+ # 输出结果摘要
467
+ print(f"\n" + "=" * 50)
468
+ print(f"测试摘要:")
469
+ print(f" 运行测试数: {result.testsRun}")
470
+ print(f" 失败数: {len(result.failures)}")
471
+ print(f" 错误数: {len(result.errors)}")
472
+ print(f" 跳过数: {len(result.skipped)}")
473
+
474
+ if result.failures:
475
+ print(f"\n失败的测试:")
476
+ for test, traceback in result.failures:
477
+ print(f" - {test}")
478
+
479
+ if result.errors:
480
+ print(f"\n错误的测试:")
481
+ for test, traceback in result.errors:
482
+ print(f" - {test}")
483
+
484
+ if result.skipped:
485
+ print(f"\n跳过的测试:")
486
+ for test, reason in result.skipped:
487
+ print(f" - {test}: {reason}")
488
+
489
+ success_rate = (result.testsRun - len(result.failures) - len(result.errors)) / result.testsRun * 100
490
+ print(f"\n成功率: {success_rate:.1f}%")
491
+
492
+ if result.wasSuccessful():
493
+ print("✅ 所有测试通过!")
494
+ else:
495
+ print("❌ 部分测试失败")