Skip to content

Commit 79976f9

Browse files
committed
Add CLI and configuration tests for GitHub Stats Analyzer
- Introduced new test cases for the command line interface (CLI) to validate argument parsing and default configurations. - Added tests for the configuration module to ensure correct handling of environment variables and default values. - Updated the test suite to include the new CLI and configuration tests, enhancing overall test coverage and reliability. - Modified the test features script to include tests for new CLI options, ensuring comprehensive testing of user-configurable parameters.
1 parent 497d088 commit 79976f9

File tree

4 files changed

+261
-0
lines changed

4 files changed

+261
-0
lines changed

tests/run_all_tests.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717

1818
# 导入测试模块
1919
from tests.test_analyzer import TestGitHubStatsAnalyzer, TestGitHubAPIClient
20+
from tests.test_cli import TestCLI
21+
from tests.test_config import TestConfig
2022

2123
def run_unit_tests():
2224
"""运行单元测试"""
@@ -32,6 +34,8 @@ def run_unit_tests():
3234
loader = unittest.TestLoader()
3335
suite.addTest(loader.loadTestsFromTestCase(TestGitHubStatsAnalyzer))
3436
suite.addTest(loader.loadTestsFromTestCase(TestGitHubAPIClient))
37+
suite.addTest(loader.loadTestsFromTestCase(TestCLI))
38+
suite.addTest(loader.loadTestsFromTestCase(TestConfig))
3539

3640
# 运行测试
3741
runner = unittest.TextTestRunner(verbosity=2)

tests/test_cli.py

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
#!/usr/bin/env python3
2+
"""
3+
测试 GitHub Stats Analyzer 的命令行接口
4+
"""
5+
6+
import unittest
7+
import sys
8+
import os
9+
from unittest.mock import patch, MagicMock
10+
from io import StringIO
11+
12+
from github_stats_analyzer.cli import parse_args
13+
from github_stats_analyzer.config import MAX_CONCURRENT_REPOS, MAX_RETRIES, RETRY_DELAY, AccessLevel
14+
15+
class TestCLI(unittest.TestCase):
16+
"""测试命令行接口"""
17+
18+
def setUp(self):
19+
"""设置测试环境"""
20+
# 保存原始的 sys.argv
21+
self.original_argv = sys.argv
22+
# 保存原始的环境变量
23+
self.original_env = os.environ.copy()
24+
25+
def tearDown(self):
26+
"""恢复测试环境"""
27+
# 恢复原始的 sys.argv
28+
sys.argv = self.original_argv
29+
# 恢复原始的环境变量
30+
os.environ.clear()
31+
os.environ.update(self.original_env)
32+
33+
@patch('github_stats_analyzer.cli.logger')
34+
def test_parse_args_default(self, mock_logger):
35+
"""测试默认参数解析"""
36+
# 模拟命令行参数
37+
sys.argv = ['github-stats', 'test-user']
38+
39+
# 解析参数
40+
username, debug_mode, excluded_languages, github_token, access_level, args = parse_args()
41+
42+
# 验证结果
43+
self.assertEqual(username, 'test-user')
44+
self.assertEqual(debug_mode, False)
45+
self.assertIsNotNone(excluded_languages)
46+
self.assertIsNone(github_token)
47+
self.assertEqual(access_level, AccessLevel.BASIC)
48+
49+
# 验证新增参数的默认值
50+
self.assertEqual(args.max_concurrent_repos, MAX_CONCURRENT_REPOS)
51+
self.assertEqual(args.max_retries, MAX_RETRIES)
52+
self.assertEqual(args.retry_delay, RETRY_DELAY)
53+
54+
@patch('github_stats_analyzer.cli.logger')
55+
def test_parse_args_custom(self, mock_logger):
56+
"""测试自定义参数解析"""
57+
# 模拟命令行参数
58+
sys.argv = [
59+
'github-stats', 'test-user',
60+
'--max-concurrent-repos', '20',
61+
'--max-retries', '5',
62+
'--retry-delay', '2.5'
63+
]
64+
65+
# 解析参数
66+
username, debug_mode, excluded_languages, github_token, access_level, args = parse_args()
67+
68+
# 验证结果
69+
self.assertEqual(username, 'test-user')
70+
self.assertEqual(debug_mode, False)
71+
self.assertIsNotNone(excluded_languages)
72+
self.assertIsNone(github_token)
73+
self.assertEqual(access_level, AccessLevel.BASIC)
74+
75+
# 验证新增参数的自定义值
76+
self.assertEqual(args.max_concurrent_repos, 20)
77+
self.assertEqual(args.max_retries, 5)
78+
self.assertEqual(args.retry_delay, 2.5)
79+
80+
@patch('github_stats_analyzer.cli.logger')
81+
def test_parse_args_with_all_options(self, mock_logger):
82+
"""测试所有选项的参数解析"""
83+
# 模拟命令行参数
84+
sys.argv = [
85+
'github-stats', 'test-user',
86+
'--debug',
87+
'--include-all',
88+
'--access-level', 'full',
89+
'--token', 'test-token',
90+
'--output', 'json',
91+
'--max-repos', '15',
92+
'--max-commits', '50',
93+
'--max-concurrent-repos', '25',
94+
'--max-retries', '8',
95+
'--retry-delay', '3.0'
96+
]
97+
98+
# 解析参数
99+
username, debug_mode, excluded_languages, github_token, access_level, args = parse_args()
100+
101+
# 验证结果
102+
self.assertEqual(username, 'test-user')
103+
self.assertEqual(debug_mode, True)
104+
self.assertEqual(excluded_languages, set()) # include-all 选项会设置为空集合
105+
self.assertEqual(github_token, 'test-token')
106+
self.assertEqual(access_level, AccessLevel.FULL)
107+
self.assertEqual(args.output, 'json')
108+
self.assertEqual(args.max_repos, 15)
109+
self.assertEqual(args.max_commits, 50)
110+
111+
# 验证新增参数的自定义值
112+
self.assertEqual(args.max_concurrent_repos, 25)
113+
self.assertEqual(args.max_retries, 8)
114+
self.assertEqual(args.retry_delay, 3.0)
115+
116+
def run_tests():
117+
"""运行测试"""
118+
unittest.main()
119+
120+
if __name__ == '__main__':
121+
run_tests()

tests/test_config.py

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
#!/usr/bin/env python3
2+
"""
3+
测试 GitHub Stats Analyzer 的配置模块
4+
"""
5+
6+
import unittest
7+
import os
8+
from unittest.mock import patch
9+
10+
from github_stats_analyzer.config import (
11+
MAX_CONCURRENT_REPOS,
12+
MAX_RETRIES,
13+
RETRY_DELAY,
14+
DEBUG,
15+
ERROR_HANDLING_CONFIG,
16+
OUTPUT_CONFIG
17+
)
18+
19+
class TestConfig(unittest.TestCase):
20+
"""测试配置模块"""
21+
22+
def setUp(self):
23+
"""设置测试环境"""
24+
# 保存原始的环境变量
25+
self.original_env = os.environ.copy()
26+
27+
def tearDown(self):
28+
"""恢复测试环境"""
29+
# 恢复原始的环境变量
30+
os.environ.clear()
31+
os.environ.update(self.original_env)
32+
33+
def test_default_config(self):
34+
"""测试默认配置值"""
35+
# 清除可能影响测试的环境变量
36+
for var in ['MAX_CONCURRENT_REPOS', 'MAX_RETRIES', 'RETRY_DELAY', 'DEBUG']:
37+
if var in os.environ:
38+
del os.environ[var]
39+
40+
# 重新导入配置模块以应用默认值
41+
import importlib
42+
import github_stats_analyzer.config
43+
importlib.reload(github_stats_analyzer.config)
44+
from github_stats_analyzer.config import (
45+
MAX_CONCURRENT_REPOS,
46+
MAX_RETRIES,
47+
RETRY_DELAY,
48+
DEBUG
49+
)
50+
51+
# 验证默认值
52+
self.assertEqual(MAX_CONCURRENT_REPOS, 10)
53+
self.assertEqual(MAX_RETRIES, 3)
54+
self.assertEqual(RETRY_DELAY, 1.0)
55+
self.assertEqual(DEBUG, False)
56+
57+
# 验证错误处理配置使用了默认值
58+
self.assertEqual(ERROR_HANDLING_CONFIG["max_retries"], MAX_RETRIES)
59+
self.assertEqual(ERROR_HANDLING_CONFIG["retry_delay"], RETRY_DELAY)
60+
61+
# 验证输出配置使用了默认值
62+
self.assertEqual(OUTPUT_CONFIG["show_debug"], DEBUG)
63+
64+
def test_env_var_config(self):
65+
"""测试从环境变量读取配置值"""
66+
# 设置环境变量
67+
os.environ["MAX_CONCURRENT_REPOS"] = "20"
68+
os.environ["MAX_RETRIES"] = "8"
69+
os.environ["RETRY_DELAY"] = "2.5"
70+
os.environ["DEBUG"] = "true"
71+
72+
# 重新导入配置模块以应用环境变量
73+
import importlib
74+
import github_stats_analyzer.config
75+
importlib.reload(github_stats_analyzer.config)
76+
from github_stats_analyzer.config import (
77+
MAX_CONCURRENT_REPOS,
78+
MAX_RETRIES,
79+
RETRY_DELAY,
80+
DEBUG,
81+
ERROR_HANDLING_CONFIG,
82+
OUTPUT_CONFIG
83+
)
84+
85+
# 验证从环境变量读取的值
86+
self.assertEqual(MAX_CONCURRENT_REPOS, 20)
87+
self.assertEqual(MAX_RETRIES, 8)
88+
self.assertEqual(RETRY_DELAY, 2.5)
89+
self.assertEqual(DEBUG, True)
90+
91+
# 验证错误处理配置使用了环境变量的值
92+
self.assertEqual(ERROR_HANDLING_CONFIG["max_retries"], MAX_RETRIES)
93+
self.assertEqual(ERROR_HANDLING_CONFIG["retry_delay"], RETRY_DELAY)
94+
95+
# 验证输出配置使用了环境变量的值
96+
self.assertEqual(OUTPUT_CONFIG["show_debug"], DEBUG)
97+
98+
def test_invalid_env_var_config(self):
99+
"""测试无效的环境变量值"""
100+
# 设置无效的环境变量
101+
os.environ["MAX_CONCURRENT_REPOS"] = "invalid"
102+
os.environ["MAX_RETRIES"] = "invalid"
103+
os.environ["RETRY_DELAY"] = "invalid"
104+
os.environ["DEBUG"] = "invalid"
105+
106+
# 重新导入配置模块,应该使用默认值
107+
import importlib
108+
import github_stats_analyzer.config
109+
importlib.reload(github_stats_analyzer.config)
110+
from github_stats_analyzer.config import (
111+
MAX_CONCURRENT_REPOS,
112+
MAX_RETRIES,
113+
RETRY_DELAY,
114+
DEBUG
115+
)
116+
117+
# 验证使用了默认值(因为环境变量值无效)
118+
self.assertEqual(MAX_CONCURRENT_REPOS, 10) # 默认值
119+
self.assertEqual(MAX_RETRIES, 3) # 默认值
120+
self.assertEqual(RETRY_DELAY, 1.0) # 默认值
121+
self.assertEqual(DEBUG, False) # 默认值
122+
123+
def run_tests():
124+
"""运行测试"""
125+
unittest.main()
126+
127+
if __name__ == '__main__':
128+
run_tests()

tests/test_features.sh

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,17 @@ run_test "exclude_languages" "python -m github_stats_analyzer.main octocat --exc
7676
run_test "code_changes_stats" "python -m github_stats_analyzer.main octocat --access-level full --max-repos 2" "Code +/-"
7777
run_test "code_net_change" "python -m github_stats_analyzer.main octocat --access-level full --max-repos 2" "Net Change"
7878

79+
# 测试新增的CLI选项
80+
run_test "max_concurrent_repos" "python -m github_stats_analyzer.main octocat --max-repos 2 --max-concurrent-repos 5" "max_concurrent_repos=5"
81+
run_test "max_retries" "python -m github_stats_analyzer.main octocat --max-repos 1 --max-retries 8" "max_retries=8"
82+
run_test "retry_delay" "python -m github_stats_analyzer.main octocat --max-repos 1 --retry-delay 2.5" "retry_delay=2.5"
83+
7984
# 测试组合参数
8085
run_test "combined_params" "python -m github_stats_analyzer.main octocat -o json --max-repos 1 --max-commits 5 --include-all" "\"username\": \"octocat\""
8186

87+
# 测试新增选项的组合
88+
run_test "combined_new_options" "python -m github_stats_analyzer.main octocat --max-repos 1 --max-concurrent-repos 15 --max-retries 6 --retry-delay 3.0" "max_concurrent_repos=15, max_retries=6, retry_delay=3.0"
89+
8290
# 生成测试报告
8391
echo -e "${YELLOW}生成测试报告...${NC}"
8492

0 commit comments

Comments
 (0)