jit-utils-backend 0.0.1__py3-none-any.whl → 0.0.3__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.
- jit_utils/__init__.py +7 -135
- {jit_utils_backend-0.0.1.dist-info → jit_utils_backend-0.0.3.dist-info}/METADATA +18 -17
- {jit_utils_backend-0.0.1.dist-info → jit_utils_backend-0.0.3.dist-info}/RECORD +5 -11
- {jit_utils_backend-0.0.1.dist-info → jit_utils_backend-0.0.3.dist-info}/top_level.txt +0 -1
- tests/__init__.py +0 -4
- tests/run_tests.py +0 -102
- tests/test_package_imports.py +0 -199
- tests/test_qrcode_barcode.py +0 -182
- tests/test_string_utils.py +0 -174
- tests/test_time_utils.py +0 -185
- {jit_utils_backend-0.0.1.dist-info → jit_utils_backend-0.0.3.dist-info}/WHEEL +0 -0
jit_utils/__init__.py
CHANGED
@@ -12,141 +12,13 @@ A comprehensive utility package for backend development with JIT.
|
|
12
12
|
- 网络工具
|
13
13
|
- 签名工具
|
14
14
|
等等...
|
15
|
+
|
16
|
+
使用方法:
|
17
|
+
from jit_utils.string import randomString
|
18
|
+
from jit_utils.time import now
|
19
|
+
from jit_utils.qrcode import Qrcode
|
20
|
+
...
|
15
21
|
"""
|
16
22
|
|
17
|
-
__version__ = '0.0.
|
23
|
+
__version__ = '0.0.3'
|
18
24
|
__author__ = 'zangtao'
|
19
|
-
|
20
|
-
# 导入主要的工具类和函数
|
21
|
-
try:
|
22
|
-
from .decorator import forward
|
23
|
-
except ImportError:
|
24
|
-
pass
|
25
|
-
|
26
|
-
# 时间工具
|
27
|
-
try:
|
28
|
-
from . import time as time_utils
|
29
|
-
# 导出一些常用的时间函数
|
30
|
-
from .time import (
|
31
|
-
now, today, get, dayShift,
|
32
|
-
monday, weekShift, monthStart, monthShift,
|
33
|
-
quarterStart, quarterShift, yearStart, yearShift,
|
34
|
-
getTimestamp, timeStampToDateTime, strToTimestamp,
|
35
|
-
formatNow, datetime2string, string2datetime
|
36
|
-
)
|
37
|
-
except ImportError:
|
38
|
-
pass
|
39
|
-
|
40
|
-
# 字符串工具
|
41
|
-
try:
|
42
|
-
from . import string as string_utils
|
43
|
-
from .string import (
|
44
|
-
randomString, randomNum, getUuidStr,
|
45
|
-
md5Bytes, md5Str, getFileMd5,
|
46
|
-
renderTemplateString
|
47
|
-
)
|
48
|
-
except ImportError:
|
49
|
-
pass
|
50
|
-
|
51
|
-
# 二维码工具
|
52
|
-
try:
|
53
|
-
from .qrcode import Qrcode
|
54
|
-
except ImportError:
|
55
|
-
Qrcode = None
|
56
|
-
|
57
|
-
# 条形码工具
|
58
|
-
try:
|
59
|
-
from .barcode import Barcode
|
60
|
-
except ImportError:
|
61
|
-
Barcode = None
|
62
|
-
|
63
|
-
# 验证工具
|
64
|
-
try:
|
65
|
-
from .validator import ParamsValidator
|
66
|
-
except ImportError:
|
67
|
-
ParamsValidator = None
|
68
|
-
|
69
|
-
# 网络工具
|
70
|
-
try:
|
71
|
-
from . import network
|
72
|
-
except ImportError:
|
73
|
-
pass
|
74
|
-
|
75
|
-
# 签名工具
|
76
|
-
try:
|
77
|
-
from . import signature
|
78
|
-
except ImportError:
|
79
|
-
pass
|
80
|
-
|
81
|
-
# 匹配工具
|
82
|
-
try:
|
83
|
-
from . import matchTool
|
84
|
-
except ImportError:
|
85
|
-
pass
|
86
|
-
|
87
|
-
# 类工具
|
88
|
-
try:
|
89
|
-
from . import clsTool
|
90
|
-
except ImportError:
|
91
|
-
pass
|
92
|
-
|
93
|
-
# 转换工具
|
94
|
-
try:
|
95
|
-
from .convert import Converter, MemoryCompiler
|
96
|
-
except ImportError:
|
97
|
-
# 如果导入失败,创建占位符避免 __all__ 报错
|
98
|
-
Converter = None
|
99
|
-
MemoryCompiler = None
|
100
|
-
|
101
|
-
# 异常处理
|
102
|
-
try:
|
103
|
-
from . import exceptions
|
104
|
-
except ImportError:
|
105
|
-
pass
|
106
|
-
|
107
|
-
# 工作日常量
|
108
|
-
try:
|
109
|
-
from . import workday_constants
|
110
|
-
except ImportError:
|
111
|
-
pass
|
112
|
-
|
113
|
-
# 配置相关
|
114
|
-
try:
|
115
|
-
from . import config
|
116
|
-
except ImportError:
|
117
|
-
pass
|
118
|
-
|
119
|
-
# 定义 __all__ 列表,控制 from jit_utils import * 的行为
|
120
|
-
__all__ = [
|
121
|
-
# 版本信息
|
122
|
-
'__version__',
|
123
|
-
'__author__',
|
124
|
-
|
125
|
-
# 装饰器
|
126
|
-
'forward',
|
127
|
-
|
128
|
-
# 时间工具
|
129
|
-
'time_utils',
|
130
|
-
'now', 'today', 'get', 'dayShift',
|
131
|
-
'monday', 'weekShift', 'monthStart', 'monthShift',
|
132
|
-
'quarterStart', 'quarterShift', 'yearStart', 'yearShift',
|
133
|
-
'getTimestamp', 'timeStampToDateTime', 'strToTimestamp',
|
134
|
-
'formatNow', 'datetime2string', 'string2datetime',
|
135
|
-
|
136
|
-
# 字符串工具
|
137
|
-
'string_utils',
|
138
|
-
'randomString', 'randomNum', 'getUuidStr',
|
139
|
-
'md5Bytes', 'md5Str', 'getFileMd5',
|
140
|
-
'renderTemplateString',
|
141
|
-
|
142
|
-
# 二维码和条形码
|
143
|
-
'Qrcode', 'Barcode',
|
144
|
-
|
145
|
-
# 验证工具
|
146
|
-
'ParamsValidator',
|
147
|
-
|
148
|
-
# 其他模块
|
149
|
-
'network', 'signature', 'matchTool',
|
150
|
-
'clsTool', 'exceptions', 'workday_constants',
|
151
|
-
'config', 'Converter', 'MemoryCompiler'
|
152
|
-
]
|
@@ -1,12 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: jit-utils-backend
|
3
|
-
Version: 0.0.
|
3
|
+
Version: 0.0.3
|
4
4
|
Summary: 极态后端工具包
|
5
|
-
Author:
|
6
|
-
Author-email:
|
7
|
-
Project-URL: Documentation, https://github.com/zangtao/jit-utils-backend
|
8
|
-
Project-URL: Source, https://github.com/zangtao/jit-utils-backend
|
9
|
-
Project-URL: Tracker, https://github.com/zangtao/jit-utils-backend/issues
|
5
|
+
Author: JitAi
|
6
|
+
Author-email: develop@wanyunapp.com
|
10
7
|
Keywords: python,jit,sdk,apiAuth,utils,backend
|
11
8
|
Classifier: Development Status :: 3 - Alpha
|
12
9
|
Classifier: Intended Audience :: Developers
|
@@ -36,7 +33,7 @@ Requires-Dist: Pillow
|
|
36
33
|
## 安装
|
37
34
|
|
38
35
|
```bash
|
39
|
-
pip install
|
36
|
+
pip install jit_utils_backend
|
40
37
|
```
|
41
38
|
|
42
39
|
## 使用方法
|
@@ -47,11 +44,15 @@ pip install jit-utils-backend
|
|
47
44
|
# 导入整个包
|
48
45
|
import jit_utils
|
49
46
|
|
50
|
-
#
|
51
|
-
from jit_utils import now
|
47
|
+
# 导入特定功能(从具体的子模块)
|
48
|
+
from jit_utils.time import now
|
49
|
+
from jit_utils.string import randomString
|
50
|
+
from jit_utils.qrcode import Qrcode
|
51
|
+
from jit_utils.barcode import Barcode
|
52
52
|
|
53
53
|
# 导入特定模块
|
54
|
-
|
54
|
+
import jit_utils.time
|
55
|
+
import jit_utils.string
|
55
56
|
```
|
56
57
|
|
57
58
|
## 主要功能
|
@@ -59,7 +60,7 @@ from jit_utils import time_utils, string_utils
|
|
59
60
|
### 1. 时间处理工具
|
60
61
|
|
61
62
|
```python
|
62
|
-
from jit_utils import now, today, dayShift, formatNow
|
63
|
+
from jit_utils.time import now, today, dayShift, formatNow
|
63
64
|
|
64
65
|
# 获取当前时间
|
65
66
|
current_time = now()
|
@@ -77,7 +78,7 @@ formatted_time = formatNow("%Y-%m-%d %H:%M:%S")
|
|
77
78
|
### 2. 字符串处理工具
|
78
79
|
|
79
80
|
```python
|
80
|
-
from jit_utils import randomString, md5Str, getUuidStr
|
81
|
+
from jit_utils.string import randomString, md5Str, getUuidStr
|
81
82
|
|
82
83
|
# 生成随机字符串
|
83
84
|
random_str = randomString(8)
|
@@ -92,7 +93,7 @@ uuid_str = getUuidStr()
|
|
92
93
|
### 3. 二维码生成
|
93
94
|
|
94
95
|
```python
|
95
|
-
from jit_utils import Qrcode
|
96
|
+
from jit_utils.qrcode import Qrcode
|
96
97
|
|
97
98
|
# 创建二维码
|
98
99
|
qr = Qrcode("https://example.com")
|
@@ -107,7 +108,7 @@ qr_str = qr.toStr()
|
|
107
108
|
### 4. 条形码生成
|
108
109
|
|
109
110
|
```python
|
110
|
-
from jit_utils import Barcode
|
111
|
+
from jit_utils.barcode import Barcode
|
111
112
|
|
112
113
|
# 创建条形码
|
113
114
|
barcode = Barcode("123456789")
|
@@ -122,7 +123,7 @@ barcode_str = barcode.toStr()
|
|
122
123
|
### 5. 数据验证
|
123
124
|
|
124
125
|
```python
|
125
|
-
from jit_utils import ParamsValidator
|
126
|
+
from jit_utils.validator import ParamsValidator
|
126
127
|
from dataclasses import dataclass
|
127
128
|
|
128
129
|
@dataclass
|
@@ -138,7 +139,7 @@ params = UserParams("test_function", name="John", age=25)
|
|
138
139
|
### 6. 装饰器
|
139
140
|
|
140
141
|
```python
|
141
|
-
from jit_utils import forward
|
142
|
+
from jit_utils.decorator import forward
|
142
143
|
|
143
144
|
@forward("module.submodule")
|
144
145
|
def my_function():
|
@@ -179,4 +180,4 @@ zangtao (noguchisyou123456@gmail.com)
|
|
179
180
|
|
180
181
|
## 版本
|
181
182
|
|
182
|
-
0.0.
|
183
|
+
0.0.3
|
@@ -1,4 +1,4 @@
|
|
1
|
-
jit_utils/__init__.py,sha256=
|
1
|
+
jit_utils/__init__.py,sha256=uiOH1XdTzqKkXJZ0B5RbTZzJCP0Yvl5l48Lu2rmIRH8,473
|
2
2
|
jit_utils/apiAuthSign.py,sha256=TzYe3tDVQw0LYcE82IPcibtt_qyGTJ3XbWVjti5lGx0,2323
|
3
3
|
jit_utils/barcode.py,sha256=PuSHqxttr4rOGMAfojK7Ii72z4CoqxUQR_hmMOaElN8,1102
|
4
4
|
jit_utils/clsTool.py,sha256=tfMy3ITwfbfBLE6cjTrrRwMWB0aFh4fAYGJBZJ3vmCE,2316
|
@@ -20,13 +20,7 @@ jit_utils/config/case.py,sha256=sFs5NvFaga7lbjlSDRwMKkufiIEYFSYSG3ha8PB1-58,2591
|
|
20
20
|
jit_utils/config/config.py,sha256=kH0u0eTwQR0shS0KwYd9f8c9uDxKPyjxYpYQ0rKZLXc,2713
|
21
21
|
jit_utils/config/exception.py,sha256=wrok-q14bTl8afClYgX649F2Qk0vrwl6LiWGgpkKDY0,378
|
22
22
|
jit_utils/config/field.py,sha256=5cq0M7zAtJrFkEHQ2H-1x95ypQxMyg07JjHnIAzSPQg,4759
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
tests/test_string_utils.py,sha256=i1Q98PwMrPbjc4nkb1O3Z4pwvu0SMZrSOYbgDdeU4D4,5845
|
28
|
-
tests/test_time_utils.py,sha256=nl9k_g0HmILHYTANMMRQgOF_vO4qGkfMzs6XiEJEnYA,6944
|
29
|
-
jit_utils_backend-0.0.1.dist-info/METADATA,sha256=IxlSo4XAQFTsE_yUsITSozIWWFqmSwLHTfqH1eDLpAE,3768
|
30
|
-
jit_utils_backend-0.0.1.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
31
|
-
jit_utils_backend-0.0.1.dist-info/top_level.txt,sha256=SvmeRMPwBF2UwUtkhHAzXWSPhwVATqN2FFmZp2pJHjA,16
|
32
|
-
jit_utils_backend-0.0.1.dist-info/RECORD,,
|
23
|
+
jit_utils_backend-0.0.3.dist-info/METADATA,sha256=_O6Fe1jHYjVuDRmariTZttqI0tH9ul_DEClQRIJSwAI,3710
|
24
|
+
jit_utils_backend-0.0.3.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
|
25
|
+
jit_utils_backend-0.0.3.dist-info/top_level.txt,sha256=r9DXZkwpqwiisjnpeWfLj01h_M6yxlF_DvjprlPJmco,10
|
26
|
+
jit_utils_backend-0.0.3.dist-info/RECORD,,
|
tests/__init__.py
DELETED
tests/run_tests.py
DELETED
@@ -1,102 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
# -*-coding:utf-8-*-
|
3
|
-
"""
|
4
|
-
JIT Utils Backend 测试运行器
|
5
|
-
|
6
|
-
运行所有测试并生成报告
|
7
|
-
"""
|
8
|
-
import sys
|
9
|
-
import unittest
|
10
|
-
import os
|
11
|
-
|
12
|
-
# 添加项目根目录到Python路径
|
13
|
-
project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
14
|
-
sys.path.insert(0, project_root)
|
15
|
-
|
16
|
-
|
17
|
-
def run_all_tests():
|
18
|
-
"""运行所有测试"""
|
19
|
-
# 发现测试目录中的所有测试
|
20
|
-
test_dir = os.path.dirname(os.path.abspath(__file__))
|
21
|
-
|
22
|
-
# 创建测试套件
|
23
|
-
loader = unittest.TestLoader()
|
24
|
-
suite = loader.discover(test_dir, pattern='test_*.py')
|
25
|
-
|
26
|
-
# 运行测试
|
27
|
-
runner = unittest.TextTestRunner(verbosity=2, stream=sys.stdout)
|
28
|
-
result = runner.run(suite)
|
29
|
-
|
30
|
-
# 打印总结
|
31
|
-
print("\n" + "="*60)
|
32
|
-
print("测试总结:")
|
33
|
-
print(f"运行测试数: {result.testsRun}")
|
34
|
-
print(f"失败数: {len(result.failures)}")
|
35
|
-
print(f"错误数: {len(result.errors)}")
|
36
|
-
print(f"跳过数: {len(result.skipped)}")
|
37
|
-
|
38
|
-
if result.failures:
|
39
|
-
print("\n失败的测试:")
|
40
|
-
for test, traceback in result.failures:
|
41
|
-
print(f" - {test}: {traceback.split('AssertionError:')[-1].strip()}")
|
42
|
-
|
43
|
-
if result.errors:
|
44
|
-
print("\n出错的测试:")
|
45
|
-
for test, traceback in result.errors:
|
46
|
-
print(f" - {test}: {traceback.split('Error:')[-1].strip()}")
|
47
|
-
|
48
|
-
if result.skipped:
|
49
|
-
print("\n跳过的测试:")
|
50
|
-
for test, reason in result.skipped:
|
51
|
-
print(f" - {test}: {reason}")
|
52
|
-
|
53
|
-
success_rate = ((result.testsRun - len(result.failures) - len(result.errors)) / result.testsRun * 100) if result.testsRun > 0 else 0
|
54
|
-
print(f"\n成功率: {success_rate:.1f}%")
|
55
|
-
|
56
|
-
return result.wasSuccessful()
|
57
|
-
|
58
|
-
|
59
|
-
def run_specific_test(test_name):
|
60
|
-
"""运行特定的测试模块"""
|
61
|
-
test_dir = os.path.dirname(os.path.abspath(__file__))
|
62
|
-
|
63
|
-
try:
|
64
|
-
# 动态导入测试模块
|
65
|
-
test_module = __import__(f'tests.{test_name}', fromlist=[test_name])
|
66
|
-
|
67
|
-
# 创建测试套件
|
68
|
-
loader = unittest.TestLoader()
|
69
|
-
suite = loader.loadTestsFromModule(test_module)
|
70
|
-
|
71
|
-
# 运行测试
|
72
|
-
runner = unittest.TextTestRunner(verbosity=2)
|
73
|
-
result = runner.run(suite)
|
74
|
-
|
75
|
-
return result.wasSuccessful()
|
76
|
-
|
77
|
-
except ImportError as e:
|
78
|
-
print(f"无法导入测试模块 '{test_name}': {e}")
|
79
|
-
return False
|
80
|
-
|
81
|
-
|
82
|
-
def main():
|
83
|
-
"""主函数"""
|
84
|
-
if len(sys.argv) > 1:
|
85
|
-
# 运行特定测试
|
86
|
-
test_name = sys.argv[1]
|
87
|
-
if not test_name.startswith('test_'):
|
88
|
-
test_name = f'test_{test_name}'
|
89
|
-
|
90
|
-
print(f"运行测试模块: {test_name}")
|
91
|
-
success = run_specific_test(test_name)
|
92
|
-
else:
|
93
|
-
# 运行所有测试
|
94
|
-
print("运行所有测试...")
|
95
|
-
success = run_all_tests()
|
96
|
-
|
97
|
-
# 根据测试结果设置退出码
|
98
|
-
sys.exit(0 if success else 1)
|
99
|
-
|
100
|
-
|
101
|
-
if __name__ == '__main__':
|
102
|
-
main()
|
tests/test_package_imports.py
DELETED
@@ -1,199 +0,0 @@
|
|
1
|
-
# -*-coding:utf-8-*-
|
2
|
-
"""
|
3
|
-
测试包的导入功能
|
4
|
-
"""
|
5
|
-
import unittest
|
6
|
-
|
7
|
-
|
8
|
-
class TestPackageImports(unittest.TestCase):
|
9
|
-
"""包导入测试类"""
|
10
|
-
|
11
|
-
def test_main_package_import(self):
|
12
|
-
"""测试主包导入"""
|
13
|
-
try:
|
14
|
-
import jit_utils
|
15
|
-
self.assertTrue(hasattr(jit_utils, '__version__'))
|
16
|
-
self.assertTrue(hasattr(jit_utils, '__author__'))
|
17
|
-
self.assertEqual(jit_utils.__version__, '0.0.1')
|
18
|
-
self.assertEqual(jit_utils.__author__, 'zangtao')
|
19
|
-
except ImportError as e:
|
20
|
-
self.fail(f"主包导入失败: {e}")
|
21
|
-
|
22
|
-
def test_string_functions_import(self):
|
23
|
-
"""测试字符串函数导入"""
|
24
|
-
try:
|
25
|
-
from jit_utils import randomString, getUuidStr, md5Str
|
26
|
-
|
27
|
-
# 测试函数是否可调用
|
28
|
-
self.assertTrue(callable(randomString))
|
29
|
-
self.assertTrue(callable(getUuidStr))
|
30
|
-
self.assertTrue(callable(md5Str))
|
31
|
-
|
32
|
-
# 简单功能测试
|
33
|
-
random_str = randomString(6)
|
34
|
-
self.assertEqual(len(random_str), 6)
|
35
|
-
|
36
|
-
uuid_str = getUuidStr()
|
37
|
-
self.assertEqual(len(uuid_str), 32)
|
38
|
-
|
39
|
-
md5_hash = md5Str("test")
|
40
|
-
self.assertEqual(len(md5_hash), 32)
|
41
|
-
|
42
|
-
except ImportError as e:
|
43
|
-
self.fail(f"字符串函数导入失败: {e}")
|
44
|
-
|
45
|
-
def test_qrcode_barcode_import(self):
|
46
|
-
"""测试二维码和条形码类导入"""
|
47
|
-
try:
|
48
|
-
from jit_utils import Qrcode, Barcode
|
49
|
-
|
50
|
-
# 如果因为依赖问题导入为 None,跳过测试
|
51
|
-
if Qrcode is None or Barcode is None:
|
52
|
-
self.skipTest("二维码/条形码类因依赖问题不可用")
|
53
|
-
|
54
|
-
# 测试类是否可实例化
|
55
|
-
self.assertTrue(callable(Qrcode))
|
56
|
-
self.assertTrue(callable(Barcode))
|
57
|
-
|
58
|
-
# 创建实例
|
59
|
-
qr = Qrcode("test")
|
60
|
-
bc = Barcode("123456789")
|
61
|
-
|
62
|
-
self.assertEqual(qr.value, "test")
|
63
|
-
self.assertEqual(bc.value, "123456789")
|
64
|
-
|
65
|
-
except ImportError as e:
|
66
|
-
self.skipTest(f"二维码/条形码类导入失败(可能缺少依赖): {e}")
|
67
|
-
|
68
|
-
def test_module_imports(self):
|
69
|
-
"""测试模块级导入"""
|
70
|
-
try:
|
71
|
-
from jit_utils import string_utils
|
72
|
-
self.assertTrue(hasattr(string_utils, 'randomString'))
|
73
|
-
self.assertTrue(hasattr(string_utils, 'md5Str'))
|
74
|
-
except ImportError as e:
|
75
|
-
self.fail(f"string_utils 模块导入失败: {e}")
|
76
|
-
|
77
|
-
# 时间模块可能有依赖问题
|
78
|
-
try:
|
79
|
-
from jit_utils import time_utils
|
80
|
-
# 如果导入成功,测试一些基本属性
|
81
|
-
self.assertTrue(hasattr(time_utils, 'getTimestamp'))
|
82
|
-
except ImportError as e:
|
83
|
-
self.skipTest(f"time_utils 模块导入失败(可能缺少依赖): {e}")
|
84
|
-
|
85
|
-
def test_network_module_import(self):
|
86
|
-
"""测试网络模块导入"""
|
87
|
-
try:
|
88
|
-
from jit_utils import network
|
89
|
-
# 网络模块应该可以导入
|
90
|
-
self.assertIsNotNone(network)
|
91
|
-
except ImportError as e:
|
92
|
-
self.skipTest(f"network 模块导入失败: {e}")
|
93
|
-
|
94
|
-
def test_signature_module_import(self):
|
95
|
-
"""测试签名模块导入"""
|
96
|
-
try:
|
97
|
-
from jit_utils import signature
|
98
|
-
self.assertIsNotNone(signature)
|
99
|
-
except ImportError as e:
|
100
|
-
self.skipTest(f"signature 模块导入失败: {e}")
|
101
|
-
|
102
|
-
def test_validator_import(self):
|
103
|
-
"""测试验证器导入"""
|
104
|
-
try:
|
105
|
-
from jit_utils import ParamsValidator
|
106
|
-
if ParamsValidator is None:
|
107
|
-
self.skipTest("ParamsValidator 因依赖问题不可用")
|
108
|
-
self.assertTrue(callable(ParamsValidator))
|
109
|
-
except ImportError as e:
|
110
|
-
self.skipTest(f"ParamsValidator 导入失败(可能缺少依赖): {e}")
|
111
|
-
|
112
|
-
def test_exceptions_module_import(self):
|
113
|
-
"""测试异常模块导入"""
|
114
|
-
try:
|
115
|
-
from jit_utils import exceptions
|
116
|
-
self.assertIsNotNone(exceptions)
|
117
|
-
except ImportError as e:
|
118
|
-
self.skipTest(f"exceptions 模块导入失败(可能缺少依赖): {e}")
|
119
|
-
|
120
|
-
def test_config_module_import(self):
|
121
|
-
"""测试配置模块导入"""
|
122
|
-
try:
|
123
|
-
from jit_utils import config
|
124
|
-
self.assertIsNotNone(config)
|
125
|
-
except ImportError as e:
|
126
|
-
self.skipTest(f"config 模块导入失败(可能缺少依赖): {e}")
|
127
|
-
|
128
|
-
def test_workday_constants_import(self):
|
129
|
-
"""测试工作日常量导入"""
|
130
|
-
try:
|
131
|
-
from jit_utils import workday_constants
|
132
|
-
self.assertIsNotNone(workday_constants)
|
133
|
-
# 检查是否有工作日相关的常量
|
134
|
-
self.assertTrue(hasattr(workday_constants, 'holidayDict') or
|
135
|
-
hasattr(workday_constants, 'workdayDict'))
|
136
|
-
except ImportError as e:
|
137
|
-
self.skipTest(f"workday_constants 模块导入失败: {e}")
|
138
|
-
|
139
|
-
def test_decorator_import(self):
|
140
|
-
"""测试装饰器导入"""
|
141
|
-
try:
|
142
|
-
from jit_utils import forward
|
143
|
-
self.assertTrue(callable(forward))
|
144
|
-
except ImportError as e:
|
145
|
-
self.skipTest(f"forward 装饰器导入失败(可能缺少依赖): {e}")
|
146
|
-
|
147
|
-
def test_convert_classes_import(self):
|
148
|
-
"""测试转换器类导入"""
|
149
|
-
try:
|
150
|
-
from jit_utils import Converter, MemoryCompiler
|
151
|
-
if Converter is None or MemoryCompiler is None:
|
152
|
-
self.skipTest("转换器类因依赖问题不可用")
|
153
|
-
self.assertTrue(callable(Converter))
|
154
|
-
self.assertTrue(callable(MemoryCompiler))
|
155
|
-
except ImportError as e:
|
156
|
-
self.skipTest(f"转换器类导入失败(可能缺少依赖): {e}")
|
157
|
-
|
158
|
-
def test_all_exports(self):
|
159
|
-
"""测试 __all__ 导出列表"""
|
160
|
-
import jit_utils
|
161
|
-
|
162
|
-
# 检查 __all__ 是否存在
|
163
|
-
self.assertTrue(hasattr(jit_utils, '__all__'))
|
164
|
-
all_exports = jit_utils.__all__
|
165
|
-
self.assertIsInstance(all_exports, list)
|
166
|
-
self.assertGreater(len(all_exports), 0)
|
167
|
-
|
168
|
-
# 检查一些关键导出
|
169
|
-
expected_exports = [
|
170
|
-
'__version__', '__author__', 'randomString', 'md5Str',
|
171
|
-
'getUuidStr'
|
172
|
-
]
|
173
|
-
|
174
|
-
for export in expected_exports:
|
175
|
-
if export in all_exports:
|
176
|
-
self.assertTrue(hasattr(jit_utils, export), f"包中缺少导出: {export}")
|
177
|
-
|
178
|
-
# 检查可能为 None 的导出(因为依赖问题)
|
179
|
-
optional_exports = ['Qrcode', 'Barcode', 'ParamsValidator', 'Converter', 'MemoryCompiler']
|
180
|
-
for export in optional_exports:
|
181
|
-
if export in all_exports:
|
182
|
-
# 这些可能因为依赖问题为 None,只要存在就行
|
183
|
-
self.assertTrue(hasattr(jit_utils, export), f"包中缺少可选导出: {export}")
|
184
|
-
|
185
|
-
def test_star_import(self):
|
186
|
-
"""测试 from jit_utils import * 是否正常工作"""
|
187
|
-
# 由于 * 导入会污染命名空间,我们在这里只测试是否会出错
|
188
|
-
try:
|
189
|
-
exec("from jit_utils import *")
|
190
|
-
# 如果执行到这里说明没有导入错误
|
191
|
-
self.assertTrue(True)
|
192
|
-
except ImportError as e:
|
193
|
-
self.skipTest(f"星号导入失败(可能缺少依赖): {e}")
|
194
|
-
except Exception as e:
|
195
|
-
self.fail(f"星号导入出现意外错误: {e}")
|
196
|
-
|
197
|
-
|
198
|
-
if __name__ == '__main__':
|
199
|
-
unittest.main()
|
tests/test_qrcode_barcode.py
DELETED
@@ -1,182 +0,0 @@
|
|
1
|
-
# -*-coding:utf-8-*-
|
2
|
-
"""
|
3
|
-
测试二维码和条形码模块
|
4
|
-
"""
|
5
|
-
import unittest
|
6
|
-
import base64
|
7
|
-
import re
|
8
|
-
|
9
|
-
|
10
|
-
class TestQrcodeBarcode(unittest.TestCase):
|
11
|
-
"""二维码和条形码测试类"""
|
12
|
-
|
13
|
-
def setUp(self):
|
14
|
-
"""测试设置"""
|
15
|
-
try:
|
16
|
-
from jit_utils.qrcode import Qrcode
|
17
|
-
from jit_utils.barcode import Barcode
|
18
|
-
self.qrcode_available = True
|
19
|
-
self.barcode_available = True
|
20
|
-
self.Qrcode = Qrcode
|
21
|
-
self.Barcode = Barcode
|
22
|
-
except ImportError as e:
|
23
|
-
self.qrcode_available = False
|
24
|
-
self.barcode_available = False
|
25
|
-
self.import_error = str(e)
|
26
|
-
|
27
|
-
def test_qrcode_creation(self):
|
28
|
-
"""测试二维码创建"""
|
29
|
-
if not self.qrcode_available:
|
30
|
-
self.skipTest(f"二维码模块导入失败: {self.import_error}")
|
31
|
-
|
32
|
-
# 创建二维码
|
33
|
-
qr = self.Qrcode("Hello World")
|
34
|
-
self.assertEqual(qr.value, "Hello World")
|
35
|
-
self.assertEqual(qr.row, 200) # 默认行数
|
36
|
-
self.assertEqual(qr.col, 200) # 默认列数
|
37
|
-
|
38
|
-
# 自定义尺寸
|
39
|
-
qr_custom = self.Qrcode("Test", row=300, col=300)
|
40
|
-
self.assertEqual(qr_custom.row, 300)
|
41
|
-
self.assertEqual(qr_custom.col, 300)
|
42
|
-
|
43
|
-
def test_qrcode_toByte(self):
|
44
|
-
"""测试二维码转字节"""
|
45
|
-
if not self.qrcode_available:
|
46
|
-
self.skipTest(f"二维码模块导入失败: {self.import_error}")
|
47
|
-
|
48
|
-
qr = self.Qrcode("Hello World")
|
49
|
-
try:
|
50
|
-
byte_data = qr.toByte()
|
51
|
-
self.assertIsInstance(byte_data, bytes)
|
52
|
-
self.assertGreater(len(byte_data), 0)
|
53
|
-
except Exception as e:
|
54
|
-
self.skipTest(f"二维码生成失败: {str(e)}")
|
55
|
-
|
56
|
-
def test_qrcode_toStr(self):
|
57
|
-
"""测试二维码转base64字符串"""
|
58
|
-
if not self.qrcode_available:
|
59
|
-
self.skipTest(f"二维码模块导入失败: {self.import_error}")
|
60
|
-
|
61
|
-
# 测试正常值
|
62
|
-
qr = self.Qrcode("Hello World")
|
63
|
-
try:
|
64
|
-
str_data = qr.toStr()
|
65
|
-
self.assertIsInstance(str_data, str)
|
66
|
-
self.assertTrue(str_data.startswith("<image:"))
|
67
|
-
self.assertTrue(str_data.endswith(">"))
|
68
|
-
|
69
|
-
# 提取base64部分
|
70
|
-
base64_part = str_data[7:-1] # 去掉 "<image:" 和 ">"
|
71
|
-
# 验证是否为有效的base64
|
72
|
-
base64.b64decode(base64_part) # 如果无效会抛出异常
|
73
|
-
except Exception as e:
|
74
|
-
self.skipTest(f"二维码字符串生成失败: {str(e)}")
|
75
|
-
|
76
|
-
# 测试空值
|
77
|
-
qr_empty = self.Qrcode("")
|
78
|
-
result = qr_empty.toStr()
|
79
|
-
self.assertEqual(result, "")
|
80
|
-
|
81
|
-
def test_qrcode_str_method(self):
|
82
|
-
"""测试二维码__str__方法"""
|
83
|
-
if not self.qrcode_available:
|
84
|
-
self.skipTest(f"二维码模块导入失败: {self.import_error}")
|
85
|
-
|
86
|
-
qr = self.Qrcode("Test")
|
87
|
-
try:
|
88
|
-
str_result = str(qr)
|
89
|
-
expected = qr.toStr()
|
90
|
-
self.assertEqual(str_result, expected)
|
91
|
-
except Exception as e:
|
92
|
-
self.skipTest(f"二维码__str__方法失败: {str(e)}")
|
93
|
-
|
94
|
-
def test_barcode_creation(self):
|
95
|
-
"""测试条形码创建"""
|
96
|
-
if not self.barcode_available:
|
97
|
-
self.skipTest(f"条形码模块导入失败: {self.import_error}")
|
98
|
-
|
99
|
-
# 创建条形码
|
100
|
-
bc = self.Barcode("123456789")
|
101
|
-
self.assertEqual(bc.value, "123456789")
|
102
|
-
self.assertEqual(bc.codeType, "code128") # 默认类型
|
103
|
-
|
104
|
-
# 自定义类型
|
105
|
-
bc_custom = self.Barcode("123456789", "code39")
|
106
|
-
self.assertEqual(bc_custom.codeType, "code39")
|
107
|
-
|
108
|
-
def test_barcode_toByte(self):
|
109
|
-
"""测试条形码转字节"""
|
110
|
-
if not self.barcode_available:
|
111
|
-
self.skipTest(f"条形码模块导入失败: {self.import_error}")
|
112
|
-
|
113
|
-
bc = self.Barcode("123456789")
|
114
|
-
try:
|
115
|
-
byte_data = bc.toByte()
|
116
|
-
self.assertIsInstance(byte_data, bytes)
|
117
|
-
self.assertGreater(len(byte_data), 0)
|
118
|
-
except Exception as e:
|
119
|
-
self.skipTest(f"条形码生成失败: {str(e)}")
|
120
|
-
|
121
|
-
def test_barcode_toStr(self):
|
122
|
-
"""测试条形码转base64字符串"""
|
123
|
-
if not self.barcode_available:
|
124
|
-
self.skipTest(f"条形码模块导入失败: {self.import_error}")
|
125
|
-
|
126
|
-
# 测试正常值
|
127
|
-
bc = self.Barcode("123456789")
|
128
|
-
try:
|
129
|
-
str_data = bc.toStr()
|
130
|
-
self.assertIsInstance(str_data, str)
|
131
|
-
|
132
|
-
# 如果成功,应该是base64格式
|
133
|
-
if not str_data.startswith("ERROR:"):
|
134
|
-
self.assertTrue(str_data.startswith("<image:"))
|
135
|
-
self.assertTrue(str_data.endswith(">"))
|
136
|
-
|
137
|
-
# 提取base64部分
|
138
|
-
base64_part = str_data[7:-1] # 去掉 "<image:" 和 ">"
|
139
|
-
# 验证是否为有效的base64
|
140
|
-
base64.b64decode(base64_part)
|
141
|
-
except Exception as e:
|
142
|
-
self.skipTest(f"条形码字符串生成失败: {str(e)}")
|
143
|
-
|
144
|
-
# 测试空值
|
145
|
-
bc_empty = self.Barcode("")
|
146
|
-
result = bc_empty.toStr()
|
147
|
-
self.assertEqual(result, "")
|
148
|
-
|
149
|
-
def test_barcode_invalid_data(self):
|
150
|
-
"""测试条形码无效数据处理"""
|
151
|
-
if not self.barcode_available:
|
152
|
-
self.skipTest(f"条形码模块导入失败: {self.import_error}")
|
153
|
-
|
154
|
-
# 测试可能导致错误的数据
|
155
|
-
bc = self.Barcode("invalid_barcode_data!@#$%^&*()")
|
156
|
-
try:
|
157
|
-
result = bc.toStr()
|
158
|
-
# 如果出错,应该返回ERROR:开头的字符串
|
159
|
-
if result.startswith("ERROR:"):
|
160
|
-
self.assertIn("ERROR:", result)
|
161
|
-
else:
|
162
|
-
# 如果没出错,应该是正常的base64格式
|
163
|
-
self.assertTrue(result.startswith("<image:"))
|
164
|
-
except Exception as e:
|
165
|
-
self.skipTest(f"条形码错误处理测试失败: {str(e)}")
|
166
|
-
|
167
|
-
def test_barcode_str_method(self):
|
168
|
-
"""测试条形码__str__方法"""
|
169
|
-
if not self.barcode_available:
|
170
|
-
self.skipTest(f"条形码模块导入失败: {self.import_error}")
|
171
|
-
|
172
|
-
bc = self.Barcode("123456789")
|
173
|
-
try:
|
174
|
-
str_result = str(bc)
|
175
|
-
expected = bc.toStr()
|
176
|
-
self.assertEqual(str_result, expected)
|
177
|
-
except Exception as e:
|
178
|
-
self.skipTest(f"条形码__str__方法失败: {str(e)}")
|
179
|
-
|
180
|
-
|
181
|
-
if __name__ == '__main__':
|
182
|
-
unittest.main()
|
tests/test_string_utils.py
DELETED
@@ -1,174 +0,0 @@
|
|
1
|
-
# -*-coding:utf-8-*-
|
2
|
-
"""
|
3
|
-
测试字符串工具模块
|
4
|
-
"""
|
5
|
-
import unittest
|
6
|
-
import re
|
7
|
-
import os
|
8
|
-
import tempfile
|
9
|
-
from jit_utils.string import (
|
10
|
-
randomString, randomNum, getUuidStr, md5Bytes, md5Str,
|
11
|
-
lowercase, capitalize, getFileMd5, getRandomField, getRandom,
|
12
|
-
genrSublist, renderTemplateString
|
13
|
-
)
|
14
|
-
|
15
|
-
|
16
|
-
class TestStringUtils(unittest.TestCase):
|
17
|
-
"""字符串工具测试类"""
|
18
|
-
|
19
|
-
def test_randomString(self):
|
20
|
-
"""测试随机字符串生成"""
|
21
|
-
# 测试默认长度
|
22
|
-
result = randomString()
|
23
|
-
self.assertEqual(len(result), 8)
|
24
|
-
self.assertTrue(result.isalnum())
|
25
|
-
|
26
|
-
# 测试自定义长度
|
27
|
-
result = randomString(12)
|
28
|
-
self.assertEqual(len(result), 12)
|
29
|
-
self.assertTrue(result.isalnum())
|
30
|
-
|
31
|
-
# 测试两次生成的结果不同(概率很高)
|
32
|
-
result1 = randomString(20)
|
33
|
-
result2 = randomString(20)
|
34
|
-
self.assertNotEqual(result1, result2)
|
35
|
-
|
36
|
-
def test_randomNum(self):
|
37
|
-
"""测试随机数字生成"""
|
38
|
-
# 测试默认6位数字
|
39
|
-
result = randomNum()
|
40
|
-
self.assertEqual(len(result), 6)
|
41
|
-
self.assertTrue(result.isdigit())
|
42
|
-
|
43
|
-
# 测试自定义位数
|
44
|
-
result = randomNum(4)
|
45
|
-
self.assertEqual(len(result), 4)
|
46
|
-
self.assertTrue(result.isdigit())
|
47
|
-
|
48
|
-
# 测试两次生成的结果不同(概率很高)
|
49
|
-
result1 = randomNum(8)
|
50
|
-
result2 = randomNum(8)
|
51
|
-
self.assertNotEqual(result1, result2)
|
52
|
-
|
53
|
-
def test_getUuidStr(self):
|
54
|
-
"""测试UUID字符串生成"""
|
55
|
-
result = getUuidStr()
|
56
|
-
# UUID去掉连字符后应该是32位十六进制字符串
|
57
|
-
self.assertEqual(len(result), 32)
|
58
|
-
self.assertTrue(re.match(r'^[a-f0-9]{32}$', result))
|
59
|
-
|
60
|
-
# 测试两次生成的UUID不同
|
61
|
-
result1 = getUuidStr()
|
62
|
-
result2 = getUuidStr()
|
63
|
-
self.assertNotEqual(result1, result2)
|
64
|
-
|
65
|
-
def test_md5Bytes(self):
|
66
|
-
"""测试字节数据MD5加密"""
|
67
|
-
test_data = b"hello world"
|
68
|
-
result = md5Bytes(test_data)
|
69
|
-
expected = "5eb63bbbe01eeed093cb22bb8f5acdc3"
|
70
|
-
self.assertEqual(result, expected)
|
71
|
-
|
72
|
-
# 测试空字节
|
73
|
-
result = md5Bytes(b"")
|
74
|
-
expected = "d41d8cd98f00b204e9800998ecf8427e"
|
75
|
-
self.assertEqual(result, expected)
|
76
|
-
|
77
|
-
def test_md5Str(self):
|
78
|
-
"""测试字符串MD5加密"""
|
79
|
-
test_str = "hello world"
|
80
|
-
result = md5Str(test_str)
|
81
|
-
expected = "5eb63bbbe01eeed093cb22bb8f5acdc3"
|
82
|
-
self.assertEqual(result, expected)
|
83
|
-
|
84
|
-
# 测试不同编码
|
85
|
-
result = md5Str("你好", "utf-8")
|
86
|
-
self.assertEqual(len(result), 32)
|
87
|
-
self.assertTrue(re.match(r'^[a-f0-9]{32}$', result))
|
88
|
-
|
89
|
-
def test_lowercase(self):
|
90
|
-
"""测试首字母小写"""
|
91
|
-
self.assertEqual(lowercase("Hello"), "hello")
|
92
|
-
self.assertEqual(lowercase("WORLD"), "wORLD")
|
93
|
-
self.assertEqual(lowercase("a"), "a")
|
94
|
-
self.assertEqual(lowercase(""), "")
|
95
|
-
|
96
|
-
def test_capitalize(self):
|
97
|
-
"""测试首字母大写"""
|
98
|
-
self.assertEqual(capitalize("hello"), "Hello")
|
99
|
-
self.assertEqual(capitalize("world"), "World")
|
100
|
-
self.assertEqual(capitalize("A"), "A")
|
101
|
-
self.assertEqual(capitalize(""), "")
|
102
|
-
|
103
|
-
def test_getFileMd5(self):
|
104
|
-
"""测试文件MD5计算"""
|
105
|
-
# 创建临时文件
|
106
|
-
with tempfile.NamedTemporaryFile(mode='w', delete=False) as f:
|
107
|
-
f.write("hello world")
|
108
|
-
temp_file = f.name
|
109
|
-
|
110
|
-
try:
|
111
|
-
result = getFileMd5(temp_file)
|
112
|
-
expected = "5eb63bbbe01eeed093cb22bb8f5acdc3"
|
113
|
-
self.assertEqual(result, expected)
|
114
|
-
finally:
|
115
|
-
os.unlink(temp_file)
|
116
|
-
|
117
|
-
# 测试不存在的文件
|
118
|
-
result = getFileMd5("non_existent_file.txt")
|
119
|
-
self.assertIsNone(result)
|
120
|
-
|
121
|
-
def test_getRandomField(self):
|
122
|
-
"""测试随机字段名生成"""
|
123
|
-
result = getRandomField()
|
124
|
-
self.assertTrue(result.startswith("fk"))
|
125
|
-
self.assertEqual(len(result), 6) # "fk" + 4个字符
|
126
|
-
|
127
|
-
result = getRandomField(6)
|
128
|
-
self.assertTrue(result.startswith("fk"))
|
129
|
-
self.assertEqual(len(result), 8) # "fk" + 6个字符
|
130
|
-
|
131
|
-
def test_getRandom(self):
|
132
|
-
"""测试随机字符串生成(小写字母+数字)"""
|
133
|
-
result = getRandom()
|
134
|
-
self.assertEqual(len(result), 8)
|
135
|
-
self.assertTrue(re.match(r'^[a-z0-9]+$', result))
|
136
|
-
|
137
|
-
result = getRandom(12)
|
138
|
-
self.assertEqual(len(result), 12)
|
139
|
-
self.assertTrue(re.match(r'^[a-z0-9]+$', result))
|
140
|
-
|
141
|
-
def test_genrSublist(self):
|
142
|
-
"""测试列表分割"""
|
143
|
-
test_list = list(range(10))
|
144
|
-
result = list(genrSublist(test_list, 3))
|
145
|
-
|
146
|
-
expected = [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9]]
|
147
|
-
self.assertEqual(result, expected)
|
148
|
-
|
149
|
-
# 测试整除的情况
|
150
|
-
test_list = list(range(9))
|
151
|
-
result = list(genrSublist(test_list, 3))
|
152
|
-
expected = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
|
153
|
-
self.assertEqual(result, expected)
|
154
|
-
|
155
|
-
def test_renderTemplateString(self):
|
156
|
-
"""测试模板字符串渲染"""
|
157
|
-
template = "Hello {{name}}, you are {{age}} years old"
|
158
|
-
result = renderTemplateString(template, name="Alice", age=25)
|
159
|
-
expected = "Hello Alice, you are 25 years old"
|
160
|
-
self.assertEqual(result, expected)
|
161
|
-
|
162
|
-
# 测试缺失变量
|
163
|
-
result = renderTemplateString("Hello {{name}}", age=25)
|
164
|
-
expected = "Hello "
|
165
|
-
self.assertEqual(result, expected)
|
166
|
-
|
167
|
-
# 测试无变量
|
168
|
-
result = renderTemplateString("Hello World")
|
169
|
-
expected = "Hello World"
|
170
|
-
self.assertEqual(result, expected)
|
171
|
-
|
172
|
-
|
173
|
-
if __name__ == '__main__':
|
174
|
-
unittest.main()
|
tests/test_time_utils.py
DELETED
@@ -1,185 +0,0 @@
|
|
1
|
-
# -*-coding:utf-8-*-
|
2
|
-
"""
|
3
|
-
测试时间工具模块
|
4
|
-
"""
|
5
|
-
import unittest
|
6
|
-
import datetime
|
7
|
-
import time
|
8
|
-
from unittest.mock import patch
|
9
|
-
|
10
|
-
|
11
|
-
class TestTimeUtils(unittest.TestCase):
|
12
|
-
"""时间工具测试类"""
|
13
|
-
|
14
|
-
def setUp(self):
|
15
|
-
"""测试设置"""
|
16
|
-
# 由于时间模块可能有导包问题,我们使用try-except来导入
|
17
|
-
try:
|
18
|
-
from jit_utils.time import (
|
19
|
-
getTimestamp, timeStampToDateTime, strToTimestamp,
|
20
|
-
formatNow, datetime2string, string2datetime,
|
21
|
-
timestamp2date, timestamp2string, cmpTsSameDay
|
22
|
-
)
|
23
|
-
self.time_module_available = True
|
24
|
-
self.getTimestamp = getTimestamp
|
25
|
-
self.timeStampToDateTime = timeStampToDateTime
|
26
|
-
self.strToTimestamp = strToTimestamp
|
27
|
-
self.formatNow = formatNow
|
28
|
-
self.datetime2string = datetime2string
|
29
|
-
self.string2datetime = string2datetime
|
30
|
-
self.timestamp2date = timestamp2date
|
31
|
-
self.timestamp2string = timestamp2string
|
32
|
-
self.cmpTsSameDay = cmpTsSameDay
|
33
|
-
except ImportError as e:
|
34
|
-
self.time_module_available = False
|
35
|
-
self.import_error = str(e)
|
36
|
-
|
37
|
-
def test_getTimestamp(self):
|
38
|
-
"""测试获取时间戳"""
|
39
|
-
if not self.time_module_available:
|
40
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
41
|
-
|
42
|
-
timestamp = self.getTimestamp()
|
43
|
-
self.assertIsInstance(timestamp, int)
|
44
|
-
# 时间戳应该是13位数字(毫秒级)
|
45
|
-
self.assertGreater(timestamp, 1000000000000)
|
46
|
-
self.assertLess(timestamp, 9999999999999)
|
47
|
-
|
48
|
-
def test_timeStampToDateTime(self):
|
49
|
-
"""测试时间戳转datetime"""
|
50
|
-
if not self.time_module_available:
|
51
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
52
|
-
|
53
|
-
try:
|
54
|
-
# 测试秒级时间戳
|
55
|
-
timestamp_sec = 1640995200 # 2022-01-01 00:00:00
|
56
|
-
result = self.timeStampToDateTime(timestamp_sec)
|
57
|
-
self.assertIsInstance(result, datetime.datetime)
|
58
|
-
self.assertEqual(result.year, 2022)
|
59
|
-
self.assertEqual(result.month, 1)
|
60
|
-
self.assertEqual(result.day, 1)
|
61
|
-
|
62
|
-
# 测试毫秒级时间戳
|
63
|
-
timestamp_ms = 1640995200000
|
64
|
-
result = self.timeStampToDateTime(timestamp_ms)
|
65
|
-
self.assertIsInstance(result, datetime.datetime)
|
66
|
-
self.assertEqual(result.year, 2022)
|
67
|
-
except Exception as e:
|
68
|
-
self.skipTest(f"时间戳转换函数出错: {str(e)}")
|
69
|
-
|
70
|
-
def test_formatNow(self):
|
71
|
-
"""测试格式化当前时间"""
|
72
|
-
if not self.time_module_available:
|
73
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
74
|
-
|
75
|
-
# 测试默认格式
|
76
|
-
result = self.formatNow()
|
77
|
-
self.assertIsInstance(result, str)
|
78
|
-
# 应该匹配 YYYY-MM-DD 格式
|
79
|
-
import re
|
80
|
-
self.assertTrue(re.match(r'^\d{4}-\d{2}-\d{2}$', result))
|
81
|
-
|
82
|
-
# 测试自定义格式
|
83
|
-
result = self.formatNow("%Y%m%d")
|
84
|
-
self.assertTrue(re.match(r'^\d{8}$', result))
|
85
|
-
|
86
|
-
def test_datetime2string(self):
|
87
|
-
"""测试datetime转字符串"""
|
88
|
-
if not self.time_module_available:
|
89
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
90
|
-
|
91
|
-
# 测试正常的datetime对象
|
92
|
-
dt = datetime.datetime(2022, 1, 1, 12, 30, 45)
|
93
|
-
result = self.datetime2string(dt)
|
94
|
-
expected = "2022-01-01"
|
95
|
-
self.assertEqual(result, expected)
|
96
|
-
|
97
|
-
# 测试自定义格式
|
98
|
-
result = self.datetime2string(dt, "%Y-%m-%d %H:%M:%S")
|
99
|
-
expected = "2022-01-01 12:30:45"
|
100
|
-
self.assertEqual(result, expected)
|
101
|
-
|
102
|
-
# 测试非datetime对象
|
103
|
-
result = self.datetime2string("not_datetime")
|
104
|
-
self.assertEqual(result, "")
|
105
|
-
|
106
|
-
def test_string2datetime(self):
|
107
|
-
"""测试字符串转datetime"""
|
108
|
-
if not self.time_module_available:
|
109
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
110
|
-
|
111
|
-
# 测试默认格式
|
112
|
-
date_str = "2022-01-01"
|
113
|
-
result = self.string2datetime(date_str)
|
114
|
-
self.assertIsInstance(result, datetime.datetime)
|
115
|
-
self.assertEqual(result.year, 2022)
|
116
|
-
self.assertEqual(result.month, 1)
|
117
|
-
self.assertEqual(result.day, 1)
|
118
|
-
|
119
|
-
# 测试自定义格式
|
120
|
-
date_str = "01/01/2022"
|
121
|
-
result = self.string2datetime(date_str, "%m/%d/%Y")
|
122
|
-
self.assertIsInstance(result, datetime.datetime)
|
123
|
-
self.assertEqual(result.year, 2022)
|
124
|
-
|
125
|
-
def test_timestamp2date(self):
|
126
|
-
"""测试时间戳转日期字符串"""
|
127
|
-
if not self.time_module_available:
|
128
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
129
|
-
|
130
|
-
timestamp = 1640995200 # 2022-01-01 00:00:00
|
131
|
-
result = self.timestamp2date(timestamp)
|
132
|
-
self.assertEqual(result, "2022-01-01")
|
133
|
-
|
134
|
-
def test_timestamp2string(self):
|
135
|
-
"""测试时间戳转格式化字符串"""
|
136
|
-
if not self.time_module_available:
|
137
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
138
|
-
|
139
|
-
timestamp = 1640995200000 # 毫秒级时间戳
|
140
|
-
result = self.timestamp2string(timestamp)
|
141
|
-
self.assertIsInstance(result, str)
|
142
|
-
# 应该包含日期和时间
|
143
|
-
self.assertIn("2022-01-01", result)
|
144
|
-
|
145
|
-
# 测试自定义格式
|
146
|
-
result = self.timestamp2string(timestamp, "%Y%m%d")
|
147
|
-
self.assertEqual(result, "20220101")
|
148
|
-
|
149
|
-
def test_cmpTsSameDay(self):
|
150
|
-
"""测试比较两个时间戳是否同一天"""
|
151
|
-
if not self.time_module_available:
|
152
|
-
self.skipTest(f"时间模块导入失败: {self.import_error}")
|
153
|
-
|
154
|
-
# 同一天的不同时间
|
155
|
-
ts1 = 1640995200000 # 2022-01-01 00:00:00
|
156
|
-
ts2 = 1641038400000 # 2022-01-01 12:00:00
|
157
|
-
result = self.cmpTsSameDay(ts1, ts2)
|
158
|
-
self.assertTrue(result)
|
159
|
-
|
160
|
-
# 不同天
|
161
|
-
ts3 = 1641081600000 # 2022-01-02 00:00:00
|
162
|
-
result = self.cmpTsSameDay(ts1, ts3)
|
163
|
-
self.assertFalse(result)
|
164
|
-
|
165
|
-
def test_basic_time_functions(self):
|
166
|
-
"""测试基本时间函数(不依赖外部导入)"""
|
167
|
-
# 这些测试直接使用Python标准库,不依赖可能有问题的导入
|
168
|
-
|
169
|
-
# 测试当前时间戳
|
170
|
-
now_ts = int(time.time() * 1000)
|
171
|
-
self.assertIsInstance(now_ts, int)
|
172
|
-
self.assertGreater(now_ts, 1000000000000)
|
173
|
-
|
174
|
-
# 测试datetime操作
|
175
|
-
now_dt = datetime.datetime.now()
|
176
|
-
formatted = now_dt.strftime("%Y-%m-%d")
|
177
|
-
self.assertIsInstance(formatted, str)
|
178
|
-
|
179
|
-
# 测试日期计算
|
180
|
-
tomorrow = now_dt + datetime.timedelta(days=1)
|
181
|
-
self.assertGreater(tomorrow, now_dt)
|
182
|
-
|
183
|
-
|
184
|
-
if __name__ == '__main__':
|
185
|
-
unittest.main()
|
File without changes
|