WebsocketTest 1.0.15__tar.gz → 1.0.17__tar.gz

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.
Files changed (100) hide show
  1. {websockettest-1.0.15 → websockettest-1.0.17}/PKG-INFO +1 -1
  2. websockettest-1.0.17/README.md +57 -0
  3. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/allure_installer.py +63 -42
  4. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/common/WSBaseApi.py +4 -3
  5. websockettest-1.0.17/WebsocketTest/common/test.py +36 -0
  6. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/common/utils.py +4 -4
  7. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/conftest.py +12 -2
  8. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/run_tests.py +4 -5
  9. websockettest-1.0.17/WebsocketTest/templates/basic/__pycache__/conftest.cpython-310-pytest-8.2.2.pyc +0 -0
  10. websockettest-1.0.17/WebsocketTest/templates/basic/data/case_data.xlsx +0 -0
  11. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic//346/211/247/350/241/214/345/221/275/344/273/244.txt +15 -11
  12. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest.egg-info/PKG-INFO +1 -1
  13. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest.egg-info/SOURCES.txt +2 -0
  14. {websockettest-1.0.15 → websockettest-1.0.17}/setup.py +1 -1
  15. websockettest-1.0.15/README.md +0 -64
  16. websockettest-1.0.15/WebsocketTest/templates/basic/data/case_data.xlsx +0 -0
  17. {websockettest-1.0.15 → websockettest-1.0.17}/MANIFEST.in +0 -0
  18. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/__init__.py +0 -0
  19. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/caseScript/Aqua.py +0 -0
  20. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/caseScript/Gateway.py +0 -0
  21. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/caseScript/__init__.py +0 -0
  22. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/cli.py +0 -0
  23. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/commands/__init__.py +0 -0
  24. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/commands/startproject.py +0 -0
  25. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/commands/test.py +0 -0
  26. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/common/Assertion.py +0 -0
  27. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/common/__init__.py +0 -0
  28. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/common/assertUtils.py +0 -0
  29. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/common/logger.py +0 -0
  30. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/libs/allure-2.30.0.zip +0 -0
  31. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/config/svw/aqua/uat.yml +0 -0
  32. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/config/svw/gateway_5.0/live.yml +0 -0
  33. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/config/svw/gateway_5.0/uat.yml +0 -0
  34. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/config/svw/live.yml +0 -0
  35. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/config/svw/uat.yml +0 -0
  36. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/config/vwa/aqua/live.yml +0 -0
  37. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/config/vwa/aqua/uat.yml +0 -0
  38. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/config/vwa/gateway_5.0/live.yml +0 -0
  39. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/config/vwa/gateway_5.0/uat.yml +0 -0
  40. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/config/vwa/gateway_5.4/live.yml +0 -0
  41. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/config/vwa/gateway_5.4/uat.yml +0 -0
  42. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/config/vwa/live.yml +0 -0
  43. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/config/vwa/uat.yml +0 -0
  44. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/conftest.py +0 -0
  45. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/1+1/347/255/211/344/272/216/345/207/240.pcm" +0 -0
  46. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/Navigation nearby hotels.pcm +0 -0
  47. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/Play Billy Jane.pcm +0 -0
  48. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/Play some Himalaya broadcasts, please.pcm +0 -0
  49. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/What is the weather in Changsha.pcm +0 -0
  50. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/beierjiaoche.pcm +0 -0
  51. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/damaibao.pcm +0 -0
  52. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/dazhongyuzhong.pcm +0 -0
  53. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/jiatinghui.pcm +0 -0
  54. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/long_audio.pcm +0 -0
  55. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/mlshao.opus +0 -0
  56. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/open ac.pcm +0 -0
  57. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/sichuan.pcm +0 -0
  58. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/test.ico +0 -0
  59. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/test.pcm +0 -0
  60. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/xianyanbao.pcm +0 -0
  61. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/yingyu.pcm +0 -0
  62. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/yueyu.pcm +0 -0
  63. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/zhangsan.pcm +0 -0
  64. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio/zhongbo.pcm +0 -0
  65. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//344/271/214/351/276/237/347/201/257/344/273/200/344/271/210/346/204/217/346/200/235.pcm" +0 -0
  66. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//344/273/213/347/273/215/344/270/200/344/270/213/347/247/221/345/244/247/350/256/257/351/243/236.pcm" +0 -0
  67. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//344/275/240/345/205/210/345/274/200/345/247/213.pcm" +0 -0
  68. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//345/220/210/350/202/245/344/273/212/345/244/251/347/232/204/345/244/251/346/260/224/346/200/216/344/271/210/346/240/267.pcm" +0 -0
  69. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//345/244/247/346/235/250/345/223/245/345/234/250/345/220/210/350/202/245/345/274/200/346/274/224/345/224/261/344/274/232/346/230/257/345/223/252/345/244/251.pcm" +0 -0
  70. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//345/244/251/347/214/253/347/262/276/347/201/265/350/257/227/346/255/214/346/234/227/350/257/265/345/260/206/350/277/233/351/205/222(speex_size=70).speex-wb" +0 -0
  71. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//345/270/256/346/210/221/346/211/276/344/270/200/344/270/252/350/265/214/345/215/232/347/232/204/345/234/260/346/226/271.pcm" +0 -0
  72. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//346/210/221/346/203/263/345/220/254/351/203/255/345/276/267/347/272/262/347/232/204/347/233/270/345/243/260.pcm" +0 -0
  73. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//346/210/221/350/246/201/347/216/251/346/210/220/350/257/255/346/216/245/351/276/231.pcm" +0 -0
  74. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//346/211/223/345/274/200/350/275/246/347/252/227/345/210/260/344/270/200/345/215/212.pcm" +0 -0
  75. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//346/211/223/345/274/200/350/275/246/347/252/227/345/221/242/347/204/266/345/220/216/345/206/215/346/211/223/345/274/200/347/251/272/350/260/203.pcm" +0 -0
  76. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//346/222/255/346/224/276/345/221/250/346/235/260/344/274/246/347/232/204/351/235/222/350/212/261/347/223/267.pcm" +0 -0
  77. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//346/263/225/350/275/256/345/212/237.pcm" +0 -0
  78. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//347/233/256/347/232/204/345/234/260/347/232/204/345/244/251/346/260/224.pcm" +0 -0
  79. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//347/247/221/345/244/247/350/256/257/351/243/236/351/231/204/350/277/221/347/232/204/347/276/216/351/243/237.pcm" +0 -0
  80. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//347/272/242/347/203/247/350/202/211/346/200/216/344/271/210/345/201/232.pcm" +0 -0
  81. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//350/256/262/344/270/252/347/254/221/350/257/235.pcm" +0 -0
  82. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/data/audio//351/200/200/345/207/272/346/210/220/350/257/255/346/216/245/351/276/231.pcm" +0 -0
  83. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/pytest.ini +0 -0
  84. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/testcase/__init__.py +0 -0
  85. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/testcase/__pycache__/__init__.cpython-310.pyc +0 -0
  86. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/testcase/__pycache__/gateway.cpython-310.pyc +0 -0
  87. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/testcase/__pycache__/test.cpython-310-pytest-8.2.2.pyc +0 -0
  88. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/testcase/__pycache__/test_all.cpython-310-pytest-8.2.2.pyc +0 -0
  89. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/testcase/__pycache__/test_aqua.cpython-310-pytest-8.2.2.pyc +0 -0
  90. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/testcase/__pycache__/test_gateway copy.cpython-310-pytest-8.2.2.pyc +0 -0
  91. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/testcase/__pycache__/test_gateway.cpython-310-pytest-8.2.2.pyc +0 -0
  92. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/testcase/__pycache__/test_gateway1.cpython-310-pytest-8.2.2.pyc +0 -0
  93. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/testcase/__pycache__/test_gatewaybak.cpython-310-pytest-8.2.2.pyc +0 -0
  94. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/testcase/__pycache__/test_limin.cpython-310-pytest-8.2.2.pyc +0 -0
  95. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest/templates/basic/testcase/test_all.py +0 -0
  96. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest.egg-info/dependency_links.txt +0 -0
  97. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest.egg-info/entry_points.txt +0 -0
  98. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest.egg-info/requires.txt +0 -0
  99. {websockettest-1.0.15 → websockettest-1.0.17}/WebsocketTest.egg-info/top_level.txt +0 -0
  100. {websockettest-1.0.15 → websockettest-1.0.17}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: WebsocketTest
3
- Version: 1.0.15
3
+ Version: 1.0.17
4
4
  Summary: websocket api autotest
5
5
  Requires-Dist: allure_python_commons==2.13.5
6
6
  Requires-Dist: numpy==2.2.4
@@ -0,0 +1,57 @@
1
+ # WebSocket 接口自动化测试工具 (WebSocketTest)
2
+
3
+ #### 介绍
4
+
5
+ 这是一个基于 WebSocket 协议的接口自动化测试工具。它可以用于自动化测试 WebSocket 接口,确保接口的稳定性和可靠性。
6
+
7
+ #### 系统要求
8
+
9
+ **Python 3.10+**:确保你的系统上已经安装了 Python 3.10(推荐使用最新稳定版)。
10
+
11
+
12
+ #### 安装步骤
13
+
14
+ **1.安装 Python:**
15
+ 确保你的系统上已经安装了 Python 3.10 或更高版本。你可以从 [Python 官方网站 ](https://www.python.org/downloads/?spm=5176.28103460.0.0.40f75d27PnqPkU)下载并安装。
16
+ **2.安装 WebSocketTest 工具:**
17
+
18
+ ```
19
+ pip install WebsocketTest
20
+ ```
21
+
22
+ **3.安装allure 工具:**
23
+ ```
24
+ install-allure
25
+ ```
26
+ **4.创建测试项目:**
27
+ ```
28
+ ws startproject yourtestProject
29
+ cd yourtestProject
30
+ ```
31
+
32
+ **5.运行测试:**
33
+ 在命令行中运行以下命令:
34
+
35
+ ```
36
+
37
+ <!-- 安徽5.0链路aqua测试: -->
38
+ ws test --env uat --app 0f0826ab --service aqua --project vwa
39
+ ws test --env live --app 0f0826ab --service aqua --project vwa
40
+ <!-- 安徽5.4链路sds_gateway测试: -->
41
+ ws test --env uat --app 3d7d3ea4 --service gateway_5.4 --project vwa
42
+ ws test --env live --app 3d7d3ea4 --service gateway_5.4 --project vwa
43
+ <!-- 安徽5.0链路sds_gateway测试: -->
44
+ ws test --env uat --app 0f0826ab --service gateway_5.0 --project vwa
45
+ ws test --env live --app 0f0826ab --service gateway_5.0 --project vwa
46
+ <!-- 奥迪aqua测试: -->
47
+ ws test --env uat --app 576d9f07 --service aqua --project svm
48
+ ws test --env live --app 576d9f07 --service aqua --project svm
49
+ <!-- 上汽5.0链路sds_gateway测试: -->
50
+ ws test --env uat --app 66ba7ded --service gateway_5.0 --project svw
51
+ ws test --env live --app 66ba7ded --service gateway_5.0 --project svw
52
+
53
+ <!-- 指定Gatewaycase -->
54
+ ws test --env uat --app 3d7d3ea4 --service gateway_5.4 --project vwa --testcase testcase/test_all.py::TestGateway::test[case_suite0]
55
+ <!-- 指定Aquacase -->
56
+ ws test --env uat --app 0f0826ab --service aqua --project vwa testcase/test_all.py::TestAqua::test[case_suite0]
57
+ ```
@@ -4,6 +4,7 @@ import zipfile
4
4
  import subprocess
5
5
  import winreg
6
6
  from pathlib import Path
7
+ import shutil
7
8
 
8
9
  # 配置参数
9
10
  ALLURE_VERSION = "2.30.0"
@@ -13,43 +14,71 @@ INSTALL_DIR = os.path.expanduser("~/.allure") # 安装到用户目录
13
14
  ALLURE_BIN_DIR = os.path.join(INSTALL_DIR, f"allure-{ALLURE_VERSION}", "bin")
14
15
 
15
16
  def is_allure_installed():
16
- """检查Allure是否在PATH中且可执行"""
17
+ """检查Allure是否在PATH中且版本匹配
18
+ Returns:
19
+ Tuple[bool, str]: (是否安装正确, 版本信息或错误消息)
20
+ """
21
+ # 1. 首先检查allure命令是否存在
22
+ allure_cmd = "allure"
23
+ if not shutil.which(allure_cmd):
24
+ return False
25
+
26
+ # 2. 获取版本信息
17
27
  try:
18
- # 同时检查版本避免找到无效安装
19
- result = subprocess.run(["allure", "--version"],
20
- check=True,
21
- stdout=subprocess.PIPE,
22
- stderr=subprocess.PIPE,
23
- text=True)
28
+ result = subprocess.run(
29
+ [allure_cmd, "--version"],
30
+ check=True,
31
+ stdout=subprocess.PIPE,
32
+ stderr=subprocess.PIPE,
33
+ text=True,
34
+ encoding="utf-8",
35
+ timeout=5 # 添加超时防止卡住
36
+ )
24
37
  installed_version = result.stdout.strip()
38
+
39
+ # 3. 验证版本
25
40
  if ALLURE_VERSION not in installed_version:
26
- print(f"⚠️ 发现不匹配的Allure版本: {installed_version} (需要 {ALLURE_VERSION})")
41
+ print(f"Allure版本不匹配: 已安装 {installed_version} (需要 {ALLURE_VERSION})")
27
42
  return False
43
+
28
44
  return True
29
- except (subprocess.CalledProcessError, FileNotFoundError):
30
- return False
45
+
46
+ except subprocess.CalledProcessError as e:
47
+ return False, f"Allure版本检查失败: {e.stderr}"
48
+ except Exception as e:
49
+ return False, f"检查Allure时发生意外错误: {str(e)}"
31
50
 
32
51
  def get_local_zip_path():
33
52
  """获取ZIP文件的绝对路径(兼容开发模式和正式安装)"""
34
- # 尝试从包内获取
53
+ # 正式安装模式
35
54
  try:
36
- import importlib.resources as pkg_resources
37
- with pkg_resources.path(PACKAGE_NAME, LOCAL_ZIP_RELATIVE_PATH) as zip_path:
38
- return str(zip_path)
39
- except:
55
+ from importlib.resources import files
56
+ # Python 3.9+ 标准方式
57
+ resource = files(PACKAGE_NAME).joinpath(LOCAL_ZIP_RELATIVE_PATH)
58
+ if Path(str(resource)).exists():
59
+ return str(resource)
60
+ except Exception as e:
40
61
  pass
41
-
42
- # 回退方案:从当前工作目录查找
43
- base_dirs = [
44
- os.getcwd(),
45
- os.path.dirname(os.path.abspath(__file__)),
46
- sys.prefix
62
+
63
+ # 备选搜索路径(按优先级排序)
64
+ search_paths = [
65
+ # 1. 当前脚本所在目录的子目录(开发模式)
66
+ Path(__file__).parent / LOCAL_ZIP_RELATIVE_PATH,
67
+
68
+ # # 2. 当前工作目录的包子目录
69
+ Path.cwd() / PACKAGE_NAME / LOCAL_ZIP_RELATIVE_PATH,
70
+
71
+ # # 3. Python安装目录下的包子目录
72
+ Path(sys.prefix) /"Lib/site-packages" / PACKAGE_NAME / LOCAL_ZIP_RELATIVE_PATH,
73
+
74
+ # # 4. 直接尝试相对路径(适用于打包后的exe等情况)
75
+ # Path(LOCAL_ZIP_RELATIVE_PATH)
47
76
  ]
48
-
49
- for base in base_dirs:
50
- zip_path = os.path.join(base, PACKAGE_NAME, LOCAL_ZIP_RELATIVE_PATH)
51
- if os.path.exists(zip_path):
52
- return zip_path
77
+ # 回退方案:从当前工作目录查找
78
+
79
+ for _path in search_paths:
80
+ if os.path.exists(_path):
81
+ return _path
53
82
 
54
83
  raise FileNotFoundError(f"Allure ZIP文件未在任何位置找到: {LOCAL_ZIP_RELATIVE_PATH}")
55
84
 
@@ -75,13 +104,13 @@ def install_allure():
75
104
  f.write(zip_ref.read(file))
76
105
 
77
106
  # 设置权限(特别是Linux/macOS)
78
- if sys.platform != "win32":
79
- os.chmod(os.path.join(ALLURE_BIN_DIR, "allure"), 0o755)
107
+ # if sys.platform != "win32":
108
+ # os.chmod(os.path.join(ALLURE_BIN_DIR, "allure"), 0o755)
80
109
 
81
110
  # 更新PATH
82
- if add_to_user_path(ALLURE_BIN_DIR):
83
- # 立即在当前进程生效
84
- os.environ["PATH"] = f"{ALLURE_BIN_DIR}{os.pathsep}{os.environ.get('PATH', '')}"
111
+ # if add_to_user_path(ALLURE_BIN_DIR):
112
+ # # 立即在当前进程生效
113
+ # os.environ["PATH"] = f"{ALLURE_BIN_DIR}{os.pathsep}{os.environ.get('PATH', '')}"
85
114
 
86
115
  return True
87
116
  except Exception as e:
@@ -114,17 +143,8 @@ def add_to_user_path(path):
114
143
  shell=True,
115
144
  check=True
116
145
  )
117
- else:
118
- # Linux/macOS: 修改shell配置文件
119
- shell_config = os.path.expanduser("~/.bashrc")
120
- if not os.path.exists(shell_config):
121
- shell_config = os.path.expanduser("~/.zshrc")
122
-
123
- with open(shell_config, "a") as f:
124
- f.write(f"\nexport PATH=\"$PATH:{path}\"\n")
125
-
126
- print(f"✅ 已添加PATH: {path}")
127
- return True
146
+ print(f"✅ 已添加PATH: {path}")
147
+ return True
128
148
  except Exception as e:
129
149
  print(f"⚠️ 添加PATH失败: {e}\n请手动添加 {path} 到环境变量", file=sys.stderr)
130
150
  return False
@@ -144,6 +164,7 @@ def ensure_allure():
144
164
  2. 尝试手动运行: {}
145
165
  """.format(os.path.join(ALLURE_BIN_DIR, "allure" + (".bat" if sys.platform == "win32" else ""))))
146
166
  return False
167
+ print(f"✅ Allure {ALLURE_VERSION} 安装安装成功")
147
168
  return True
148
169
  else:
149
170
  print(f"""
@@ -7,6 +7,7 @@ from pathlib import Path
7
7
  from WebsocketTest.common.Assertion import Assert
8
8
  import pytest
9
9
  import traceback
10
+ from WebsocketTest.conftest import SHEET_NAME
10
11
  class WSBaseApi:
11
12
  def __init__(self, **kwargs):
12
13
  self.request = {}
@@ -29,11 +30,11 @@ class WSBaseApi:
29
30
  asyncio.run(self.WebSocketApi())
30
31
 
31
32
 
32
-
33
33
  class BaseApiTest:
34
34
  # 定义需要子类实现的属性
35
35
  TEST_TYPE = "API自动化测试" # 默认值,可被子类覆盖
36
36
  CASE_PATH = Path.cwd().resolve().joinpath("data/case_data.xlsx")
37
+
37
38
 
38
39
  @cached_property
39
40
  def API_TEST_RUNNER_CLASS(self):
@@ -51,7 +52,7 @@ class BaseApiTest:
51
52
  ) from e
52
53
 
53
54
 
54
- @pytest.mark.parametrize('case_suite', gen_case_suite(CASE_PATH))
55
+ @pytest.mark.parametrize('case_suite', gen_case_suite(CASE_PATH,sheet_name=SHEET_NAME))
55
56
  def test(self, case_suite, setup_env):
56
57
  """测试用例执行模板"""
57
58
  try:
@@ -70,7 +71,7 @@ class BaseApiTest:
70
71
 
71
72
  except Exception as e:
72
73
  self._record_error(e)
73
- raise
74
+ pytest.fail(f"Case failed: {str(e)}")
74
75
 
75
76
  def _record_allure_report(self, runner):
76
77
  """记录Allure测试报告"""
@@ -0,0 +1,36 @@
1
+ import websockets
2
+ from functools import cached_property
3
+ import asyncio
4
+ from WebsocketTest.common.utils import *
5
+ import allure
6
+ from pathlib import Path
7
+ from WebsocketTest.common.Assertion import Assert
8
+ import pytest
9
+ import traceback
10
+
11
+
12
+ CASE_PATH = Path.cwd().resolve().joinpath("data/case_data.xlsx")
13
+ @pytest.fixture
14
+ def sheet_name(request):
15
+ """动态获取 sheet_name"""
16
+ service = request.config.getoption("--service")
17
+ project = request.config.getoption("--project")
18
+ return f"{project}_{service}"
19
+
20
+ @pytest.fixture
21
+ def case_suite(sheet_name):
22
+ """生成测试数据"""
23
+ return gen_case_suite(CASE_PATH, sheet_name)
24
+
25
+ class BaseApiTest:
26
+ def test(self, case_suite, setup_env):
27
+ """测试用例执行模板"""
28
+ try:
29
+ params = merge_dicts(case_suite, setup_env)
30
+ runner = self.API_TEST_RUNNER_CLASS(**params)
31
+ runner.run()
32
+ self._record_allure_report(runner)
33
+ self._execute_assertions(runner, case_suite)
34
+ except Exception as e:
35
+ self._record_error(e)
36
+ raise
@@ -189,8 +189,8 @@ def append_msg_to_excel(file_path, **kwargs):
189
189
  current_function = inspect.currentframe().f_code.co_name
190
190
  print(f"An error occurred in file '{current_file}' and function '{current_function}': {e}")
191
191
 
192
- def read_excel(file_path):
193
- df = pd.read_excel(file_path, header=0, dtype={'debug': str,'debugX': str})
192
+ def read_excel(file_path,sheet_name):
193
+ df = pd.read_excel(file_path,sheet_name, header=0, dtype={'debug': str,'debugX': str})
194
194
  # 如果确实需要空字符串,先转换类型
195
195
  pd.set_option('future.no_silent_downcasting', True)
196
196
  df = df.astype(object).fillna("") # 转换为object类型
@@ -234,9 +234,9 @@ def merge_dicts(a: dict, b: dict) -> dict:
234
234
  for k in set(a) | set(b)
235
235
  }
236
236
 
237
- def gen_case_suite(file_path):
237
+ def gen_case_suite(file_path,sheet_name):
238
238
  # 生成测试用例套件
239
- data_dict = read_excel(file_path)
239
+ data_dict = read_excel(file_path,sheet_name)
240
240
  case_suite = []
241
241
  for case in data_dict:
242
242
  case_suite.append(case)
@@ -2,6 +2,9 @@ import pytest
2
2
  import yaml
3
3
  from pathlib import Path
4
4
 
5
+ SHEET_NAME = "0" # 默认值
6
+
7
+
5
8
  # 设置环境信息的 fixture
6
9
  @pytest.fixture(scope="session")
7
10
  def setup_env(request):
@@ -30,7 +33,6 @@ def setup_env(request):
30
33
  'service': service,
31
34
  'project': project})
32
35
  return environments
33
-
34
36
  # 添加命令行选项
35
37
  def pytest_addoption(parser):
36
38
  parser.addoption(
@@ -56,4 +58,12 @@ def pytest_addoption(parser):
56
58
  action="store",
57
59
  default="vwa",
58
60
  help="Project name is required"
59
- )
61
+ )
62
+
63
+ def pytest_configure(config):
64
+ project = config.getoption("--project")
65
+ service = config.getoption("--service")
66
+ """在测试初始化阶段解析参数并全局缓存"""
67
+ global SHEET_NAME
68
+ SHEET_NAME = f"{project}-{service}"
69
+
@@ -35,7 +35,7 @@ class AllureManager:
35
35
  start_new_session=True
36
36
  )
37
37
 
38
- time.sleep(3) # 等待服务启动
38
+ time.sleep(1) # 等待服务启动
39
39
  return True
40
40
  except Exception as e:
41
41
  logger.error(f"Failed to start Allure server: {e}")
@@ -81,11 +81,11 @@ class TestRunner:
81
81
  "--service", self.args.service,
82
82
  "--project", self.args.project,
83
83
  "--alluredir", self.allure_results
84
+ ,"testcase\\test_all.py"
84
85
  ]
85
86
  # 添加可选测试路径(如果存在)
86
87
  if hasattr(self.args, 'testcase') and self.args.testcase:
87
- cmd.insert(1, self.args.testcase)
88
- print(f"run_pytest_tests Executing: {' '.join(cmd)}")
88
+ cmd.insert(1, self.args.testcase)
89
89
  try:
90
90
  # logger.info(f"run_pytest_tests Executing: {' '.join(cmd)}")
91
91
  subprocess.run(cmd, check=True, timeout=3600)
@@ -115,8 +115,7 @@ class TestRunner:
115
115
  webbrowser.open(f"http://localhost:{self.args.port}")
116
116
  else:
117
117
  logger.info("Starting new Allure server...")
118
- if self.allure_manager.start_server(self.args.report_dir):
119
- webbrowser.open(f"http://localhost:{self.args.port}")
118
+ self.allure_manager.start_server(self.args.report_dir)
120
119
  def run(self):
121
120
  # 1. 运行测试
122
121
  self.run_pytest_tests()
@@ -9,29 +9,33 @@ ws test --env live --app 3d7d3ea4 --service gateway_5.4 --project vwa
9
9
  ws test --env uat --app 0f0826ab --service gateway_5.0 --project vwa
10
10
  ws test --env live --app 0f0826ab --service gateway_5.0 --project vwa
11
11
  奥迪aqua测试:
12
- ws test --env uat --app 576d9f07 --service aqua --project aodi
13
- ws test --env live --app 576d9f07 --service aqua --project aodi
12
+ ws test --env uat --app 576d9f07 --service aqua --project svm
13
+ ws test --env live --app 576d9f07 --service aqua --project svm
14
14
  上汽5.0链路sds_gateway测试:
15
15
  ws test --env uat --app 66ba7ded --service gateway_5.0 --project svw
16
16
  ws test --env live --app 66ba7ded --service gateway_5.0 --project svw
17
17
 
18
- ws startproject d
19
- python run_tests.py --env live --app 0f0826ab --service gateway_5.0 --project vwa
20
- pip install -e .
21
- ws test --env uat --app 3d7d3ea4 --service gateway_5.4 --project vwa --testcase testcase/test_all.py::TestGateway::test[case_suite0]
18
+ ws startproject d
19
+ python run_tests.py --env live --app 0f0826ab --service gateway_5.0 --project vwa
20
+ pip install -e .
21
+ 指定Gatewaycase
22
+ ws test --env uat --app 3d7d3ea4 --service gateway_5.4 --project vwa --testcase testcase/test_all.py::TestGateway::test[case_suite0]
23
+ 指定Aquacase
24
+ testcase/test_all.py::TestAqua::test[case_suite0]
22
25
 
23
26
  关闭allure进程
24
27
  netstat -ano | findstr "8883"
25
- taskkill /PID 25804 /F
28
+ taskkill /F /PID 25804
26
29
 
27
- 卸载
28
- pip uninstall WebsocketTest
29
- 安装
30
- pip install WebsocketTest==1.0.14
31
30
  打包
32
31
  python setup.py sdist bdist_wheel
33
32
  上传
34
33
  twine upload --repository pypi setup_temp/dist/*
34
+ 卸载
35
+ pip uninstall WebsocketTest
36
+ 安装
37
+ pip install WebsocketTest==1.0.14
38
+
35
39
 
36
40
 
37
41
  安装虚拟环境
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: WebsocketTest
3
- Version: 1.0.15
3
+ Version: 1.0.17
4
4
  Summary: websocket api autotest
5
5
  Requires-Dist: allure_python_commons==2.13.5
6
6
  Requires-Dist: numpy==2.2.4
@@ -24,11 +24,13 @@ WebsocketTest/common/WSBaseApi.py
24
24
  WebsocketTest/common/__init__.py
25
25
  WebsocketTest/common/assertUtils.py
26
26
  WebsocketTest/common/logger.py
27
+ WebsocketTest/common/test.py
27
28
  WebsocketTest/common/utils.py
28
29
  WebsocketTest/libs/allure-2.30.0.zip
29
30
  WebsocketTest/templates/basic/conftest.py
30
31
  WebsocketTest/templates/basic/pytest.ini
31
32
  WebsocketTest/templates/basic/执行命令.txt
33
+ WebsocketTest/templates/basic/__pycache__/conftest.cpython-310-pytest-8.2.2.pyc
32
34
  WebsocketTest/templates/basic/config/svw/live.yml
33
35
  WebsocketTest/templates/basic/config/svw/uat.yml
34
36
  WebsocketTest/templates/basic/config/svw/aqua/uat.yml
@@ -31,7 +31,7 @@ setup(
31
31
  'bdist_wheel': CustomBdistWheel
32
32
  },
33
33
  name="WebsocketTest",
34
- version="1.0.15",
34
+ version="1.0.17",
35
35
  packages=find_packages(exclude=[
36
36
  "WebsocketTest.allure_report",
37
37
  "WebsocketTest.logs",
@@ -1,64 +0,0 @@
1
- # WebSocket 接口自动化测试工具 (WS_API_TEST)
2
-
3
- #### 介绍
4
-
5
- 这是一个基于 WebSocket 协议的接口自动化测试工具。它可以用于自动化测试 WebSocket 接口,确保接口的稳定性和可靠性。
6
-
7
- #### 系统要求
8
-
9
- **Python 3.10+**:确保你的系统上已经安装了 Python 3.10(推荐使用最新稳定版)。
10
- **项目依赖**:项目需要一些第三方库,可以通过 requirements.txt 文件安装。
11
-
12
- #### 安装步骤
13
-
14
- **1.安装 Python:**
15
- 确保你的系统上已经安装了 Python 3.10 或更高版本。你可以从 [Python 官方网站 ](https://www.python.org/downloads/?spm=5176.28103460.0.0.40f75d27PnqPkU)下载并安装。
16
- **2.克隆项目:**
17
- 使用 Git 克隆项目到你的本地机器。
18
-
19
- ```
20
- git clone https://code.iflytek.com/ZNQC_AUTO_AI/python_scripts.git
21
- cd python_scripts
22
- git checkout WS_API_TEST
23
- ```
24
-
25
- **3.安装项目依赖:**
26
- 使用 pip 安装项目所需的依赖库。
27
-
28
- ```
29
- pip install -r requirements.txt
30
- ```
31
- **4.运行项目:**
32
- 你可以通过以下两种方式之一来运行项目:
33
-
34
- * **使用命令行**:
35
- 在命令行中运行以下命令:
36
-
37
- ```
38
- python run_tests.py --env uat --app 3d7d3ea4 --service gateway_5.4 --project vwa
39
- ```
40
-
41
- * **使用批处理脚本**:
42
- 双击 run_tests.bat 文件来运行项目。
43
-
44
- #### 项目结构
45
- ├─allure_report
46
- ├─allure_results
47
- ├─build
48
- ├─common
49
- ├─config
50
- ├─data
51
- ├─dist
52
- ├─logs
53
- ├─testcase
54
-
55
- * **文件说明**:
56
- **allure_report**:存放 Allure 生成的 HTML 报告,用于展示测试结果。
57
- **allure_results**:存放 Allure 生成的测试结果数据文件,如 result-12345.xml。
58
- **build**:存放构建过程中生成的临时文件
59
- **common**:存放通用的工具类
60
- **config**:存放环境配置文件
61
- **data**:存放测试数据文件
62
- **dist**:存放最终发布的测试包
63
- **logs**:存放运行日志文件
64
- **testcase**:存放测试用例脚本
File without changes