238 lines
6.8 KiB
Python
238 lines
6.8 KiB
Python
|
|
"""
|
||
|
|
公共工具模块单元测试
|
||
|
|
"""
|
||
|
|
|
||
|
|
import unittest
|
||
|
|
import time
|
||
|
|
import sys
|
||
|
|
import os
|
||
|
|
from datetime import datetime
|
||
|
|
|
||
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||
|
|
|
||
|
|
|
||
|
|
class TestCommonFunctions(unittest.TestCase):
|
||
|
|
"""测试公共工具函数"""
|
||
|
|
|
||
|
|
def test_generate_unique_id(self):
|
||
|
|
"""测试生成唯一标识符"""
|
||
|
|
from utils.common import generate_unique_id
|
||
|
|
|
||
|
|
id1 = generate_unique_id()
|
||
|
|
id2 = generate_unique_id()
|
||
|
|
|
||
|
|
self.assertNotEqual(id1, id2)
|
||
|
|
self.assertTrue(id1.startswith("tf-"))
|
||
|
|
|
||
|
|
def test_generate_unique_id_with_prefix(self):
|
||
|
|
"""测试带前缀的唯一标识符"""
|
||
|
|
from utils.common import generate_unique_id
|
||
|
|
|
||
|
|
id1 = generate_unique_id("camera")
|
||
|
|
|
||
|
|
self.assertTrue(id1.startswith("camera_"))
|
||
|
|
|
||
|
|
def test_calculate_md5(self):
|
||
|
|
"""测试MD5计算"""
|
||
|
|
from utils.common import calculate_md5
|
||
|
|
|
||
|
|
result = calculate_md5("hello world")
|
||
|
|
|
||
|
|
self.assertEqual(len(result), 32)
|
||
|
|
self.assertEqual(result, "5eb63bbbe01eeed093cb22bb8f5acdc3")
|
||
|
|
|
||
|
|
def test_get_current_timestamp(self):
|
||
|
|
"""测试获取时间戳"""
|
||
|
|
from utils.common import get_current_timestamp
|
||
|
|
|
||
|
|
result = get_current_timestamp()
|
||
|
|
|
||
|
|
self.assertIsInstance(result, str)
|
||
|
|
self.assertIn(":", result)
|
||
|
|
|
||
|
|
def test_get_current_timestamp_ms(self):
|
||
|
|
"""测试获取毫秒时间戳"""
|
||
|
|
from utils.common import get_current_timestamp_ms
|
||
|
|
|
||
|
|
result = get_current_timestamp_ms()
|
||
|
|
|
||
|
|
self.assertIsInstance(result, int)
|
||
|
|
self.assertGreater(result, 0)
|
||
|
|
|
||
|
|
def test_parse_rtsp_url(self):
|
||
|
|
"""测试解析RTSP URL"""
|
||
|
|
from utils.common import parse_rtsp_url
|
||
|
|
|
||
|
|
result = parse_rtsp_url("rtsp://192.168.1.1:554/stream1")
|
||
|
|
|
||
|
|
self.assertEqual(result["protocol"], "rtsp")
|
||
|
|
self.assertEqual(result["host"], "192.168.1.1")
|
||
|
|
self.assertEqual(result["port"], "554")
|
||
|
|
|
||
|
|
def test_retry_operation_success(self):
|
||
|
|
"""测试重试成功"""
|
||
|
|
from utils.common import retry_operation
|
||
|
|
|
||
|
|
call_count = [0]
|
||
|
|
|
||
|
|
@retry_operation(max_retries=3, delay=0.01)
|
||
|
|
def success_func():
|
||
|
|
call_count[0] += 1
|
||
|
|
return "success"
|
||
|
|
|
||
|
|
result = success_func()
|
||
|
|
|
||
|
|
self.assertEqual(result, "success")
|
||
|
|
self.assertEqual(call_count[0], 1)
|
||
|
|
|
||
|
|
def test_retry_operation_failure(self):
|
||
|
|
"""测试重试失败"""
|
||
|
|
from utils.common import retry_operation
|
||
|
|
|
||
|
|
@retry_operation(max_retries=2, delay=0.01)
|
||
|
|
def fail_func():
|
||
|
|
raise ValueError("test error")
|
||
|
|
|
||
|
|
with self.assertRaises(ValueError):
|
||
|
|
fail_func()
|
||
|
|
|
||
|
|
def test_exponential_backoff(self):
|
||
|
|
"""测试指数退避"""
|
||
|
|
from utils.common import ExponentialBackoff
|
||
|
|
|
||
|
|
backoff = ExponentialBackoff(
|
||
|
|
base_delay=0.01,
|
||
|
|
max_delay=0.1,
|
||
|
|
max_attempts=3
|
||
|
|
)
|
||
|
|
|
||
|
|
delays = []
|
||
|
|
for _ in range(3):
|
||
|
|
delays.append(backoff.get_delay())
|
||
|
|
backoff.next_attempt()
|
||
|
|
|
||
|
|
self.assertEqual(len(delays), 3)
|
||
|
|
self.assertTrue(delays[0] <= delays[1] <= delays[2])
|
||
|
|
|
||
|
|
def test_ensure_directory_exists(self):
|
||
|
|
"""测试确保目录存在"""
|
||
|
|
from utils.common import ensure_directory_exists
|
||
|
|
import tempfile
|
||
|
|
|
||
|
|
with tempfile.TemporaryDirectory() as tmpdir:
|
||
|
|
test_path = os.path.join(tmpdir, "test_dir", "sub_dir")
|
||
|
|
|
||
|
|
result = ensure_directory_exists(test_path)
|
||
|
|
|
||
|
|
self.assertTrue(result)
|
||
|
|
self.assertTrue(os.path.exists(test_path))
|
||
|
|
|
||
|
|
def test_format_file_size(self):
|
||
|
|
"""测试格式化文件大小"""
|
||
|
|
from utils.common import format_file_size
|
||
|
|
|
||
|
|
self.assertEqual(format_file_size(500), "500.00 B")
|
||
|
|
self.assertEqual(format_file_size(1024), "1.00 KB")
|
||
|
|
self.assertEqual(format_file_size(1024 * 1024), "1.00 MB")
|
||
|
|
self.assertEqual(format_file_size(1024 * 1024 * 1024), "1.00 GB")
|
||
|
|
|
||
|
|
|
||
|
|
class TestPerformanceTimer(unittest.TestCase):
|
||
|
|
"""测试性能计时器"""
|
||
|
|
|
||
|
|
def test_timer_basic(self):
|
||
|
|
"""测试基本计时"""
|
||
|
|
from utils.common import PerformanceTimer
|
||
|
|
|
||
|
|
timer = PerformanceTimer()
|
||
|
|
timer.start("test")
|
||
|
|
time.sleep(0.01)
|
||
|
|
elapsed = timer.stop("test")
|
||
|
|
|
||
|
|
self.assertGreater(elapsed, 0)
|
||
|
|
self.assertLess(elapsed, 1)
|
||
|
|
|
||
|
|
def test_timer_get_elapsed(self):
|
||
|
|
"""测试获取已记录时间"""
|
||
|
|
from utils.common import PerformanceTimer
|
||
|
|
|
||
|
|
timer = PerformanceTimer()
|
||
|
|
timer.start("test")
|
||
|
|
time.sleep(0.01)
|
||
|
|
timer.stop("test")
|
||
|
|
|
||
|
|
elapsed = timer.get_elapsed("test")
|
||
|
|
|
||
|
|
self.assertGreater(elapsed, 0)
|
||
|
|
|
||
|
|
def test_timer_reset(self):
|
||
|
|
"""测试重置计时器"""
|
||
|
|
from utils.common import PerformanceTimer
|
||
|
|
|
||
|
|
timer = PerformanceTimer()
|
||
|
|
timer.start("test")
|
||
|
|
timer.stop("test")
|
||
|
|
|
||
|
|
timer.reset()
|
||
|
|
|
||
|
|
self.assertEqual(timer.get_elapsed("test"), 0)
|
||
|
|
|
||
|
|
|
||
|
|
class TestVersionControl(unittest.TestCase):
|
||
|
|
"""测试版本控制"""
|
||
|
|
|
||
|
|
def test_version_control_creation(self):
|
||
|
|
"""测试版本控制创建"""
|
||
|
|
from utils.version_control import VersionControl
|
||
|
|
|
||
|
|
vc = VersionControl()
|
||
|
|
|
||
|
|
self.assertIsNotNone(vc)
|
||
|
|
|
||
|
|
def test_record_update(self):
|
||
|
|
"""测试记录更新"""
|
||
|
|
from utils.version_control import VersionControl
|
||
|
|
import tempfile
|
||
|
|
|
||
|
|
with tempfile.NamedTemporaryFile(suffix=".md", delete=False) as f:
|
||
|
|
path = f.name
|
||
|
|
|
||
|
|
try:
|
||
|
|
vc = VersionControl(path)
|
||
|
|
vc.record_update(
|
||
|
|
version="1.0.1",
|
||
|
|
update_type="测试",
|
||
|
|
description="测试更新",
|
||
|
|
updated_by="测试人员"
|
||
|
|
)
|
||
|
|
|
||
|
|
history = vc.get_version_history()
|
||
|
|
|
||
|
|
self.assertGreater(len(history), 0)
|
||
|
|
|
||
|
|
finally:
|
||
|
|
if os.path.exists(path):
|
||
|
|
os.remove(path)
|
||
|
|
|
||
|
|
def test_get_changelog_content(self):
|
||
|
|
"""测试获取CHANGELOG内容"""
|
||
|
|
from utils.version_control import VersionControl
|
||
|
|
import tempfile
|
||
|
|
|
||
|
|
with tempfile.NamedTemporaryFile(suffix=".md", delete=False) as f:
|
||
|
|
path = f.name
|
||
|
|
|
||
|
|
try:
|
||
|
|
vc = VersionControl(path)
|
||
|
|
content = vc.get_changelog_content()
|
||
|
|
|
||
|
|
self.assertIn("CHANGELOG", content)
|
||
|
|
|
||
|
|
finally:
|
||
|
|
if os.path.exists(path):
|
||
|
|
os.remove(path)
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
unittest.main()
|