test_analyzer.py 10.2 KB
Newer Older
chengshunyan's avatar
chengshunyan committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
#!/usr/bin/env python3
"""
DCU Performance Analyzer - 测试套件
用于验证工具的功能正确性和稳定性
"""

import unittest
import tempfile
import shutil
import json
import os
import sys
from unittest.mock import patch, MagicMock

# 添加父目录到路径
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from dcu_performance_analyzer import DCUPerformanceAnalyzer, CheckResult

class TestDCUPerformanceAnalyzer(unittest.TestCase):
    """DCU性能分析器测试类"""
    
    def setUp(self):
        """测试前设置"""
        self.test_dir = tempfile.mkdtemp()
        self.analyzer = DCUPerformanceAnalyzer(output_dir=self.test_dir, debug=True)
    
    def tearDown(self):
        """测试后清理"""
        shutil.rmtree(self.test_dir, ignore_errors=True)
    
    @patch('dcu_performance_analyzer.subprocess.run')
    def test_run_command_success(self, mock_run):
        """测试命令执行成功"""
        # 模拟成功的命令执行
        mock_result = MagicMock()
        mock_result.returncode = 0
        mock_result.stdout = "test output"
        mock_result.stderr = ""
        mock_run.return_value = mock_result
        
        returncode, stdout, stderr = self.analyzer.run_command("echo test")
        
        self.assertEqual(returncode, 0)
        self.assertEqual(stdout, "test output")
        self.assertEqual(stderr, "")
    
    @patch('dcu_performance_analyzer.subprocess.run')
    def test_run_command_failure(self, mock_run):
        """测试命令执行失败"""
        # 模拟失败的命令执行
        mock_result = MagicMock()
        mock_result.returncode = 1
        mock_result.stdout = ""
        mock_result.stderr = "error message"
        mock_run.return_value = mock_result
        
        returncode, stdout, stderr = self.analyzer.run_command("false")
        
        self.assertEqual(returncode, 1)
        self.assertEqual(stdout, "")
        self.assertEqual(stderr, "error message")
    
    @patch('dcu_performance_analyzer.subprocess.run')
    def test_run_command_timeout(self, mock_run):
        """测试命令超时"""
        # 模拟超时异常
        mock_run.side_effect = subprocess.TimeoutExpired("cmd", 1)
        
        returncode, stdout, stderr = self.analyzer.run_command("sleep 10", timeout=1)
        
        self.assertEqual(returncode, -1)
        self.assertEqual(stdout, "")
        self.assertEqual(stderr, "Command timeout")
    
    @patch('dcu_performance_analyzer.subprocess.run')
    def test_check_system_info(self, mock_run):
        """测试系统信息检查"""
        # 模拟系统命令输出
        mock_result = MagicMock()
        mock_result.returncode = 0
        mock_result.stdout = "CPU info test"
        mock_result.stderr = ""
        mock_run.return_value = mock_result
        
        result = self.analyzer.check_system_info()
        
        self.assertIsInstance(result, CheckResult)
        self.assertEqual(result.module, "System Information")
        self.assertIn(result.status, ["PASS", "FAIL"])
        self.assertIsInstance(result.execution_time, float)
        self.assertGreater(result.execution_time, 0)
    
    @patch('dcu_performance_analyzer.subprocess.run')
    def test_check_pcie_devices(self, mock_run):
        """测试PCIe设备检查"""
        # 模拟lspci命令输出
        mock_result = MagicMock()
        mock_result.returncode = 0
        mock_result.stdout = "00:00.0 Host bridge: Intel test\n01:00.0 VGA compatible controller: 1d94:1234 DCU"
        mock_result.stderr = ""
        mock_run.return_value = mock_result
        
        result = self.analyzer.check_pcie_devices()
        
        self.assertIsInstance(result, CheckResult)
        self.assertEqual(result.module, "PCIe Devices")
        self.assertIn("dcu_devices", result.details)
        self.assertGreaterEqual(result.details["dcu_devices"], 0)
    
    @patch('dcu_performance_analyzer.subprocess.run')
    def test_check_driver_status(self, mock_run):
        """测试驱动状态检查"""
        # 模拟lsmod命令输出
        mock_result = MagicMock()
        mock_result.returncode = 0
        mock_result.stdout = "hydcu 12345 1 - Live 0xffffffffa0000000"
        mock_result.stderr = ""
        mock_run.return_value = mock_result
        
        result = self.analyzer.check_driver_status()
        
        self.assertIsInstance(result, CheckResult)
        self.assertEqual(result.module, "Driver Status")
        self.assertIn("loaded_modules", result.details)
        self.assertIsInstance(result.details["loaded_modules"], list)
    
    @patch('dcu_performance_analyzer.subprocess.run')
    def test_check_performance_metrics(self, mock_run):
        """测试性能指标检查"""
        # 模拟性能命令输出
        def side_effect(cmd, **kwargs):
            mock_result = MagicMock()
            if "top" in cmd:
                mock_result.returncode = 0
                mock_result.stdout = "%Cpu(s):  5.7 us"
            elif "free" in cmd:
                mock_result.returncode = 0
                mock_result.stdout = "Mem:    1542486     54998   1487488        0      1234     23456"
            elif "df" in cmd:
                mock_result.returncode = 0
                mock_result.stdout = "/dev/sda1        50G   45G  5G  90% /"
            elif "uptime" in cmd:
                mock_result.returncode = 0
                mock_result.stdout = "14:30:00 up 1 day, 0:30,  1 user,  load average: 2.17, 3.73, 4.72"
            else:
                mock_result.returncode = 0
                mock_result.stdout = ""
            mock_result.stderr = ""
            return mock_result
        
        mock_run.side_effect = side_effect
        
        result = self.analyzer.check_performance_metrics()
        
        self.assertIsInstance(result, CheckResult)
        self.assertEqual(result.module, "Performance Metrics")
        self.assertIn("cpu_usage", result.details)
        self.assertIn("memory_usage_percent", result.details)
        self.assertIn("disk_usage_percent", result.details)
        self.assertIn("load_average_1m", result.details)
    
    def test_generate_report(self):
        """测试报告生成"""
        # 添加一些测试结果
        test_result = CheckResult(
            module="Test Module",
            status="PASS",
            message="Test passed",
            details={"test": "data"},
            timestamp="2026-02-25T12:00:00",
            execution_time=1.5
        )
        self.analyzer.results.append(test_result)
        
        report_file = self.analyzer.generate_report()
        
        self.assertTrue(os.path.exists(report_file))
        
        # 验证JSON报告格式
        with open(report_file, 'r') as f:
            report = json.load(f)
        
        self.assertIn("metadata", report)
        self.assertIn("summary", report)
        self.assertIn("results", report)
        self.assertEqual(report["summary"]["total_checks"], 1)
        self.assertEqual(report["summary"]["status_distribution"]["PASS"], 1)
    
    def test_create_package(self):
        """测试数据打包"""
        # 创建一些测试文件
        test_file = os.path.join(self.test_dir, "test.txt")
        with open(test_file, 'w') as f:
            f.write("test content")
        
        package_file = self.analyzer.create_package()
        
        self.assertTrue(os.path.exists(package_file))
        self.assertTrue(package_file.endswith(".tar.gz"))
        
        # 验证包内容
        import tarfile
        with tarfile.open(package_file, 'r:gz') as tar:
            members = tar.getnames()
            self.assertGreater(len(members), 0)
    
    def test_result_to_dict(self):
        """测试结果转换"""
        result = CheckResult(
            module="Test",
            status="PASS",
            message="OK",
            details={"key": "value"},
            timestamp="2026-02-25T12:00:00",
            execution_time=1.0
        )
        
        result_dict = self.analyzer._result_to_dict(result)
        
        self.assertIsInstance(result_dict, dict)
        self.assertEqual(result_dict["module"], "Test")
        self.assertEqual(result_dict["status"], "PASS")
        self.assertEqual(result_dict["message"], "OK")
        self.assertEqual(result_dict["details"]["key"], "value")
        self.assertEqual(result_dict["timestamp"], "2026-02-25T12:00:00")
        self.assertEqual(result_dict["execution_time"], 1.0)

class TestCLI(unittest.TestCase):
    """命令行界面测试"""
    
    @patch('dcu_performance_analyzer.DCUPerformanceAnalyzer')
    def test_main_success(self, mock_analyzer_class):
        """测试主函数成功执行"""
        mock_analyzer = MagicMock()
        mock_analyzer.run_analysis.return_value = "test_package.tar.gz"
        mock_analyzer.results = []
        mock_analyzer_class.return_value = mock_analyzer
        
        with patch('sys.argv', ['dcu_performance_analyzer.py']):
            with patch('sys.exit') as mock_exit:
                from dcu_performance_analyzer import main
                main()
                mock_exit.assert_called_with(0)
    
    @patch('dcu_performance_analyzer.DCUPerformanceAnalyzer')
    def test_main_with_checks(self, mock_analyzer_class):
        """测试指定检查模块"""
        mock_analyzer = MagicMock()
        mock_analyzer.run_analysis.return_value = "test_package.tar.gz"
        mock_analyzer.results = []
        mock_analyzer_class.return_value = mock_analyzer
        
        with patch('sys.argv', ['dcu_performance_analyzer.py', '-c', 'system', 'pcie']):
            with patch('sys.exit') as mock_exit:
                from dcu_performance_analyzer import main
                main()
                mock_analyzer.run_analysis.assert_called_with(['system', 'pcie'])
                mock_exit.assert_called_with(0)
    
    def test_create_cli(self):
        """测试CLI创建"""
        from dcu_performance_analyzer import create_cli
        parser = create_cli()
        
        # 测试基本参数解析
        args = parser.parse_args(['-c', 'system', '-o', '/tmp/test', '-d'])
        self.assertEqual(args.checks, ['system'])
        self.assertEqual(args.output, '/tmp/test')
        self.assertTrue(args.debug)

if __name__ == '__main__':
    # 运行测试
    unittest.main(verbosity=2)