提交 a11c5347 authored 作者: 陈泽健's avatar 陈泽健

MQTT相关模块目前调整了Mqtt_Send.py文件中封装的方法优化,增加异常处理。处理了登录成功断言失败的问题。

上级 77ec55c5
...@@ -3,5 +3,5 @@ ...@@ -3,5 +3,5 @@
<component name="Black"> <component name="Black">
<option name="sdkName" value="Python 3.10 (ubains-module-test)" /> <option name="sdkName" value="Python 3.10 (ubains-module-test)" />
</component> </component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (ubains-module-test)" project-jdk-type="Python SDK" /> <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10" project-jdk-type="Python SDK" />
</project> </project>
\ No newline at end of file
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" /> <excludeFolder url="file://$MODULE_DIR$/.venv" />
</content> </content>
<orderEntry type="jdk" jdkName="Python 3.10 (ubains-module-test)" jdkType="Python SDK" /> <orderEntry type="jdk" jdkName="Python 3.10" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
<component name="PyDocumentationSettings"> <component name="PyDocumentationSettings">
......
import json import json
import logging import logging
import csv import csv
import threading
import time
from distutils.command.config import config
from time import sleep from time import sleep
from datetime import datetime from datetime import datetime
import paho.mqtt.client as mqtt import paho.mqtt.client as mqtt
from 运维集控.项目测试.国信证券.用户管理.发送设备信息_ZXB import topic
# 配置日志 # 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
...@@ -18,29 +19,42 @@ class Mqtt: ...@@ -18,29 +19,42 @@ class Mqtt:
:param broker_address: MQTT 代理地址 :param broker_address: MQTT 代理地址
:param port: MQTT 代理端口 :param port: MQTT 代理端口
""" """
self.lock = None
self.broker_address = broker_address self.broker_address = broker_address
self.port = port self.port = port
self.client = None self.client = None
self._received_message_lock = threading.Lock()
self.received_message = None
def connect(self): def connect(self):
""" """
连接到 MQTT 服务器 连接到 MQTT 服务器
""" """
self.client = mqtt.Client() try:
self.client.on_connect = self.on_connect # 设置连接回调 self.client = mqtt.Client()
self.client.on_message = self.on_message # 设置消息回调 self.client.on_connect = self.on_connect # 设置连接回调
self.client.connect(self.broker_address, self.port) # 连接到代理 self.client.on_message = self.on_message # 设置消息回调
self.client.loop_start() # 启动网络循环 self.client.connect(self.broker_address, self.port) # 连接到代理
logging.info("已连接到MQTT 服务器") self.client.loop_start() # 启动网络循环
except Exception as e:
logging.error(f"连接到MQTT服务器时发生错误: {e}")
raise
def disconnect(self): def disconnect(self):
""" """
断开与 MQTT 服务器的连接 断开与 MQTT 服务器的连接
""" """
if self.client: if self.client:
self.client.loop_stop() # 停止网络循环 try:
self.client.disconnect() # 断开连接 self.client.loop_stop() # 停止网络循环
logging.info("已断开与MQTT 服务器的连接") self.client.disconnect() # 断开连接
logging.info("已断开与MQTT 服务器的连接")
except Exception as e:
logging.error(f"断开与MQTT 服务器的连接时发生错误: {e}")
finally:
self.client = None # 确保资源被完全释放
else:
logging.warning("尝试断开连接时,客户端已不存在")
def on_connect(self, client, userdata, flags, rc): def on_connect(self, client, userdata, flags, rc):
""" """
...@@ -51,10 +65,26 @@ class Mqtt: ...@@ -51,10 +65,26 @@ class Mqtt:
:param flags: 连接标志 :param flags: 连接标志
:param rc: 返回码 :param rc: 返回码
""" """
if rc == 0: try:
logging.info("连接成功") if rc == 0:
else: logging.info("连接成功")
logging.error(f"连接失败,返回码: {rc}") else:
logging.error(f"连接失败,返回码: {rc}")
# 根据不同的返回码采取不同的措施
if rc == 1:
logging.error("错误:错误的协议版本")
elif rc == 2:
logging.error("错误:无效的客户端标识符")
elif rc == 3:
logging.error("错误:服务器不可用")
elif rc == 4:
logging.error("错误:错误的用户名或密码")
elif rc == 5:
logging.error("错误:未授权")
else:
logging.error("未知错误")
except Exception as e:
logging.exception(f"在处理连接结果时发生异常: {e}")
def on_message(self, client, userdata, msg): def on_message(self, client, userdata, msg):
""" """
...@@ -64,8 +94,15 @@ class Mqtt: ...@@ -64,8 +94,15 @@ class Mqtt:
:param userdata: 用户数据 :param userdata: 用户数据
:param msg: 消息对象 :param msg: 消息对象
""" """
logging.info(f"收到消息: {msg.topic} {msg.payload.decode()}") try:
self.received_message = msg.payload.decode() # 存储接收到的消息 payload = msg.payload.decode('utf-8', errors='replace') # 处理解码错误
logging.info(f"收到消息: {msg.topic} {payload[:50]}...") # 脱敏日志记录
except UnicodeDecodeError as e:
logging.error(f"解码错误: {e}")
payload = "无法解码的消息"
with self._received_message_lock:
self.received_message = payload # 线程安全地存储接收到的消息
def subscribe(self, topic): def subscribe(self, topic):
""" """
...@@ -73,9 +110,16 @@ class Mqtt: ...@@ -73,9 +110,16 @@ class Mqtt:
:param topic: 主题名称 :param topic: 主题名称
""" """
if self.client: if self.client is None:
logging.error("客户端未初始化,无法订阅主题")
raise ValueError("客户端未初始化,无法订阅主题")
try:
self.client.subscribe(topic) self.client.subscribe(topic)
logging.info(f"已订阅主题: {topic}") logging.info(f"已订阅主题: {topic}")
except Exception as e:
logging.error(f"订阅主题失败: {topic}, 错误信息: {str(e)}")
raise
def publish(self, topic, message): def publish(self, topic, message):
""" """
...@@ -85,11 +129,20 @@ class Mqtt: ...@@ -85,11 +129,20 @@ class Mqtt:
:param message: 消息内容 :param message: 消息内容
""" """
if self.client: if self.client:
# 将消息转换为JSON字符串 try:
if isinstance(message, dict): # 将消息转换为JSON字符串
message = json.dumps(message) if isinstance(message, dict):
self.client.publish(topic, message) message = json.dumps(message)
logging.info(f"已发布消息到主题: {topic}") except TypeError as e:
logging.error(f"消息转换失败: {e}")
return
try:
self.client.publish(topic, message)
logging.info(f"已发布消息到主题: {topic}")
except Exception as e:
logging.error(f"消息发布失败: {e}")
logging.error(f"失败的主题: {topic}, 消息: {message}")
def wait_for_message(self, topic, timeout=5): def wait_for_message(self, topic, timeout=5):
""" """
...@@ -99,13 +152,26 @@ class Mqtt: ...@@ -99,13 +152,26 @@ class Mqtt:
:param timeout: 超时时间(秒) :param timeout: 超时时间(秒)
:return: 接收到的消息或 None :return: 接收到的消息或 None
""" """
if self.client: if self.client is None:
start_time = datetime.now() logging.warning("Client is not initialized")
while (datetime.now() - start_time).total_seconds() < timeout:
if hasattr(self, 'received_message'):
return self.received_message
sleep(0.1)
return None return None
if timeout < 0:
logging.warning("Timeout cannot be negative")
return None
start_time = time.monotonic()
while (time.monotonic() - start_time) < timeout:
try:
with self.lock:
if self.received_message is not None:
return self.received_message
except Exception as e:
logging.error(f"Error accessing received_message: {e}")
try:
time.sleep(0.1)
except Exception as e:
logging.error(f"Error in sleep: {e}")
return None return None
@staticmethod @staticmethod
...@@ -121,100 +187,126 @@ class Mqtt: ...@@ -121,100 +187,126 @@ class Mqtt:
return list(reader) return list(reader)
@staticmethod @staticmethod
def build_message(config, current_time,topic): def build_message(configs, current_time, topic):
""" """
构建消息内容 构建消息内容
:param config: 配置字典 :param configs: 配置字典
:param current_time: 当前时间 :param current_time: 当前时间
:param topic: 消息主题
:return: 消息字典 :return: 消息字典
""" """
#安卓信息设备上报 if not isinstance(current_time, str) or not isinstance(topic, str):
if topic == "rebootResponseTopic": raise ValueError("current_time and topic must be strings")
return {
"method": "/system/readSystemInfo", client_id = configs.get('clientID', '')
"clientId": config['clientId'], app_token = configs.get('appToken', '')
"result": json.dumps({ company_number = configs.get('companyNumber', '')
"result": { cnum = configs.get('cnum', '')
"buildInfo": { conference_name = configs.get('conferenceName', '测试会议室')
"appToken": config['appToken'], conference_id = int(configs.get('conferenceID', 0))
"companyNumber": config['companyNumber'], mac_address = configs.get('macAddress', '')
"cnum": config['cnum'], auth_code = configs.get('authCode', '')
"conferenceName": "测试会议室", presence_state = configs.get('presence_state','')
"conferenceId": int(config['conferenceId']), kaiguan = configs.get('kaiguan', '')
"defaultQrCodeUrl": "http://192.168.5.218:8888/group1/M00/00/21/wKgFyGNBWZmADtnNAAAwrxR0X8s016.png", julishezhi = configs.get('julishezhi', '')
"aliasName": "zt", lingmindushezhi = configs.get('lingmindushezhi', '')
"serverBaseUrl": "http://192.168.5.218:8996/", wifi_mac = configs.get('wifi_mac', '')
"localBindTime": current_time, ble_mac = configs.get('ble_mac', '')
"generalField": "{\"conferencePhone\":\"\",\"chooseTimeType\":1,\"meetingTopicSwitch\":\"1\",\"meetingContentSwitch\":\"1\",\"meetingReverseTypeSwitch\":\"1\",\"seatArrangeSwitch\":\"1\",\"meetingVoteSwitch\":\"1\",\"floorPlanPath\":\"\",\"jumpToPaperless\":2,\"approvalList\":[],\"isLeaderJoin\":false,\"meetingPublishScreenSwitch\":\"1\"}" sn = configs.get('sn', '')
}, ip = configs.get('ip', '')
"faceVersion": "4.2.12021020201.1",
"wgtVersion": "0.0.81", try:
"deviceModel": "yx_rk3288", if topic == "rebootResponseTopic":
"abiList": ["armeabi-v7a", "armeabi"], message = {
"androidId": "48134e6047a19aaf", "method": "/system/readSystemInfo",
"appName": "UBAINS", "clientId": client_id,
"appPackageName": "com.ubains.local.gviewer", "result": json.dumps({
"appVersion": 78, "result": {
"appVersionName": "1.1.78", "buildInfo": {
"battery": 0, "appToken": app_token,
"bluetoothEnabled": False, "companyNumber": company_number,
"camerasCount": 1, "cnum": cnum,
"charging": True, "conferenceName": conference_name,
"density": 1, "conferenceId": conference_id,
"freeAndTotalMemory": "1176M/1997M", "defaultQrCodeUrl": "http://192.168.5.218:8888/group1/M00/00/21/wKgFyGNBWZmADtnNAAAwrxR0X8s016.png",
"internalAvailableSize": 4306395136, "aliasName": "zt",
"internalTotalSize": 4877451264, "serverBaseUrl": "http://192.168.5.218:8996/",
"ipAddress": "192.168.5.129", "localBindTime": current_time,
"macAddress": config['macAddress'], "generalField": "{\"conferencePhone\":\"\",\"chooseTimeType\":1,\"meetingTopicSwitch\":\"1\",\"meetingContentSwitch\":\"1\",\"meetingReverseTypeSwitch\":\"1\",\"seatArrangeSwitch\":\"1\",\"meetingVoteSwitch\":\"1\",\"floorPlanPath\":\"\",\"jumpToPaperless\":2,\"approvalList\":[],\"isLeaderJoin\":false,\"meetingPublishScreenSwitch\":\"1\"}"
"networkType": "NETWORK_ETHERNET", },
"processCpuUsage": "0.82%", "faceVersion": "4.2.12021020201.1",
"resolution": "1280x800", "wgtVersion": "0.0.81",
"romName": "rockchip", "deviceModel": "yx_rk3288",
"rooted": True, "abiList": ["armeabi-v7a", "armeabi"],
"sdkVersionCode": 25, "androidId": "48134e6047a19aaf",
"sdkVersionName": "7.1.2", "appName": "UBAINS",
"sysDate": "Tue Oct 22 18:24:52 GMT+08:00 2024", "appPackageName": "com.ubains.local.gviewer",
"sysDateStr": current_time, "appVersion": 78,
"sysElapsedRealtime": "342:26:11", "appVersionName": "1.1.78",
"sysLanguage": "zh", "battery": 0,
"sysSupportedSensors": ["Accelerometer sensor", "Gyroscope sensor", "bluetoothEnabled": False,
"Game Rotation Vector Sensor", "camerasCount": 1,
"Gravity Sensor"], "charging": True,
"authCode": config['authCode'], "density": 1,
"conferenceName": "测试会议室" "freeAndTotalMemory": "1176M/1997M",
"internalAvailableSize": 4306395136,
"internalTotalSize": 4877451264,
"ipAddress": "192.168.5.129",
"macAddress": mac_address,
"networkType": "NETWORK_ETHERNET",
"processCpuUsage": "0.82%",
"resolution": "1280x800",
"romName": "rockchip",
"rooted": True,
"sdkVersionCode": 25,
"sdkVersionName": "7.1.2",
"sysDate": "Tue Oct 22 18:24:52 GMT+08:00 2024",
"sysDateStr": current_time,
"sysElapsedRealtime": "342:26:11",
"sysLanguage": "zh",
"sysSupportedSensors": ["Accelerometer sensor", "Gyroscope sensor",
"Game Rotation Vector Sensor",
"Gravity Sensor"],
"authCode": auth_code,
"conferenceName": conference_name
}
})
}
return message
elif topic == "/uams/android/broadcast":
message = {
"type": "heartbeat",
"clientId": client_id,
"appId": "com.ubains.uniplatform",
"deviceId": client_id
}
return json.dumps(message)
# 毫米波雷达数据上报
elif "/properties/upload" in topic or "/properties/upload" in topic:
return json.dumps({
"properties":{
"client_id" : client_id,
"presence_state" : presence_state,
"kaiguan" : kaiguan,
"julishezhi" : julishezhi,
"lingmindushezhi" : lingmindushezhi,
"led":1,
"wifi_mac" : wifi_mac,
"ble_mac" : ble_mac,
"last_connection_time": current_time,
"current_time":"2024-08-28 17:21:36",
"device_model" : "c1_100_wifi_u",
"fw_version":"0.0.6",
"sn" : sn,
"ip" : ip
} }
}) })
}
#安卓信息心跳上报 except (ValueError, TypeError) as e:
elif topic == "/uams/android/broadcast": raise ValueError(f"Error building message: {e}")
return json.dumps({
"type":"heartbeat",
"clientId" : config['clientId'],
"appId":"com.ubains.uniplatform",
"deviceId": config['deviceId']
})
#毫米波雷达数据上报
elif "/properties/upload" in topic or "/properties/upload" in topic:
return json.dumps({
"properties":{
"client_id" : config['client_id'],
"presence_state" : config['presence_state'],
"kaiguan" : config['kaiguan'],
"julishezhi" : config['julishezhi'],
"lingmindushezhi" : config['lingmindushezhi'],
"led":1,
"wifi_mac" : config['wifi_mac'],
"ble_mac" : config['ble_mac'],
"last_connection_time": current_time,
"current_time":"2024-08-28 17:21:36",
"device_model" : "c1_100_wifi_u",
"fw_version":"0.0.6",
"sn" : config['sn'],
"ip" : config['ip']
}
})
def send_and_receive_messages(self, topic, message, num_times=1, timeout=5, interval=0.2): def send_and_receive_messages(self, topic, message, num_times=1, timeout=5, interval=0.2):
""" """
......
...@@ -21,4 +21,4 @@ ...@@ -21,4 +21,4 @@
- 优化了Mqtt_Send中封装的函数,补充异常处理以及日志优化。 - 优化了Mqtt_Send中封装的函数,补充异常处理以及日志优化。
6. 2024-11-02 6. 2024-11-02
- 将原有pytest框架代码改为hytest框架使用,优化了脚本执行效率,并对应增加异常处理。 - 将原有pytest框架代码改为hytest框架使用,优化了脚本执行效率,并对应增加异常处理。
- MQTT相关模块还未调整完。 - MQTT相关模块目前调整了Mqtt_Send.py文件中封装的方法优化,增加异常处理。处理了登录成功断言失败的问题。
\ No newline at end of file \ No newline at end of file
...@@ -35,7 +35,7 @@ XPATH_WELCOME_TEXT = '//*[@id="app"]/div/div[1]/div/span[1]' ...@@ -35,7 +35,7 @@ XPATH_WELCOME_TEXT = '//*[@id="app"]/div/div[1]/div/span[1]'
CLASS_MESSAGE_CONTENT = 'el-message__content' CLASS_MESSAGE_CONTENT = 'el-message__content'
# 消息内容的 CSS 类名 # 消息内容的 CSS 类名
DEFAULT_WAIT_TIME = 10 DEFAULT_WAIT_TIME = 20
# 默认等待时间(秒),用于元素加载或操作之间的等待 # 默认等待时间(秒),用于元素加载或操作之间的等待
...@@ -64,7 +64,7 @@ def clear_and_send_keys(wd, locator, value): ...@@ -64,7 +64,7 @@ def clear_and_send_keys(wd, locator, value):
element.send_keys(value) element.send_keys(value)
class UI_000x: class Login_000x:
ddt_cases = [ ddt_cases = [
{ {
...@@ -145,7 +145,7 @@ class UI_000x: ...@@ -145,7 +145,7 @@ class UI_000x:
# 等待1秒以允许页面响应 # 等待1秒以允许页面响应
sleep(2) sleep(2)
# 根据预期的检查文本类型,获取并记录提示信息 # 根据预期的检查文本类型,获取并记录提示信息
if check_text == "欢迎": if check_text == "欢迎 预定标准版测试":
notify_text = WebDriverWait(wd, DEFAULT_WAIT_TIME).until( notify_text = WebDriverWait(wd, DEFAULT_WAIT_TIME).until(
EC.presence_of_element_located((By.XPATH, XPATH_WELCOME_TEXT)) EC.presence_of_element_located((By.XPATH, XPATH_WELCOME_TEXT))
).text ).text
......
# from datetime import datetime import time
# import time import sys
# from hytest import * import os
# import sys from datetime import datetime
# import os from hytest import *
# # 获取当前脚本的绝对路径 # 获取当前脚本的绝对路径
# current_dir = os.path.dirname(os.path.abspath(__file__)) current_dir = os.path.dirname(os.path.abspath(__file__))
# # 构建预定系统的绝对路径 # 构建预定系统的绝对路径
# 预定系统_path = os.path.abspath(os.path.join(current_dir, '..','..','..')) 预定系统_path = os.path.abspath(os.path.join(current_dir, '..','..','..'))
# # 添加路径 # 添加路径
# sys.path.append(预定系统_path) sys.path.append(预定系统_path)
# # 导入模块 # 导入模块
# try: try:
# from 预定系统.Base.Mqtt_Send import * from 预定系统.Base.Mqtt_Send import *
# except ModuleNotFoundError as e: except ModuleNotFoundError as e:
# print(f"ModuleNotFoundError: {e}") print(f"ModuleNotFoundError: {e}")
# print("尝试使用绝对路径导入") print("尝试使用绝对路径导入")
# from 预定系统.Base.Mqtt_Send import * from 预定系统.Base.Mqtt_Send import *
#
# if __name__ == "__main__": # 获取当前脚本所在的目录
# # 读取配置文件 current_dir = os.path.dirname(os.path.abspath(__file__))
# configs = Mqtt.read_config_from_csv('../测试数据/MQTT安卓上报数据.csv')
# # 构建CSV文件的绝对路径
# broker_address = "192.168.5.218" csv_file_path = os.path.join(current_dir, '../../测试数据/MQTT安卓上报数据.csv')
# port = 1883
# # topic = "rebootResponseTopic" if __name__ == "__main__":
# num_repeats = 100 # 重复执行的次数 # 读取配置文件
# interval_between_repeats = 0.2 # 每次重复之间的间隔时间(秒) configs = Mqtt.read_config_from_csv(csv_file_path)
#
# # 创建 MQTT 客户端实例 broker_address = "192.168.5.218"
# mqtt_client = Mqtt(broker_address, port) port = 1883
# # topic = "rebootResponseTopic"
# try: num_repeats = 100 # 重复执行的次数
# # 连接到 MQTT 服务器 interval_between_repeats = 0.2 # 每次重复之间的间隔时间(秒)
# mqtt_client.connect()
# # 创建 MQTT 客户端实例
# for repeat in range(num_repeats): mqtt_client = Mqtt(broker_address, port)
# logging.info(f"开始第 {repeat + 1} 次上报")
# try:
# # 遍历配置文件中的每一行数据 # 连接到 MQTT 服务器
# for config in configs: mqtt_client.connect()
# # 构建消息内容-
# # 构建消息内容 print('连接成功')
# topic = config["topic"]
for repeat in range(num_repeats):
logging.info(f"开始第 {repeat + 1} 次上报")
# 遍历配置文件中的每一行数据
for config in configs:
# 构建消息内容-
# 构建消息内容
topic = config["topic"]
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(config)
message = Mqtt.build_message(config, current_time, topic)
# 发送消息
mqtt_client.publish(topic, message)
# 每次发送之间可以设置一个间隔时间
time.sleep(interval_between_repeats)
# 每次重复之间设置一个间隔时间
time.sleep(interval_between_repeats)
except Exception as e:
logging.error(f"发送消息时发生错误: {e}")
finally:
# 断开与 MQTT 服务器的连接
mqtt_client.disconnect()
# class Android_000x:
# with open(csv_file_path, mode='r', encoding='utf-8') as file:
# reader = csv.DictReader(file)
# ddt_cases = []
# for i, row in enumerate(reader):
# # 将CSV行转换为ddt_cases的格式
# case = {
# 'name': row['name'],
# 'para': [
# row['topic'], row['clientId'], row['appToken'], row['companyNumber'],
# row['cnum'], row['conferenceId'], row['macAddress'], row['authCode']
# ]
# }
# ddt_cases.append(case)
#
# # 打印结果
# # print(f"Total cases: {len(ddt_cases)}")
# # print(ddt_cases)
#
# def teststeps(self):
#
# broker_address = "nat.ubainsyun.com"
# port = 1883
# # topic = "rebootResponseTopic"
# num_repeats = 100 # 重复执行的次数
# interval_between_repeats = 0.2 # 每次重复之间的间隔时间(秒)
# topic, clientId, appToken, companyNumber, cnum, conferenceId, macAddress, authCode = self.para
#
# # 创建 MQTT 客户端实例
# mqtt_client = Mqtt(broker_address, port)
#
# try:
# STEP(1,"连接MQTT")
# # 连接到 MQTT 服务器
# mqtt_client.connect()
# STEP(2,"MQTT发送消息")
# for repeat in range(num_repeats):
# logging.info(f"开始第 {repeat + 1} 次上报")
# current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") # current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# message = Mqtt.build_message(config, current_time, topic) # message = Mqtt.build_message(topic, clientId, appToken, companyNumber, cnum, conferenceId, macAddress, authCode, current_time, "deviceId")
#
# print(message)
# #
# # 发送消息 # #发送消息
# mqtt_client.publish(topic, message) # mqtt_client.publish(topic, message)
# #
# # 每次发送之间可以设置一个间隔时间 # # 每次发送之间可以设置一个间隔时间
# time.sleep(interval_between_repeats) # time.sleep(interval_between_repeats)
# #
# # 每次重复之间设置一个间隔时间 # except Exception as e:
# time.sleep(interval_between_repeats) # logging.error(f"发送消息时发生错误: {e}")
#
# except Exception as e:
# logging.error(f"发送消息时发生错误: {e}")
# #
# finally: # finally:
# # 断开与 MQTT 服务器的连接 # # 断开与 MQTT 服务器的连接
# mqtt_client.disconnect() # mqtt_client.disconnect()
# from datetime import datetime from datetime import datetime
# import logging import logging
# import time import time
# import sys import sys
# import os import os
# # 获取当前脚本的绝对路径 # 获取当前脚本的绝对路径
# current_dir = os.path.dirname(os.path.abspath(__file__)) current_dir = os.path.dirname(os.path.abspath(__file__))
# # 构建预定系统的绝对路径 # 构建预定系统的绝对路径
# 预定系统_path = os.path.abspath(os.path.join(current_dir, '..','..','..')) 预定系统_path = os.path.abspath(os.path.join(current_dir, '..','..','..'))
# # 添加路径 # 添加路径
# sys.path.append(预定系统_path) sys.path.append(预定系统_path)
# # 导入模块 # 导入模块
# try: try:
# from 预定系统.Base.Mqtt_Send import * from 预定系统.Base.Mqtt_Send import *
# except ModuleNotFoundError as e: except ModuleNotFoundError as e:
# print(f"ModuleNotFoundError: {e}") print(f"ModuleNotFoundError: {e}")
# print("尝试使用绝对路径导入") print("尝试使用绝对路径导入")
# from 预定系统.Base.Mqtt_Send import * from 预定系统.Base.Mqtt_Send import *
#
# if __name__ == "__main__": # 获取当前脚本所在的目录
# # 读取配置文件 current_dir = os.path.dirname(os.path.abspath(__file__))
# configs = Mqtt.read_config_from_csv('../测试数据/MQTT毫米波上报数据.csv')
# # 构建CSV文件的绝对路径
# broker_address = "192.168.5.218" csv_file_path = os.path.join(current_dir, '../../测试数据/MQTT毫米波上报数据.csv')
# port = 1883
# num_repeats = 100 # 重复执行的次数 if __name__ == "__main__":
# interval_between_repeats = 0.2 # 每次重复之间的间隔时间(秒) # 读取配置文件
# configs = Mqtt.read_config_from_csv(csv_file_path)
# # 创建 MQTT 客户端实例-
# mqtt_client = Mqtt(broker_address, port) broker_address = "192.168.5.218"
# port = 1883
# try: num_repeats = 100 # 重复执行的次数
# # 连接到 MQTT 服务器 interval_between_repeats = 0.2 # 每次重复之间的间隔时间(秒)
# mqtt_client.connect()
# # 创建 MQTT 客户端实例-
# for repeat in range(num_repeats): mqtt_client = Mqtt(broker_address, port)
# logging.info(f"开始第 {repeat + 1} 次上报")
# try:
# # 遍历配置文件中的每一行数据 # 连接到 MQTT 服务器
# for config in configs: mqtt_client.connect()
# # 构建消息内容
# topic = config["topic"] for repeat in range(num_repeats):
# current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") logging.info(f"开始第 {repeat + 1} 次上报")
# message = Mqtt.build_message(config, current_time, topic)
# # 遍历配置文件中的每一行数据
# # 发送消息 for config in configs:
# mqtt_client.publish(topic, message) # 构建消息内容
# topic = config["topic"]
# # 每次发送之间可以设置一个间隔时间 current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# time.sleep(interval_between_repeats) message = Mqtt.build_message(config, current_time, topic)
#
# # 每次重复之间设置一个间隔时间 # 发送消息
# time.sleep(interval_between_repeats) mqtt_client.publish(topic, message)
#
# except Exception as e: # 每次发送之间可以设置一个间隔时间
# logging.error(f"发送消息时发生错误: {e}") time.sleep(interval_between_repeats)
#
# finally: # 每次重复之间设置一个间隔时间
# # 断开与 MQTT 服务器的连接 time.sleep(interval_between_repeats)
# mqtt_client.disconnect()
except Exception as e:
logging.error(f"发送消息时发生错误: {e}")
finally:
# 断开与 MQTT 服务器的连接
mqtt_client.disconnect()
...@@ -4,7 +4,7 @@ import os ...@@ -4,7 +4,7 @@ import os
# 获取当前脚本的绝对路径 # 获取当前脚本的绝对路径
current_dir = os.path.dirname(os.path.abspath(__file__)) current_dir = os.path.dirname(os.path.abspath(__file__))
# 构建预定系统的绝对路径 # 构建预定系统的绝对路径
预定系统_path = os.path.abspath(os.path.join(current_dir, '..','..','..')) 预定系统_path = os.path.abspath(os.path.join(current_dir, '..','..'))
# 添加路径 # 添加路径
sys.path.append(预定系统_path) sys.path.append(预定系统_path)
# 导入模块 # 导入模块
...@@ -14,5 +14,6 @@ except ModuleNotFoundError as e: ...@@ -14,5 +14,6 @@ except ModuleNotFoundError as e:
print(f"ModuleNotFoundError: {e}") print(f"ModuleNotFoundError: {e}")
print("尝试使用绝对路径导入") print("尝试使用绝对路径导入")
from 预定系统.Base.base import * from 预定系统.Base.base import *
def suite_setup(): def suite_setup():
admin_login() admin_login()
\ No newline at end of file
...@@ -309,31 +309,31 @@ function next_error(){ ...@@ -309,31 +309,31 @@ function next_error(){
</tr> </tr>
<tr> <tr>
<td>开始时间</td> <td>开始时间</td>
<td>2024/11/02 13:23:43</td> <td>2024/11/02 15:29:53</td>
</tr> </tr>
<tr> <tr>
<td>结束时间</td> <td>结束时间</td>
<td>2024/11/02 13:23:58</td> <td>2024/11/02 15:30:03</td>
</tr> </tr>
<tr> <tr>
<td>耗时</td> <td>耗时</td>
<td>15.019</td> <td>10.196</td>
</tr> </tr>
<tr> <tr>
<td>预备执行用例数量</td> <td>预备执行用例数量</td>
<td>10</td> <td>1</td>
</tr> </tr>
<tr> <tr>
<td>实际执用例行数量</td> <td>实际执用例行数量</td>
<td>10</td> <td>1</td>
</tr> </tr>
<tr> <tr>
<td>通过</td> <td>通过</td>
<td>4</td> <td>1</td>
</tr> </tr>
<tr> <tr>
<td>失败</td> <td>失败</td>
<td style="color:red">6</td> <td style="">0</td>
</tr> </tr>
<tr> <tr>
<td>异常</td> <td>异常</td>
...@@ -363,15 +363,15 @@ function next_error(){ ...@@ -363,15 +363,15 @@ function next_error(){
</table> </table>
<div class="result_barchart"> <div class="result_barchart">
<div class="barchar_item"> <div class="barchar_item">
<span>用例通过 40% : 4</span> <span>用例通过 100% : 1</span>
<div class="barchart_barbox"> <div class="barchart_barbox">
<div class="barchart_bar" style="width: 40.0%; background-color: #04AA6D;"></div> <div class="barchart_bar" style="width: 100.0%; background-color: #04AA6D;"></div>
</div> </div>
</div> </div>
<div class="barchar_item"> <div class="barchar_item">
<span>用例失败 60% : 6</span> <span>用例失败 0% : 0</span>
<div class="barchart_barbox"> <div class="barchart_barbox">
<div class="barchart_bar" style="width: 60.0%; background-color: #bb4069;"></div> <div class="barchart_bar" style="width: 0.0%; background-color: #bb4069;"></div>
</div> </div>
</div> </div>
<div class="barchar_item"> <div class="barchar_item">
...@@ -401,7 +401,7 @@ function next_error(){ ...@@ -401,7 +401,7 @@ function next_error(){
<div class="folder_header"> <div class="folder_header">
<span class="label">套件初始化</span> <span class="label">套件初始化</span>
<span>cases\</span> <span>cases\</span>
<span class="executetime">2024-11-02 13:23:43</span> <span class="executetime">2024-11-02 15:29:53</span>
</div> </div>
<div class="folder_body"> <div class="folder_body">
<div class="info">'----------' 正在初始化浏览器 '----------'</div> <div class="info">'----------' 正在初始化浏览器 '----------'</div>
...@@ -415,11 +415,11 @@ function next_error(){ ...@@ -415,11 +415,11 @@ function next_error(){
<span class="label">进入文件</span> <span class="label">进入文件</span>
<span>cases\登录模块\账号密码登录测试.py</span> <span>cases\登录模块\账号密码登录测试.py</span>
</div> </div>
<div class="case fail" id="case_00000001"> <div class="case pass" id="case_00000001">
<div class="folder_header"> <div class="folder_header">
<span class="label caselabel">用例 FAIL</span> <span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0001</span> <span class="casename">登录 UI_0001</span>
<span class="executetime">2024-11-02 13:23:51</span> <span class="executetime">2024-11-02 15:29:59</span>
</div> </div>
<div class="folder_body"> <div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span> <span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
...@@ -433,374 +433,17 @@ function next_error(){ ...@@ -433,374 +433,17 @@ function next_error(){
<span class="tag">步骤 #2</span> <span class="tag">步骤 #2</span>
<span>点击登录按钮</span> <span>点击登录按钮</span>
</div> </div>
<div class="info">Alert text: </div> <div class="info">Alert text: 请输入账号!</div>
<div class="case_step"> <div class="case_step">
<span class="tag">步骤 #3</span> <span class="tag">步骤 #3</span>
<span>校验提示信息: 请输入账号!</span> <span>校验提示信息: 请输入账号!</span>
</div> </div>
<div class="checkpoint_fail">
<span class="tag">检查点 FAIL</span>
<span>弹出提示</span>
</div>
<div class="info error-info">
Traceback:
File &quot;D:\GithubData\ubains-module-test\ubains-module-test\预定系统\cases\登录模块\账号密码登录测试.py&quot;, line 117, in teststeps
CHECK_POINT('弹出提示', notify_text == check_text)</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0001">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case fail" id="case_00000002">
<div class="folder_header">
<span class="label caselabel">用例 FAIL</span>
<span class="casename">登录 UI_0002</span>
<span class="executetime">2024-11-02 13:23:51</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0002">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: None, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: </div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 请输入密码!</span>
</div>
<div class="checkpoint_fail">
<span class="tag">检查点 FAIL</span>
<span>弹出提示</span>
</div>
<div class="info error-info">
Traceback:
File &quot;D:\GithubData\ubains-module-test\ubains-module-test\预定系统\cases\登录模块\账号密码登录测试.py&quot;, line 117, in teststeps
CHECK_POINT('弹出提示', notify_text == check_text)</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0002">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case fail" id="case_00000003">
<div class="folder_header">
<span class="label caselabel">用例 FAIL</span>
<span class="casename">登录 UI_0003</span>
<span class="executetime">2024-11-02 13:23:51</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0003">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: Ubains@4321, 验证码: None</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: </div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 请输入验证码!</span>
</div>
<div class="checkpoint_fail">
<span class="tag">检查点 FAIL</span>
<span>弹出提示</span>
</div>
<div class="info error-info">
Traceback:
File &quot;D:\GithubData\ubains-module-test\ubains-module-test\预定系统\cases\登录模块\账号密码登录测试.py&quot;, line 117, in teststeps
CHECK_POINT('弹出提示', notify_text == check_text)</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0003">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000004">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0004</span>
<span class="executetime">2024-11-02 13:23:52</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0004">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj112, 密码: Ubains@4321, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 账号或密码错误</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 账号或密码错误</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0004">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000005">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0005</span>
<span class="executetime">2024-11-02 13:23:52</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0005">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: adM 12in@czj, 密码: Ubains@4321, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 账号或密码错误</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 账号或密码错误</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0005">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case fail" id="case_00000006">
<div class="folder_header">
<span class="label caselabel">用例 FAIL</span>
<span class="casename">登录 UI_0006</span>
<span class="executetime">2024-11-02 13:23:53</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0006">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: 12345, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: </div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 账号或密码错误</span>
</div>
<div class="checkpoint_fail">
<span class="tag">检查点 FAIL</span>
<span>弹出提示</span>
</div>
<div class="info error-info">
Traceback:
File &quot;D:\GithubData\ubains-module-test\ubains-module-test\预定系统\cases\登录模块\账号密码登录测试.py&quot;, line 117, in teststeps
CHECK_POINT('弹出提示', notify_text == check_text)</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0006">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000007">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0007</span>
<span class="executetime">2024-11-02 13:23:54</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0007">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: U bains1s@432, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 账号或密码错误</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 账号或密码错误</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0007">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case fail" id="case_00000008">
<div class="folder_header">
<span class="label caselabel">用例 FAIL</span>
<span class="casename">登录 UI_0008</span>
<span class="executetime">2024-11-02 13:23:54</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0008">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: Ubains@4321, 验证码: 123</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: </div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 验证码错误</span>
</div>
<div class="checkpoint_fail">
<span class="tag">检查点 FAIL</span>
<span>弹出提示</span>
</div>
<div class="info error-info">
Traceback:
File &quot;D:\GithubData\ubains-module-test\ubains-module-test\预定系统\cases\登录模块\账号密码登录测试.py&quot;, line 117, in teststeps
CHECK_POINT('弹出提示', notify_text == check_text)</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0008">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case fail" id="case_00000009">
<div class="folder_header">
<span class="label caselabel">用例 FAIL</span>
<span class="casename">登录 UI_0009</span>
<span class="executetime">2024-11-02 13:23:55</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0009">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: Ubains@4321, 验证码: cs 12</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: </div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 验证码错误</span>
</div>
<div class="checkpoint_fail">
<span class="tag">检查点 FAIL</span>
<span>弹出提示</span>
</div>
<div class="info error-info">
Traceback:
File &quot;D:\GithubData\ubains-module-test\ubains-module-test\预定系统\cases\登录模块\账号密码登录测试.py&quot;, line 117, in teststeps
CHECK_POINT('弹出提示', notify_text == check_text)</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0009">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000010">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0010</span>
<span class="executetime">2024-11-02 13:23:55</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0010">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: Ubains@4321, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 欢迎</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 欢迎</span>
</div>
<div class="checkpoint_pass"> <div class="checkpoint_pass">
<span class="tag">检查点 PASS</span> <span class="tag">检查点 PASS</span>
<span>弹出提示</span> <span>弹出提示</span>
</div> </div>
</div> </div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0010"> <div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0001">
<span class="label">用例清除</span> <span class="label">用例清除</span>
<div class="case_step"> <div class="case_step">
<span class="tag">步骤 #4</span> <span class="tag">步骤 #4</span>
...@@ -813,7 +456,7 @@ Traceback: ...@@ -813,7 +456,7 @@ Traceback:
<div class="folder_header"> <div class="folder_header">
<span class="label">套件清除</span> <span class="label">套件清除</span>
<span>cases\</span> <span>cases\</span>
<span class="executetime">2024-11-02 13:23:56</span> <span class="executetime">2024-11-02 15:30:01</span>
</div> </div>
<div class="folder_body"> <div class="folder_body">
<div class="info">清除浏览器</div> <div class="info">清除浏览器</div>
...@@ -826,7 +469,7 @@ Traceback: ...@@ -826,7 +469,7 @@ Traceback:
<div class="menu-item" onclick="document.querySelector(&quot;body&quot;).scrollIntoView()">页首</div> <div class="menu-item" onclick="document.querySelector(&quot;body&quot;).scrollIntoView()">页首</div>
<div class="menu-item" onclick="window.open(&quot;http://www.byhy.net/tut/auto/hytest/01&quot;, &quot;_blank&quot;); ">帮助</div> <div class="menu-item" onclick="window.open(&quot;http://www.byhy.net/tut/auto/hytest/01&quot;, &quot;_blank&quot;); ">帮助</div>
<div class="menu-item" id="display_mode" onclick="toggle_folder_all_cases()">Summary</div> <div class="menu-item" id="display_mode" onclick="toggle_folder_all_cases()">Summary</div>
<div class="error_jumper" display="block"> <div class="error_jumper" display="none">
<div class="menu-item" onclick="previous_error()" title="上一个错误"></div> <div class="menu-item" onclick="previous_error()" title="上一个错误"></div>
<div class="menu-item" onclick="next_error()" title="下一个错误"></div> <div class="menu-item" onclick="next_error()" title="下一个错误"></div>
</div> </div>
......
<!DOCTYPE html>
<html>
<head>
<title>测试报告</title>
<meta charset="UTF-8">
<style>body {
font-family: consolas, Verdana, sans-serif;
font-size: .95em;
color: #696e71;
display: grid;
grid-template-columns: 1fr 5rem;
}
.main_section {
width: 90%;
margin: 0 auto;
}
#float_menu{
position:fixed;
top:0;
right:0;
text-align: center;
}
#float_menu .menu-item {
cursor: pointer;
padding: .5em;
margin: .5em 0;
color: #c08580;
background-color: #f8f0ef;
font-size: 1.2em;
}
.result{
display: flex;
}
.result_table{
border-collapse: collapse;
border: 1px solid #f0e0e5;
width: 30em;
text-align: center;
font-size: 1.0em;
}
.result_table td{
border: 1px solid #f0e0e5;
padding: .3em;
}
.result_barchart{
width: 30em;
margin: 0 5em 0 5em;
}
.barchar_item{
margin: 2.5rem 0;
}
.barchart_barbox {
margin: 0.5em 0;
width: 100%;
background-color: #fff;
border: 1px solid #86c2dd;
border-radius: .2em;
}
.barchart_bar {
text-align: right;
height: 1.2rem;
}
.h3_button {
margin: 1.5em;
cursor: pointer;
color: #03a9f4;
}
.info
{
white-space:pre-wrap;
margin: .8em 1.5em;
}
.error-info
{
color: #a64747
}
.suite_dir {
margin: 1em .2em;
padding: .3em;
/* background-color: #dfeff6; */
border: 1px solid #bcd8e4;
}
.suite_file {
margin: 1em .2em;
padding: .3em;
border: 1px solid #bcd8e4;
}
.case {
margin: 1em .2em;
/* padding: .3em; */
border: 1px solid #e7d4d4;
}
.case_class_path{
margin: 0em 1em;
}
.folder_header {
padding: .2em .7em;
background-color: #fffaf9;
cursor: pointer;
}
.setup{
margin: .2em;
/* padding: .3em; */
/* border: 1px solid #e7d4d4; */
}
.teardown{
margin: .2em;
/* padding: .3em;*/
/* border: 1px solid #e7d4d4; */
}
.test_steps{
margin: .2em;
padding: .3em;
/* border: 1px solid #e7d4d4; */
}
.label {
display: inline-block;
padding: .1em .5em;
font-size: .88em;
letter-spacing: 1px;
white-space: nowrap;
color: #0d6ebc;
border-radius: .2em;
min-width: 5em;
margin-right: 2em;
font-family: consolas;
}
/* .suite_setup .label{
color: #219e26 ;
}
.suite_teardown .label{
color: #219e26;
} */
/* .case.pass .casename{
color: #329132 ;
} */
.case.pass .caselabel{
color: white;
background-color: #3b9e3f;
}
/* .case.fail .casename{
color: #a64747;
} */
.case.fail .caselabel{
color: white;
background-color: #a64747;
}
/* .case.abort .casename{
color: #953ab7;
} */
.case.abort .caselabel{
color: white;
background-color: #9c27b0;
}
.case_step {
margin: .8em;
}
.checkpoint_pass {
margin: .8em;
}
.checkpoint_fail {
margin: .8em;
}
.case_step .tag{
color: #2196f3;;
margin: .3em 1em .3em 0;
padding: .1em .3em;
font-size: .92em;
}
.checkpoint_pass .tag{
color: #009806;
margin:.3em 1em .3em .5em;
padding: .1em .3em;
font-size: .92em;
}
.checkpoint_fail .tag{
color: #9c2020;
margin:.3em 1em .3em .5em;
padding: .1em .3em;
font-size: .92em;
}
.screenshot {
border: 1px solid #86c2dd;
}
.executetime {
float: right;
}</style>
<script type="text/javascript">var FOLDER_ALL_CASES = false //是否为精简模式的标记
var ERROR_INFOS = []; // 错误信息列表
var current_error_idx = -1;
// 页面加载后执行的函数
window.addEventListener("load", function(){
// 所有 .folder_header 添加点击事件处理
let folderHeaderEles = document.querySelectorAll(".folder_header");
folderHeaderEles.forEach(function(ele) {
ele.addEventListener("click", function(event) {
let fb = event.target.closest('.folder_header').nextElementSibling;
fb.style.display = fb.style.display === 'none' ? 'block' : 'none'
});
});
// 找到所有的错误信息对象
ERROR_INFOS = document.querySelectorAll(".error-info");
});
function toggle_folder_all_cases(){
let eles = document.querySelectorAll(".folder_body");
FOLDER_ALL_CASES = !FOLDER_ALL_CASES;
document.getElementById('display_mode').innerHTML = FOLDER_ALL_CASES? "Detail" : "Summary"
for (const ele of eles){
ele.style.display = FOLDER_ALL_CASES? "none": "block"
}
}
function previous_error(){
// 查找错误必须是详细模式
if (FOLDER_ALL_CASES)
toggle_folder_all_cases()
current_error_idx -= 1;
if (current_error_idx<0)
current_error_idx = 0
let error = ERROR_INFOS[current_error_idx];
error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
}
function next_error(){
// 查找错误必须是详细模式
if (FOLDER_ALL_CASES)
toggle_folder_all_cases()
current_error_idx += 1;
if (current_error_idx > ERROR_INFOS.length-1)
current_error_idx = ERROR_INFOS.length-1
let error = ERROR_INFOS[current_error_idx];
error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
}</script>
</head>
<body>
<div class="main_section">
<h1 style="font-family: auto">测试报告</h1>
<h3>统计结果</h3>
<div class="result">
<table class="result_table">
<tbody>
<tr>
<td>hytest 版本</td>
<td>0.8.12</td>
</tr>
<tr>
<td>开始时间</td>
<td>2024/11/02 15:30:32</td>
</tr>
<tr>
<td>结束时间</td>
<td>2024/11/02 15:30:44</td>
</tr>
<tr>
<td>耗时</td>
<td>12.032 秒</td>
</tr>
<tr>
<td>预备执行用例数量</td>
<td>1</td>
</tr>
<tr>
<td>实际执用例行数量</td>
<td>1</td>
</tr>
<tr>
<td>通过</td>
<td>1</td>
</tr>
<tr>
<td>失败</td>
<td style="">0</td>
</tr>
<tr>
<td>异常</td>
<td style="">0</td>
</tr>
<tr>
<td>阻塞</td>
<td style="">0</td>
</tr>
<tr>
<td>套件初始化失败</td>
<td style="">0</td>
</tr>
<tr>
<td>套件清除 失败</td>
<td style="">0</td>
</tr>
<tr>
<td>用例初始化失败</td>
<td style="">0</td>
</tr>
<tr>
<td>用例清除 失败</td>
<td style="">0</td>
</tr>
</tbody>
</table>
<div class="result_barchart">
<div class="barchar_item">
<span>用例通过 100% : 1 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 100.0%; background-color: #04AA6D;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例失败 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #bb4069;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例异常 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #9c27b0;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例阻塞 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #dcbdbd;"></div>
</div>
</div>
</div>
</div>
<div style="margin-top:2em">
<h3 style="display:inline">执行日志</h3>
</div>
<div class="exec_log">
<div class="suite_dir" id="suite_dir cases\">
<div>
<span class="label">进入目录</span>
<span>cases\</span>
</div>
<div class="suite_setup setup" id="suite_setup setup cases\">
<div class="folder_header">
<span class="label">套件初始化</span>
<span>cases\</span>
<span class="executetime">2024-11-02 15:30:32</span>
</div>
<div class="folder_body">
<div class="info">'----------' 正在初始化浏览器 '----------'</div>
<div class="info">'----------' 正在处理SSL证书警告 '----------'</div>
<div class="info">'----------' SSL证书警告处理完成 '----------'</div>
</div>
</div>
</div>
<div class="suite_file" id="suite_file cases\登录模块\账号密码登录测试.py">
<div>
<span class="label">进入文件</span>
<span>cases\登录模块\账号密码登录测试.py</span>
</div>
<div class="case pass" id="case_00000001">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0001</span>
<span class="executetime">2024-11-02 15:30:39</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0001">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: None, 密码: Ubains@4321, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 请输入账号!</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 请输入账号!</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0001">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="suite_teardown teardown" id="suite_teardown teardown cases\">
<div class="folder_header">
<span class="label">套件清除</span>
<span>cases\</span>
<span class="executetime">2024-11-02 15:30:41</span>
</div>
<div class="folder_body">
<div class="info">清除浏览器</div>
</div>
</div>
</div>
</div>
</div>
<div id="float_menu">
<div class="menu-item" onclick="document.querySelector(&quot;body&quot;).scrollIntoView()">页首</div>
<div class="menu-item" onclick="window.open(&quot;http://www.byhy.net/tut/auto/hytest/01&quot;, &quot;_blank&quot;); ">帮助</div>
<div class="menu-item" id="display_mode" onclick="toggle_folder_all_cases()">Summary</div>
<div class="error_jumper" display="none">
<div class="menu-item" onclick="previous_error()" title="上一个错误"></div>
<div class="menu-item" onclick="next_error()" title="下一个错误"></div>
</div>
</div>
</body>
</html>
\ No newline at end of file
...@@ -309,27 +309,27 @@ function next_error(){ ...@@ -309,27 +309,27 @@ function next_error(){
</tr> </tr>
<tr> <tr>
<td>开始时间</td> <td>开始时间</td>
<td>2024/11/02 13:25:42</td> <td>2024/11/02 15:31:29</td>
</tr> </tr>
<tr> <tr>
<td>结束时间</td> <td>结束时间</td>
<td>2024/11/02 13:26:15</td> <td>2024/11/02 15:31:40</td>
</tr> </tr>
<tr> <tr>
<td>耗时</td> <td>耗时</td>
<td>33.319</td> <td>11.284</td>
</tr> </tr>
<tr> <tr>
<td>预备执行用例数量</td> <td>预备执行用例数量</td>
<td>10</td> <td>1</td>
</tr> </tr>
<tr> <tr>
<td>实际执用例行数量</td> <td>实际执用例行数量</td>
<td>10</td> <td>1</td>
</tr> </tr>
<tr> <tr>
<td>通过</td> <td>通过</td>
<td>9</td> <td>0</td>
</tr> </tr>
<tr> <tr>
<td>失败</td> <td>失败</td>
...@@ -363,15 +363,15 @@ function next_error(){ ...@@ -363,15 +363,15 @@ function next_error(){
</table> </table>
<div class="result_barchart"> <div class="result_barchart">
<div class="barchar_item"> <div class="barchar_item">
<span>用例通过 90% : 9</span> <span>用例通过 0% : 0</span>
<div class="barchart_barbox"> <div class="barchart_barbox">
<div class="barchart_bar" style="width: 90.0%; background-color: #04AA6D;"></div> <div class="barchart_bar" style="width: 0.0%; background-color: #04AA6D;"></div>
</div> </div>
</div> </div>
<div class="barchar_item"> <div class="barchar_item">
<span>用例失败 10% : 1 个</span> <span>用例失败 100% : 1 个</span>
<div class="barchart_barbox"> <div class="barchart_barbox">
<div class="barchart_bar" style="width: 10.0%; background-color: #bb4069;"></div> <div class="barchart_bar" style="width: 100.0%; background-color: #bb4069;"></div>
</div> </div>
</div> </div>
<div class="barchar_item"> <div class="barchar_item">
...@@ -401,7 +401,7 @@ function next_error(){ ...@@ -401,7 +401,7 @@ function next_error(){
<div class="folder_header"> <div class="folder_header">
<span class="label">套件初始化</span> <span class="label">套件初始化</span>
<span>cases\</span> <span>cases\</span>
<span class="executetime">2024-11-02 13:25:42</span> <span class="executetime">2024-11-02 15:31:29</span>
</div> </div>
<div class="folder_body"> <div class="folder_body">
<div class="info">'----------' 正在初始化浏览器 '----------'</div> <div class="info">'----------' 正在初始化浏览器 '----------'</div>
...@@ -415,344 +415,11 @@ function next_error(){ ...@@ -415,344 +415,11 @@ function next_error(){
<span class="label">进入文件</span> <span class="label">进入文件</span>
<span>cases\登录模块\账号密码登录测试.py</span> <span>cases\登录模块\账号密码登录测试.py</span>
</div> </div>
<div class="case pass" id="case_00000001"> <div class="case fail" id="case_00000001">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0001</span>
<span class="executetime">2024-11-02 13:25:49</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0001">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: None, 密码: Ubains@4321, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 请输入账号!</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 请输入账号!</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0001">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000002">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0002</span>
<span class="executetime">2024-11-02 13:25:51</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0002">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: None, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 请输入密码!</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 请输入密码!</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0002">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000003">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0003</span>
<span class="executetime">2024-11-02 13:25:54</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0003">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: Ubains@4321, 验证码: None</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 请输入验证码!</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 请输入验证码!</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0003">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000004">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0004</span>
<span class="executetime">2024-11-02 13:25:56</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0004">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj112, 密码: Ubains@4321, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 账号或密码错误</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 账号或密码错误</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0004">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000005">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0005</span>
<span class="executetime">2024-11-02 13:25:58</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0005">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: adM 12in@czj, 密码: Ubains@4321, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 账号或密码错误</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 账号或密码错误</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0005">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000006">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0006</span>
<span class="executetime">2024-11-02 13:26:01</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0006">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: 12345, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 账号或密码错误</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 账号或密码错误</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0006">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000007">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0007</span>
<span class="executetime">2024-11-02 13:26:03</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0007">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: U bains1s@432, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 账号或密码错误</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 账号或密码错误</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0007">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000008">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0008</span>
<span class="executetime">2024-11-02 13:26:06</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0008">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: Ubains@4321, 验证码: 123</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 验证码错误</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 验证码错误</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0008">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000009">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0009</span>
<span class="executetime">2024-11-02 13:26:08</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0009">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: Ubains@4321, 验证码: cs 12</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 验证码错误</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 验证码错误</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0009">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case fail" id="case_00000010">
<div class="folder_header"> <div class="folder_header">
<span class="label caselabel">用例 FAIL</span> <span class="label caselabel">用例 FAIL</span>
<span class="casename">登录 UI_0010</span> <span class="casename">登录 UI_0010</span>
<span class="executetime">2024-11-02 13:26:10</span> <span class="executetime">2024-11-02 15:31:35</span>
</div> </div>
<div class="folder_body"> <div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span> <span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
...@@ -777,7 +444,7 @@ function next_error(){ ...@@ -777,7 +444,7 @@ function next_error(){
</div> </div>
<div class="info error-info"> <div class="info error-info">
Traceback: Traceback:
File &quot;D:\GithubData\ubains-module-test\ubains-module-test\预定系统\cases\登录模块\账号密码登录测试.py&quot;, line 118, in teststeps File &quot;D:\GithubData\自动化脚本-3\ubains-module-test\预定系统\cases\登录模块\账号密码登录测试.py&quot;, line 167, in teststeps
CHECK_POINT('弹出提示', notify_text == check_text)</div> CHECK_POINT('弹出提示', notify_text == check_text)</div>
</div> </div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0010"> <div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0010">
...@@ -793,7 +460,7 @@ Traceback: ...@@ -793,7 +460,7 @@ Traceback:
<div class="folder_header"> <div class="folder_header">
<span class="label">套件清除</span> <span class="label">套件清除</span>
<span>cases\</span> <span>cases\</span>
<span class="executetime">2024-11-02 13:26:13</span> <span class="executetime">2024-11-02 15:31:38</span>
</div> </div>
<div class="folder_body"> <div class="folder_body">
<div class="info">清除浏览器</div> <div class="info">清除浏览器</div>
......
...@@ -309,27 +309,27 @@ function next_error(){ ...@@ -309,27 +309,27 @@ function next_error(){
</tr> </tr>
<tr> <tr>
<td>开始时间</td> <td>开始时间</td>
<td>2024/11/02 13:56:32</td> <td>2024/11/02 15:32:36</td>
</tr> </tr>
<tr> <tr>
<td>结束时间</td> <td>结束时间</td>
<td>2024/11/02 13:57:05</td> <td>2024/11/02 15:33:08</td>
</tr> </tr>
<tr> <tr>
<td>耗时</td> <td>耗时</td>
<td>33.340 秒</td> <td>32.050 秒</td>
</tr> </tr>
<tr> <tr>
<td>预备执行用例数量</td> <td>预备执行用例数量</td>
<td>10</td> <td>1</td>
</tr> </tr>
<tr> <tr>
<td>实际执用例行数量</td> <td>实际执用例行数量</td>
<td>10</td> <td>1</td>
</tr> </tr>
<tr> <tr>
<td>通过</td> <td>通过</td>
<td>9</td> <td>0</td>
</tr> </tr>
<tr> <tr>
<td>失败</td> <td>失败</td>
...@@ -363,15 +363,15 @@ function next_error(){ ...@@ -363,15 +363,15 @@ function next_error(){
</table> </table>
<div class="result_barchart"> <div class="result_barchart">
<div class="barchar_item"> <div class="barchar_item">
<span>用例通过 90% : 9</span> <span>用例通过 0% : 0</span>
<div class="barchart_barbox"> <div class="barchart_barbox">
<div class="barchart_bar" style="width: 90.0%; background-color: #04AA6D;"></div> <div class="barchart_bar" style="width: 0.0%; background-color: #04AA6D;"></div>
</div> </div>
</div> </div>
<div class="barchar_item"> <div class="barchar_item">
<span>用例失败 10% : 1 个</span> <span>用例失败 100% : 1 个</span>
<div class="barchart_barbox"> <div class="barchart_barbox">
<div class="barchart_bar" style="width: 10.0%; background-color: #bb4069;"></div> <div class="barchart_bar" style="width: 100.0%; background-color: #bb4069;"></div>
</div> </div>
</div> </div>
<div class="barchar_item"> <div class="barchar_item">
...@@ -401,7 +401,7 @@ function next_error(){ ...@@ -401,7 +401,7 @@ function next_error(){
<div class="folder_header"> <div class="folder_header">
<span class="label">套件初始化</span> <span class="label">套件初始化</span>
<span>cases\</span> <span>cases\</span>
<span class="executetime">2024-11-02 13:56:32</span> <span class="executetime">2024-11-02 15:32:36</span>
</div> </div>
<div class="folder_body"> <div class="folder_body">
<div class="info">'----------' 正在初始化浏览器 '----------'</div> <div class="info">'----------' 正在初始化浏览器 '----------'</div>
...@@ -415,344 +415,11 @@ function next_error(){ ...@@ -415,344 +415,11 @@ function next_error(){
<span class="label">进入文件</span> <span class="label">进入文件</span>
<span>cases\登录模块\账号密码登录测试.py</span> <span>cases\登录模块\账号密码登录测试.py</span>
</div> </div>
<div class="case pass" id="case_00000001"> <div class="case fail" id="case_00000001">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0001</span>
<span class="executetime">2024-11-02 13:56:39</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0001">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: None, 密码: Ubains@4321, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 请输入账号!</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 请输入账号!</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0001">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000002">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0002</span>
<span class="executetime">2024-11-02 13:56:40</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0002">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: None, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 请输入密码!</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 请输入密码!</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0002">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000003">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0003</span>
<span class="executetime">2024-11-02 13:56:41</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0003">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: Ubains@4321, 验证码: None</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 请输入验证码!</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 请输入验证码!</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0003">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000004">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0004</span>
<span class="executetime">2024-11-02 13:56:43</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0004">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj112, 密码: Ubains@4321, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 账号或密码错误</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 账号或密码错误</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0004">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000005">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0005</span>
<span class="executetime">2024-11-02 13:56:44</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0005">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: adM 12in@czj, 密码: Ubains@4321, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 账号或密码错误</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 账号或密码错误</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0005">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000006">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0006</span>
<span class="executetime">2024-11-02 13:56:45</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0006">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: 12345, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 账号或密码错误</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 账号或密码错误</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0006">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000007">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0007</span>
<span class="executetime">2024-11-02 13:56:47</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0007">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: U bains1s@432, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 账号或密码错误</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 账号或密码错误</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0007">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000008">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0008</span>
<span class="executetime">2024-11-02 13:56:48</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0008">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: Ubains@4321, 验证码: 123</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 验证码错误</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 验证码错误</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0008">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case pass" id="case_00000009">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0009</span>
<span class="executetime">2024-11-02 13:56:50</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0009">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: Ubains@4321, 验证码: cs 12</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 验证码错误</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 验证码错误</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0009">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="case fail" id="case_00000010">
<div class="folder_header"> <div class="folder_header">
<span class="label caselabel">用例 FAIL</span> <span class="label caselabel">用例 FAIL</span>
<span class="casename">登录 UI_0010</span> <span class="casename">登录 UI_0010</span>
<span class="executetime">2024-11-02 13:56:51</span> <span class="executetime">2024-11-02 15:32:43</span>
</div> </div>
<div class="folder_body"> <div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span> <span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
...@@ -816,7 +483,7 @@ Traceback: ...@@ -816,7 +483,7 @@ Traceback:
<div class="folder_header"> <div class="folder_header">
<span class="label">套件清除</span> <span class="label">套件清除</span>
<span>cases\</span> <span>cases\</span>
<span class="executetime">2024-11-02 13:57:03</span> <span class="executetime">2024-11-02 15:33:06</span>
</div> </div>
<div class="folder_body"> <div class="folder_body">
<div class="info">清除浏览器</div> <div class="info">清除浏览器</div>
......
<!DOCTYPE html>
<html>
<head>
<title>测试报告</title>
<meta charset="UTF-8">
<style>body {
font-family: consolas, Verdana, sans-serif;
font-size: .95em;
color: #696e71;
display: grid;
grid-template-columns: 1fr 5rem;
}
.main_section {
width: 90%;
margin: 0 auto;
}
#float_menu{
position:fixed;
top:0;
right:0;
text-align: center;
}
#float_menu .menu-item {
cursor: pointer;
padding: .5em;
margin: .5em 0;
color: #c08580;
background-color: #f8f0ef;
font-size: 1.2em;
}
.result{
display: flex;
}
.result_table{
border-collapse: collapse;
border: 1px solid #f0e0e5;
width: 30em;
text-align: center;
font-size: 1.0em;
}
.result_table td{
border: 1px solid #f0e0e5;
padding: .3em;
}
.result_barchart{
width: 30em;
margin: 0 5em 0 5em;
}
.barchar_item{
margin: 2.5rem 0;
}
.barchart_barbox {
margin: 0.5em 0;
width: 100%;
background-color: #fff;
border: 1px solid #86c2dd;
border-radius: .2em;
}
.barchart_bar {
text-align: right;
height: 1.2rem;
}
.h3_button {
margin: 1.5em;
cursor: pointer;
color: #03a9f4;
}
.info
{
white-space:pre-wrap;
margin: .8em 1.5em;
}
.error-info
{
color: #a64747
}
.suite_dir {
margin: 1em .2em;
padding: .3em;
/* background-color: #dfeff6; */
border: 1px solid #bcd8e4;
}
.suite_file {
margin: 1em .2em;
padding: .3em;
border: 1px solid #bcd8e4;
}
.case {
margin: 1em .2em;
/* padding: .3em; */
border: 1px solid #e7d4d4;
}
.case_class_path{
margin: 0em 1em;
}
.folder_header {
padding: .2em .7em;
background-color: #fffaf9;
cursor: pointer;
}
.setup{
margin: .2em;
/* padding: .3em; */
/* border: 1px solid #e7d4d4; */
}
.teardown{
margin: .2em;
/* padding: .3em;*/
/* border: 1px solid #e7d4d4; */
}
.test_steps{
margin: .2em;
padding: .3em;
/* border: 1px solid #e7d4d4; */
}
.label {
display: inline-block;
padding: .1em .5em;
font-size: .88em;
letter-spacing: 1px;
white-space: nowrap;
color: #0d6ebc;
border-radius: .2em;
min-width: 5em;
margin-right: 2em;
font-family: consolas;
}
/* .suite_setup .label{
color: #219e26 ;
}
.suite_teardown .label{
color: #219e26;
} */
/* .case.pass .casename{
color: #329132 ;
} */
.case.pass .caselabel{
color: white;
background-color: #3b9e3f;
}
/* .case.fail .casename{
color: #a64747;
} */
.case.fail .caselabel{
color: white;
background-color: #a64747;
}
/* .case.abort .casename{
color: #953ab7;
} */
.case.abort .caselabel{
color: white;
background-color: #9c27b0;
}
.case_step {
margin: .8em;
}
.checkpoint_pass {
margin: .8em;
}
.checkpoint_fail {
margin: .8em;
}
.case_step .tag{
color: #2196f3;;
margin: .3em 1em .3em 0;
padding: .1em .3em;
font-size: .92em;
}
.checkpoint_pass .tag{
color: #009806;
margin:.3em 1em .3em .5em;
padding: .1em .3em;
font-size: .92em;
}
.checkpoint_fail .tag{
color: #9c2020;
margin:.3em 1em .3em .5em;
padding: .1em .3em;
font-size: .92em;
}
.screenshot {
border: 1px solid #86c2dd;
}
.executetime {
float: right;
}</style>
<script type="text/javascript">var FOLDER_ALL_CASES = false //是否为精简模式的标记
var ERROR_INFOS = []; // 错误信息列表
var current_error_idx = -1;
// 页面加载后执行的函数
window.addEventListener("load", function(){
// 所有 .folder_header 添加点击事件处理
let folderHeaderEles = document.querySelectorAll(".folder_header");
folderHeaderEles.forEach(function(ele) {
ele.addEventListener("click", function(event) {
let fb = event.target.closest('.folder_header').nextElementSibling;
fb.style.display = fb.style.display === 'none' ? 'block' : 'none'
});
});
// 找到所有的错误信息对象
ERROR_INFOS = document.querySelectorAll(".error-info");
});
function toggle_folder_all_cases(){
let eles = document.querySelectorAll(".folder_body");
FOLDER_ALL_CASES = !FOLDER_ALL_CASES;
document.getElementById('display_mode').innerHTML = FOLDER_ALL_CASES? "Detail" : "Summary"
for (const ele of eles){
ele.style.display = FOLDER_ALL_CASES? "none": "block"
}
}
function previous_error(){
// 查找错误必须是详细模式
if (FOLDER_ALL_CASES)
toggle_folder_all_cases()
current_error_idx -= 1;
if (current_error_idx<0)
current_error_idx = 0
let error = ERROR_INFOS[current_error_idx];
error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
}
function next_error(){
// 查找错误必须是详细模式
if (FOLDER_ALL_CASES)
toggle_folder_all_cases()
current_error_idx += 1;
if (current_error_idx > ERROR_INFOS.length-1)
current_error_idx = ERROR_INFOS.length-1
let error = ERROR_INFOS[current_error_idx];
error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
}</script>
</head>
<body>
<div class="main_section">
<h1 style="font-family: auto">测试报告</h1>
<h3>统计结果</h3>
<div class="result">
<table class="result_table">
<tbody>
<tr>
<td>hytest 版本</td>
<td>0.8.12</td>
</tr>
<tr>
<td>开始时间</td>
<td>2024/11/02 15:34:53</td>
</tr>
<tr>
<td>结束时间</td>
<td>2024/11/02 15:35:04</td>
</tr>
<tr>
<td>耗时</td>
<td>10.984 秒</td>
</tr>
<tr>
<td>预备执行用例数量</td>
<td>1</td>
</tr>
<tr>
<td>实际执用例行数量</td>
<td>1</td>
</tr>
<tr>
<td>通过</td>
<td>1</td>
</tr>
<tr>
<td>失败</td>
<td style="">0</td>
</tr>
<tr>
<td>异常</td>
<td style="">0</td>
</tr>
<tr>
<td>阻塞</td>
<td style="">0</td>
</tr>
<tr>
<td>套件初始化失败</td>
<td style="">0</td>
</tr>
<tr>
<td>套件清除 失败</td>
<td style="">0</td>
</tr>
<tr>
<td>用例初始化失败</td>
<td style="">0</td>
</tr>
<tr>
<td>用例清除 失败</td>
<td style="">0</td>
</tr>
</tbody>
</table>
<div class="result_barchart">
<div class="barchar_item">
<span>用例通过 100% : 1 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 100.0%; background-color: #04AA6D;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例失败 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #bb4069;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例异常 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #9c27b0;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例阻塞 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #dcbdbd;"></div>
</div>
</div>
</div>
</div>
<div style="margin-top:2em">
<h3 style="display:inline">执行日志</h3>
</div>
<div class="exec_log">
<div class="suite_dir" id="suite_dir cases\">
<div>
<span class="label">进入目录</span>
<span>cases\</span>
</div>
<div class="suite_setup setup" id="suite_setup setup cases\">
<div class="folder_header">
<span class="label">套件初始化</span>
<span>cases\</span>
<span class="executetime">2024-11-02 15:34:53</span>
</div>
<div class="folder_body">
<div class="info">'----------' 正在初始化浏览器 '----------'</div>
<div class="info">'----------' 正在处理SSL证书警告 '----------'</div>
<div class="info">'----------' SSL证书警告处理完成 '----------'</div>
</div>
</div>
</div>
<div class="suite_file" id="suite_file cases\登录模块\账号密码登录测试.py">
<div>
<span class="label">进入文件</span>
<span>cases\登录模块\账号密码登录测试.py</span>
</div>
<div class="case pass" id="case_00000001">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">登录 UI_0010</span>
<span class="executetime">2024-11-02 15:35:00</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\登录模块\账号密码登录测试.py::UI_000x</span>
<div class="test_steps" id="test_steps 登录 UI_0010">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>输入账号: admin@czj, 密码: Ubains@4321, 验证码: csba</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>点击登录按钮</span>
</div>
<div class="info">Alert text: 欢迎 预定标准版测试</div>
<div class="case_step">
<span class="tag">步骤 #3</span>
<span>校验提示信息: 欢迎 预定标准版测试</span>
</div>
<div class="checkpoint_pass">
<span class="tag">检查点 PASS</span>
<span>弹出提示</span>
</div>
</div>
<div class="case_teardown teardown case_st_lable" id="case_teardown teardown 登录 UI_0010">
<span class="label">用例清除</span>
<div class="case_step">
<span class="tag">步骤 #4</span>
<span>刷新页面</span>
</div>
</div>
</div>
</div>
<div class="suite_teardown teardown" id="suite_teardown teardown cases\">
<div class="folder_header">
<span class="label">套件清除</span>
<span>cases\</span>
<span class="executetime">2024-11-02 15:35:02</span>
</div>
<div class="folder_body">
<div class="info">清除浏览器</div>
</div>
</div>
</div>
</div>
</div>
<div id="float_menu">
<div class="menu-item" onclick="document.querySelector(&quot;body&quot;).scrollIntoView()">页首</div>
<div class="menu-item" onclick="window.open(&quot;http://www.byhy.net/tut/auto/hytest/01&quot;, &quot;_blank&quot;); ">帮助</div>
<div class="menu-item" id="display_mode" onclick="toggle_folder_all_cases()">Summary</div>
<div class="error_jumper" display="none">
<div class="menu-item" onclick="previous_error()" title="上一个错误"></div>
<div class="menu-item" onclick="next_error()" title="下一个错误"></div>
</div>
</div>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title>测试报告</title>
<meta charset="UTF-8">
<style>body {
font-family: consolas, Verdana, sans-serif;
font-size: .95em;
color: #696e71;
display: grid;
grid-template-columns: 1fr 5rem;
}
.main_section {
width: 90%;
margin: 0 auto;
}
#float_menu{
position:fixed;
top:0;
right:0;
text-align: center;
}
#float_menu .menu-item {
cursor: pointer;
padding: .5em;
margin: .5em 0;
color: #c08580;
background-color: #f8f0ef;
font-size: 1.2em;
}
.result{
display: flex;
}
.result_table{
border-collapse: collapse;
border: 1px solid #f0e0e5;
width: 30em;
text-align: center;
font-size: 1.0em;
}
.result_table td{
border: 1px solid #f0e0e5;
padding: .3em;
}
.result_barchart{
width: 30em;
margin: 0 5em 0 5em;
}
.barchar_item{
margin: 2.5rem 0;
}
.barchart_barbox {
margin: 0.5em 0;
width: 100%;
background-color: #fff;
border: 1px solid #86c2dd;
border-radius: .2em;
}
.barchart_bar {
text-align: right;
height: 1.2rem;
}
.h3_button {
margin: 1.5em;
cursor: pointer;
color: #03a9f4;
}
.info
{
white-space:pre-wrap;
margin: .8em 1.5em;
}
.error-info
{
color: #a64747
}
.suite_dir {
margin: 1em .2em;
padding: .3em;
/* background-color: #dfeff6; */
border: 1px solid #bcd8e4;
}
.suite_file {
margin: 1em .2em;
padding: .3em;
border: 1px solid #bcd8e4;
}
.case {
margin: 1em .2em;
/* padding: .3em; */
border: 1px solid #e7d4d4;
}
.case_class_path{
margin: 0em 1em;
}
.folder_header {
padding: .2em .7em;
background-color: #fffaf9;
cursor: pointer;
}
.setup{
margin: .2em;
/* padding: .3em; */
/* border: 1px solid #e7d4d4; */
}
.teardown{
margin: .2em;
/* padding: .3em;*/
/* border: 1px solid #e7d4d4; */
}
.test_steps{
margin: .2em;
padding: .3em;
/* border: 1px solid #e7d4d4; */
}
.label {
display: inline-block;
padding: .1em .5em;
font-size: .88em;
letter-spacing: 1px;
white-space: nowrap;
color: #0d6ebc;
border-radius: .2em;
min-width: 5em;
margin-right: 2em;
font-family: consolas;
}
/* .suite_setup .label{
color: #219e26 ;
}
.suite_teardown .label{
color: #219e26;
} */
/* .case.pass .casename{
color: #329132 ;
} */
.case.pass .caselabel{
color: white;
background-color: #3b9e3f;
}
/* .case.fail .casename{
color: #a64747;
} */
.case.fail .caselabel{
color: white;
background-color: #a64747;
}
/* .case.abort .casename{
color: #953ab7;
} */
.case.abort .caselabel{
color: white;
background-color: #9c27b0;
}
.case_step {
margin: .8em;
}
.checkpoint_pass {
margin: .8em;
}
.checkpoint_fail {
margin: .8em;
}
.case_step .tag{
color: #2196f3;;
margin: .3em 1em .3em 0;
padding: .1em .3em;
font-size: .92em;
}
.checkpoint_pass .tag{
color: #009806;
margin:.3em 1em .3em .5em;
padding: .1em .3em;
font-size: .92em;
}
.checkpoint_fail .tag{
color: #9c2020;
margin:.3em 1em .3em .5em;
padding: .1em .3em;
font-size: .92em;
}
.screenshot {
border: 1px solid #86c2dd;
}
.executetime {
float: right;
}</style>
<script type="text/javascript">var FOLDER_ALL_CASES = false //是否为精简模式的标记
var ERROR_INFOS = []; // 错误信息列表
var current_error_idx = -1;
// 页面加载后执行的函数
window.addEventListener("load", function(){
// 所有 .folder_header 添加点击事件处理
let folderHeaderEles = document.querySelectorAll(".folder_header");
folderHeaderEles.forEach(function(ele) {
ele.addEventListener("click", function(event) {
let fb = event.target.closest('.folder_header').nextElementSibling;
fb.style.display = fb.style.display === 'none' ? 'block' : 'none'
});
});
// 找到所有的错误信息对象
ERROR_INFOS = document.querySelectorAll(".error-info");
});
function toggle_folder_all_cases(){
let eles = document.querySelectorAll(".folder_body");
FOLDER_ALL_CASES = !FOLDER_ALL_CASES;
document.getElementById('display_mode').innerHTML = FOLDER_ALL_CASES? "Detail" : "Summary"
for (const ele of eles){
ele.style.display = FOLDER_ALL_CASES? "none": "block"
}
}
function previous_error(){
// 查找错误必须是详细模式
if (FOLDER_ALL_CASES)
toggle_folder_all_cases()
current_error_idx -= 1;
if (current_error_idx<0)
current_error_idx = 0
let error = ERROR_INFOS[current_error_idx];
error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
}
function next_error(){
// 查找错误必须是详细模式
if (FOLDER_ALL_CASES)
toggle_folder_all_cases()
current_error_idx += 1;
if (current_error_idx > ERROR_INFOS.length-1)
current_error_idx = ERROR_INFOS.length-1
let error = ERROR_INFOS[current_error_idx];
error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
}</script>
</head>
<body>
<div class="main_section">
<h1 style="font-family: auto">测试报告</h1>
<h3>统计结果</h3>
<div class="result">
<table class="result_table">
<tbody>
<tr>
<td>hytest 版本</td>
<td>0.8.12</td>
</tr>
<tr>
<td>开始时间</td>
<td>2024/11/02 16:23:00</td>
</tr>
<tr>
<td>结束时间</td>
<td>2024/11/02 16:23:13</td>
</tr>
<tr>
<td>耗时</td>
<td>12.610 秒</td>
</tr>
<tr>
<td>预备执行用例数量</td>
<td>1</td>
</tr>
<tr>
<td>实际执用例行数量</td>
<td>1</td>
</tr>
<tr>
<td>通过</td>
<td>1</td>
</tr>
<tr>
<td>失败</td>
<td style="">0</td>
</tr>
<tr>
<td>异常</td>
<td style="">0</td>
</tr>
<tr>
<td>阻塞</td>
<td style="">0</td>
</tr>
<tr>
<td>套件初始化失败</td>
<td style="">0</td>
</tr>
<tr>
<td>套件清除 失败</td>
<td style="">0</td>
</tr>
<tr>
<td>用例初始化失败</td>
<td style="">0</td>
</tr>
<tr>
<td>用例清除 失败</td>
<td style="">0</td>
</tr>
</tbody>
</table>
<div class="result_barchart">
<div class="barchar_item">
<span>用例通过 100% : 1 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 100.0%; background-color: #04AA6D;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例失败 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #bb4069;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例异常 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #9c27b0;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例阻塞 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #dcbdbd;"></div>
</div>
</div>
</div>
</div>
<div style="margin-top:2em">
<h3 style="display:inline">执行日志</h3>
</div>
<div class="exec_log">
<div class="suite_dir" id="suite_dir cases\">
<div>
<span class="label">进入目录</span>
<span>cases\</span>
</div>
<div class="suite_setup setup" id="suite_setup setup cases\">
<div class="folder_header">
<span class="label">套件初始化</span>
<span>cases\</span>
<span class="executetime">2024-11-02 16:23:00</span>
</div>
<div class="folder_body">
<div class="info">'----------' 正在初始化浏览器 '----------'</div>
<div class="info">'----------' 正在处理SSL证书警告 '----------'</div>
<div class="info">'----------' SSL证书警告处理完成 '----------'</div>
</div>
</div>
</div>
<div class="suite_file" id="suite_file cases\设备管理\安卓信息上报.py">
<div>
<span class="label">进入文件</span>
<span>cases\设备管理\安卓信息上报.py</span>
</div>
<div class="case pass" id="case_00000001">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">设备上报_0001</span>
<span class="executetime">2024-11-02 16:23:06</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\设备管理\安卓信息上报.py::Android_000x</span>
<div class="test_steps" id="test_steps 设备上报_0001">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>连接MQTT</span>
</div>
</div>
</div>
</div>
<div class="suite_teardown teardown" id="suite_teardown teardown cases\">
<div class="folder_header">
<span class="label">套件清除</span>
<span>cases\</span>
<span class="executetime">2024-11-02 16:23:11</span>
</div>
<div class="folder_body">
<div class="info">清除浏览器</div>
</div>
</div>
</div>
</div>
</div>
<div id="float_menu">
<div class="menu-item" onclick="document.querySelector(&quot;body&quot;).scrollIntoView()">页首</div>
<div class="menu-item" onclick="window.open(&quot;http://www.byhy.net/tut/auto/hytest/01&quot;, &quot;_blank&quot;); ">帮助</div>
<div class="menu-item" id="display_mode" onclick="toggle_folder_all_cases()">Summary</div>
<div class="error_jumper" display="none">
<div class="menu-item" onclick="previous_error()" title="上一个错误"></div>
<div class="menu-item" onclick="next_error()" title="下一个错误"></div>
</div>
</div>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title>测试报告</title>
<meta charset="UTF-8">
<style>body {
font-family: consolas, Verdana, sans-serif;
font-size: .95em;
color: #696e71;
display: grid;
grid-template-columns: 1fr 5rem;
}
.main_section {
width: 90%;
margin: 0 auto;
}
#float_menu{
position:fixed;
top:0;
right:0;
text-align: center;
}
#float_menu .menu-item {
cursor: pointer;
padding: .5em;
margin: .5em 0;
color: #c08580;
background-color: #f8f0ef;
font-size: 1.2em;
}
.result{
display: flex;
}
.result_table{
border-collapse: collapse;
border: 1px solid #f0e0e5;
width: 30em;
text-align: center;
font-size: 1.0em;
}
.result_table td{
border: 1px solid #f0e0e5;
padding: .3em;
}
.result_barchart{
width: 30em;
margin: 0 5em 0 5em;
}
.barchar_item{
margin: 2.5rem 0;
}
.barchart_barbox {
margin: 0.5em 0;
width: 100%;
background-color: #fff;
border: 1px solid #86c2dd;
border-radius: .2em;
}
.barchart_bar {
text-align: right;
height: 1.2rem;
}
.h3_button {
margin: 1.5em;
cursor: pointer;
color: #03a9f4;
}
.info
{
white-space:pre-wrap;
margin: .8em 1.5em;
}
.error-info
{
color: #a64747
}
.suite_dir {
margin: 1em .2em;
padding: .3em;
/* background-color: #dfeff6; */
border: 1px solid #bcd8e4;
}
.suite_file {
margin: 1em .2em;
padding: .3em;
border: 1px solid #bcd8e4;
}
.case {
margin: 1em .2em;
/* padding: .3em; */
border: 1px solid #e7d4d4;
}
.case_class_path{
margin: 0em 1em;
}
.folder_header {
padding: .2em .7em;
background-color: #fffaf9;
cursor: pointer;
}
.setup{
margin: .2em;
/* padding: .3em; */
/* border: 1px solid #e7d4d4; */
}
.teardown{
margin: .2em;
/* padding: .3em;*/
/* border: 1px solid #e7d4d4; */
}
.test_steps{
margin: .2em;
padding: .3em;
/* border: 1px solid #e7d4d4; */
}
.label {
display: inline-block;
padding: .1em .5em;
font-size: .88em;
letter-spacing: 1px;
white-space: nowrap;
color: #0d6ebc;
border-radius: .2em;
min-width: 5em;
margin-right: 2em;
font-family: consolas;
}
/* .suite_setup .label{
color: #219e26 ;
}
.suite_teardown .label{
color: #219e26;
} */
/* .case.pass .casename{
color: #329132 ;
} */
.case.pass .caselabel{
color: white;
background-color: #3b9e3f;
}
/* .case.fail .casename{
color: #a64747;
} */
.case.fail .caselabel{
color: white;
background-color: #a64747;
}
/* .case.abort .casename{
color: #953ab7;
} */
.case.abort .caselabel{
color: white;
background-color: #9c27b0;
}
.case_step {
margin: .8em;
}
.checkpoint_pass {
margin: .8em;
}
.checkpoint_fail {
margin: .8em;
}
.case_step .tag{
color: #2196f3;;
margin: .3em 1em .3em 0;
padding: .1em .3em;
font-size: .92em;
}
.checkpoint_pass .tag{
color: #009806;
margin:.3em 1em .3em .5em;
padding: .1em .3em;
font-size: .92em;
}
.checkpoint_fail .tag{
color: #9c2020;
margin:.3em 1em .3em .5em;
padding: .1em .3em;
font-size: .92em;
}
.screenshot {
border: 1px solid #86c2dd;
}
.executetime {
float: right;
}</style>
<script type="text/javascript">var FOLDER_ALL_CASES = false //是否为精简模式的标记
var ERROR_INFOS = []; // 错误信息列表
var current_error_idx = -1;
// 页面加载后执行的函数
window.addEventListener("load", function(){
// 所有 .folder_header 添加点击事件处理
let folderHeaderEles = document.querySelectorAll(".folder_header");
folderHeaderEles.forEach(function(ele) {
ele.addEventListener("click", function(event) {
let fb = event.target.closest('.folder_header').nextElementSibling;
fb.style.display = fb.style.display === 'none' ? 'block' : 'none'
});
});
// 找到所有的错误信息对象
ERROR_INFOS = document.querySelectorAll(".error-info");
});
function toggle_folder_all_cases(){
let eles = document.querySelectorAll(".folder_body");
FOLDER_ALL_CASES = !FOLDER_ALL_CASES;
document.getElementById('display_mode').innerHTML = FOLDER_ALL_CASES? "Detail" : "Summary"
for (const ele of eles){
ele.style.display = FOLDER_ALL_CASES? "none": "block"
}
}
function previous_error(){
// 查找错误必须是详细模式
if (FOLDER_ALL_CASES)
toggle_folder_all_cases()
current_error_idx -= 1;
if (current_error_idx<0)
current_error_idx = 0
let error = ERROR_INFOS[current_error_idx];
error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
}
function next_error(){
// 查找错误必须是详细模式
if (FOLDER_ALL_CASES)
toggle_folder_all_cases()
current_error_idx += 1;
if (current_error_idx > ERROR_INFOS.length-1)
current_error_idx = ERROR_INFOS.length-1
let error = ERROR_INFOS[current_error_idx];
error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
}</script>
</head>
<body>
<div class="main_section">
<h1 style="font-family: auto">测试报告</h1>
<h3>统计结果</h3>
<div class="result">
<table class="result_table">
<tbody>
<tr>
<td>hytest 版本</td>
<td>0.8.12</td>
</tr>
<tr>
<td>开始时间</td>
<td>2024/11/02 16:24:06</td>
</tr>
<tr>
<td>结束时间</td>
<td>2024/11/02 16:24:39</td>
</tr>
<tr>
<td>耗时</td>
<td>32.573 秒</td>
</tr>
<tr>
<td>预备执行用例数量</td>
<td>1</td>
</tr>
<tr>
<td>实际执用例行数量</td>
<td>1</td>
</tr>
<tr>
<td>通过</td>
<td>1</td>
</tr>
<tr>
<td>失败</td>
<td style="">0</td>
</tr>
<tr>
<td>异常</td>
<td style="">0</td>
</tr>
<tr>
<td>阻塞</td>
<td style="">0</td>
</tr>
<tr>
<td>套件初始化失败</td>
<td style="">0</td>
</tr>
<tr>
<td>套件清除 失败</td>
<td style="">0</td>
</tr>
<tr>
<td>用例初始化失败</td>
<td style="">0</td>
</tr>
<tr>
<td>用例清除 失败</td>
<td style="">0</td>
</tr>
</tbody>
</table>
<div class="result_barchart">
<div class="barchar_item">
<span>用例通过 100% : 1 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 100.0%; background-color: #04AA6D;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例失败 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #bb4069;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例异常 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #9c27b0;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例阻塞 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #dcbdbd;"></div>
</div>
</div>
</div>
</div>
<div style="margin-top:2em">
<h3 style="display:inline">执行日志</h3>
</div>
<div class="exec_log">
<div class="suite_dir" id="suite_dir cases\">
<div>
<span class="label">进入目录</span>
<span>cases\</span>
</div>
<div class="suite_setup setup" id="suite_setup setup cases\">
<div class="folder_header">
<span class="label">套件初始化</span>
<span>cases\</span>
<span class="executetime">2024-11-02 16:24:06</span>
</div>
<div class="folder_body">
<div class="info">'----------' 正在初始化浏览器 '----------'</div>
<div class="info">'----------' 正在处理SSL证书警告 '----------'</div>
<div class="info">'----------' SSL证书警告处理完成 '----------'</div>
</div>
</div>
</div>
<div class="suite_file" id="suite_file cases\设备管理\安卓信息上报.py">
<div>
<span class="label">进入文件</span>
<span>cases\设备管理\安卓信息上报.py</span>
</div>
<div class="case pass" id="case_00000001">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">设备上报_0001</span>
<span class="executetime">2024-11-02 16:24:16</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\设备管理\安卓信息上报.py::Android_000x</span>
<div class="test_steps" id="test_steps 设备上报_0001">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>连接MQTT</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>MQTT发送消息</span>
</div>
</div>
</div>
</div>
<div class="suite_teardown teardown" id="suite_teardown teardown cases\">
<div class="folder_header">
<span class="label">套件清除</span>
<span>cases\</span>
<span class="executetime">2024-11-02 16:24:37</span>
</div>
<div class="folder_body">
<div class="info">清除浏览器</div>
</div>
</div>
</div>
</div>
</div>
<div id="float_menu">
<div class="menu-item" onclick="document.querySelector(&quot;body&quot;).scrollIntoView()">页首</div>
<div class="menu-item" onclick="window.open(&quot;http://www.byhy.net/tut/auto/hytest/01&quot;, &quot;_blank&quot;); ">帮助</div>
<div class="menu-item" id="display_mode" onclick="toggle_folder_all_cases()">Summary</div>
<div class="error_jumper" display="none">
<div class="menu-item" onclick="previous_error()" title="上一个错误"></div>
<div class="menu-item" onclick="next_error()" title="下一个错误"></div>
</div>
</div>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title>测试报告</title>
<meta charset="UTF-8">
<style>body {
font-family: consolas, Verdana, sans-serif;
font-size: .95em;
color: #696e71;
display: grid;
grid-template-columns: 1fr 5rem;
}
.main_section {
width: 90%;
margin: 0 auto;
}
#float_menu{
position:fixed;
top:0;
right:0;
text-align: center;
}
#float_menu .menu-item {
cursor: pointer;
padding: .5em;
margin: .5em 0;
color: #c08580;
background-color: #f8f0ef;
font-size: 1.2em;
}
.result{
display: flex;
}
.result_table{
border-collapse: collapse;
border: 1px solid #f0e0e5;
width: 30em;
text-align: center;
font-size: 1.0em;
}
.result_table td{
border: 1px solid #f0e0e5;
padding: .3em;
}
.result_barchart{
width: 30em;
margin: 0 5em 0 5em;
}
.barchar_item{
margin: 2.5rem 0;
}
.barchart_barbox {
margin: 0.5em 0;
width: 100%;
background-color: #fff;
border: 1px solid #86c2dd;
border-radius: .2em;
}
.barchart_bar {
text-align: right;
height: 1.2rem;
}
.h3_button {
margin: 1.5em;
cursor: pointer;
color: #03a9f4;
}
.info
{
white-space:pre-wrap;
margin: .8em 1.5em;
}
.error-info
{
color: #a64747
}
.suite_dir {
margin: 1em .2em;
padding: .3em;
/* background-color: #dfeff6; */
border: 1px solid #bcd8e4;
}
.suite_file {
margin: 1em .2em;
padding: .3em;
border: 1px solid #bcd8e4;
}
.case {
margin: 1em .2em;
/* padding: .3em; */
border: 1px solid #e7d4d4;
}
.case_class_path{
margin: 0em 1em;
}
.folder_header {
padding: .2em .7em;
background-color: #fffaf9;
cursor: pointer;
}
.setup{
margin: .2em;
/* padding: .3em; */
/* border: 1px solid #e7d4d4; */
}
.teardown{
margin: .2em;
/* padding: .3em;*/
/* border: 1px solid #e7d4d4; */
}
.test_steps{
margin: .2em;
padding: .3em;
/* border: 1px solid #e7d4d4; */
}
.label {
display: inline-block;
padding: .1em .5em;
font-size: .88em;
letter-spacing: 1px;
white-space: nowrap;
color: #0d6ebc;
border-radius: .2em;
min-width: 5em;
margin-right: 2em;
font-family: consolas;
}
/* .suite_setup .label{
color: #219e26 ;
}
.suite_teardown .label{
color: #219e26;
} */
/* .case.pass .casename{
color: #329132 ;
} */
.case.pass .caselabel{
color: white;
background-color: #3b9e3f;
}
/* .case.fail .casename{
color: #a64747;
} */
.case.fail .caselabel{
color: white;
background-color: #a64747;
}
/* .case.abort .casename{
color: #953ab7;
} */
.case.abort .caselabel{
color: white;
background-color: #9c27b0;
}
.case_step {
margin: .8em;
}
.checkpoint_pass {
margin: .8em;
}
.checkpoint_fail {
margin: .8em;
}
.case_step .tag{
color: #2196f3;;
margin: .3em 1em .3em 0;
padding: .1em .3em;
font-size: .92em;
}
.checkpoint_pass .tag{
color: #009806;
margin:.3em 1em .3em .5em;
padding: .1em .3em;
font-size: .92em;
}
.checkpoint_fail .tag{
color: #9c2020;
margin:.3em 1em .3em .5em;
padding: .1em .3em;
font-size: .92em;
}
.screenshot {
border: 1px solid #86c2dd;
}
.executetime {
float: right;
}</style>
<script type="text/javascript">var FOLDER_ALL_CASES = false //是否为精简模式的标记
var ERROR_INFOS = []; // 错误信息列表
var current_error_idx = -1;
// 页面加载后执行的函数
window.addEventListener("load", function(){
// 所有 .folder_header 添加点击事件处理
let folderHeaderEles = document.querySelectorAll(".folder_header");
folderHeaderEles.forEach(function(ele) {
ele.addEventListener("click", function(event) {
let fb = event.target.closest('.folder_header').nextElementSibling;
fb.style.display = fb.style.display === 'none' ? 'block' : 'none'
});
});
// 找到所有的错误信息对象
ERROR_INFOS = document.querySelectorAll(".error-info");
});
function toggle_folder_all_cases(){
let eles = document.querySelectorAll(".folder_body");
FOLDER_ALL_CASES = !FOLDER_ALL_CASES;
document.getElementById('display_mode').innerHTML = FOLDER_ALL_CASES? "Detail" : "Summary"
for (const ele of eles){
ele.style.display = FOLDER_ALL_CASES? "none": "block"
}
}
function previous_error(){
// 查找错误必须是详细模式
if (FOLDER_ALL_CASES)
toggle_folder_all_cases()
current_error_idx -= 1;
if (current_error_idx<0)
current_error_idx = 0
let error = ERROR_INFOS[current_error_idx];
error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
}
function next_error(){
// 查找错误必须是详细模式
if (FOLDER_ALL_CASES)
toggle_folder_all_cases()
current_error_idx += 1;
if (current_error_idx > ERROR_INFOS.length-1)
current_error_idx = ERROR_INFOS.length-1
let error = ERROR_INFOS[current_error_idx];
error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
}</script>
</head>
<body>
<div class="main_section">
<h1 style="font-family: auto">测试报告</h1>
<h3>统计结果</h3>
<div class="result">
<table class="result_table">
<tbody>
<tr>
<td>hytest 版本</td>
<td>0.8.12</td>
</tr>
<tr>
<td>开始时间</td>
<td>2024/11/02 16:25:16</td>
</tr>
<tr>
<td>结束时间</td>
<td>2024/11/02 16:25:47</td>
</tr>
<tr>
<td>耗时</td>
<td>30.667 秒</td>
</tr>
<tr>
<td>预备执行用例数量</td>
<td>1</td>
</tr>
<tr>
<td>实际执用例行数量</td>
<td>1</td>
</tr>
<tr>
<td>通过</td>
<td>1</td>
</tr>
<tr>
<td>失败</td>
<td style="">0</td>
</tr>
<tr>
<td>异常</td>
<td style="">0</td>
</tr>
<tr>
<td>阻塞</td>
<td style="">0</td>
</tr>
<tr>
<td>套件初始化失败</td>
<td style="">0</td>
</tr>
<tr>
<td>套件清除 失败</td>
<td style="">0</td>
</tr>
<tr>
<td>用例初始化失败</td>
<td style="">0</td>
</tr>
<tr>
<td>用例清除 失败</td>
<td style="">0</td>
</tr>
</tbody>
</table>
<div class="result_barchart">
<div class="barchar_item">
<span>用例通过 100% : 1 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 100.0%; background-color: #04AA6D;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例失败 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #bb4069;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例异常 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #9c27b0;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例阻塞 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #dcbdbd;"></div>
</div>
</div>
</div>
</div>
<div style="margin-top:2em">
<h3 style="display:inline">执行日志</h3>
</div>
<div class="exec_log">
<div class="suite_dir" id="suite_dir cases\">
<div>
<span class="label">进入目录</span>
<span>cases\</span>
</div>
<div class="suite_setup setup" id="suite_setup setup cases\">
<div class="folder_header">
<span class="label">套件初始化</span>
<span>cases\</span>
<span class="executetime">2024-11-02 16:25:16</span>
</div>
<div class="folder_body">
<div class="info">'----------' 正在初始化浏览器 '----------'</div>
<div class="info">'----------' 正在处理SSL证书警告 '----------'</div>
<div class="info">'----------' SSL证书警告处理完成 '----------'</div>
</div>
</div>
</div>
<div class="suite_file" id="suite_file cases\设备管理\安卓信息上报.py">
<div>
<span class="label">进入文件</span>
<span>cases\设备管理\安卓信息上报.py</span>
</div>
<div class="case pass" id="case_00000001">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">设备上报_0001</span>
<span class="executetime">2024-11-02 16:25:23</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\设备管理\安卓信息上报.py::Android_000x</span>
<div class="test_steps" id="test_steps 设备上报_0001">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>连接MQTT</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>MQTT发送消息</span>
</div>
</div>
</div>
</div>
<div class="suite_teardown teardown" id="suite_teardown teardown cases\">
<div class="folder_header">
<span class="label">套件清除</span>
<span>cases\</span>
<span class="executetime">2024-11-02 16:25:45</span>
</div>
<div class="folder_body">
<div class="info">清除浏览器</div>
</div>
</div>
</div>
</div>
</div>
<div id="float_menu">
<div class="menu-item" onclick="document.querySelector(&quot;body&quot;).scrollIntoView()">页首</div>
<div class="menu-item" onclick="window.open(&quot;http://www.byhy.net/tut/auto/hytest/01&quot;, &quot;_blank&quot;); ">帮助</div>
<div class="menu-item" id="display_mode" onclick="toggle_folder_all_cases()">Summary</div>
<div class="error_jumper" display="none">
<div class="menu-item" onclick="previous_error()" title="上一个错误"></div>
<div class="menu-item" onclick="next_error()" title="下一个错误"></div>
</div>
</div>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title>测试报告</title>
<meta charset="UTF-8">
<style>body {
font-family: consolas, Verdana, sans-serif;
font-size: .95em;
color: #696e71;
display: grid;
grid-template-columns: 1fr 5rem;
}
.main_section {
width: 90%;
margin: 0 auto;
}
#float_menu{
position:fixed;
top:0;
right:0;
text-align: center;
}
#float_menu .menu-item {
cursor: pointer;
padding: .5em;
margin: .5em 0;
color: #c08580;
background-color: #f8f0ef;
font-size: 1.2em;
}
.result{
display: flex;
}
.result_table{
border-collapse: collapse;
border: 1px solid #f0e0e5;
width: 30em;
text-align: center;
font-size: 1.0em;
}
.result_table td{
border: 1px solid #f0e0e5;
padding: .3em;
}
.result_barchart{
width: 30em;
margin: 0 5em 0 5em;
}
.barchar_item{
margin: 2.5rem 0;
}
.barchart_barbox {
margin: 0.5em 0;
width: 100%;
background-color: #fff;
border: 1px solid #86c2dd;
border-radius: .2em;
}
.barchart_bar {
text-align: right;
height: 1.2rem;
}
.h3_button {
margin: 1.5em;
cursor: pointer;
color: #03a9f4;
}
.info
{
white-space:pre-wrap;
margin: .8em 1.5em;
}
.error-info
{
color: #a64747
}
.suite_dir {
margin: 1em .2em;
padding: .3em;
/* background-color: #dfeff6; */
border: 1px solid #bcd8e4;
}
.suite_file {
margin: 1em .2em;
padding: .3em;
border: 1px solid #bcd8e4;
}
.case {
margin: 1em .2em;
/* padding: .3em; */
border: 1px solid #e7d4d4;
}
.case_class_path{
margin: 0em 1em;
}
.folder_header {
padding: .2em .7em;
background-color: #fffaf9;
cursor: pointer;
}
.setup{
margin: .2em;
/* padding: .3em; */
/* border: 1px solid #e7d4d4; */
}
.teardown{
margin: .2em;
/* padding: .3em;*/
/* border: 1px solid #e7d4d4; */
}
.test_steps{
margin: .2em;
padding: .3em;
/* border: 1px solid #e7d4d4; */
}
.label {
display: inline-block;
padding: .1em .5em;
font-size: .88em;
letter-spacing: 1px;
white-space: nowrap;
color: #0d6ebc;
border-radius: .2em;
min-width: 5em;
margin-right: 2em;
font-family: consolas;
}
/* .suite_setup .label{
color: #219e26 ;
}
.suite_teardown .label{
color: #219e26;
} */
/* .case.pass .casename{
color: #329132 ;
} */
.case.pass .caselabel{
color: white;
background-color: #3b9e3f;
}
/* .case.fail .casename{
color: #a64747;
} */
.case.fail .caselabel{
color: white;
background-color: #a64747;
}
/* .case.abort .casename{
color: #953ab7;
} */
.case.abort .caselabel{
color: white;
background-color: #9c27b0;
}
.case_step {
margin: .8em;
}
.checkpoint_pass {
margin: .8em;
}
.checkpoint_fail {
margin: .8em;
}
.case_step .tag{
color: #2196f3;;
margin: .3em 1em .3em 0;
padding: .1em .3em;
font-size: .92em;
}
.checkpoint_pass .tag{
color: #009806;
margin:.3em 1em .3em .5em;
padding: .1em .3em;
font-size: .92em;
}
.checkpoint_fail .tag{
color: #9c2020;
margin:.3em 1em .3em .5em;
padding: .1em .3em;
font-size: .92em;
}
.screenshot {
border: 1px solid #86c2dd;
}
.executetime {
float: right;
}</style>
<script type="text/javascript">var FOLDER_ALL_CASES = false //是否为精简模式的标记
var ERROR_INFOS = []; // 错误信息列表
var current_error_idx = -1;
// 页面加载后执行的函数
window.addEventListener("load", function(){
// 所有 .folder_header 添加点击事件处理
let folderHeaderEles = document.querySelectorAll(".folder_header");
folderHeaderEles.forEach(function(ele) {
ele.addEventListener("click", function(event) {
let fb = event.target.closest('.folder_header').nextElementSibling;
fb.style.display = fb.style.display === 'none' ? 'block' : 'none'
});
});
// 找到所有的错误信息对象
ERROR_INFOS = document.querySelectorAll(".error-info");
});
function toggle_folder_all_cases(){
let eles = document.querySelectorAll(".folder_body");
FOLDER_ALL_CASES = !FOLDER_ALL_CASES;
document.getElementById('display_mode').innerHTML = FOLDER_ALL_CASES? "Detail" : "Summary"
for (const ele of eles){
ele.style.display = FOLDER_ALL_CASES? "none": "block"
}
}
function previous_error(){
// 查找错误必须是详细模式
if (FOLDER_ALL_CASES)
toggle_folder_all_cases()
current_error_idx -= 1;
if (current_error_idx<0)
current_error_idx = 0
let error = ERROR_INFOS[current_error_idx];
error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
}
function next_error(){
// 查找错误必须是详细模式
if (FOLDER_ALL_CASES)
toggle_folder_all_cases()
current_error_idx += 1;
if (current_error_idx > ERROR_INFOS.length-1)
current_error_idx = ERROR_INFOS.length-1
let error = ERROR_INFOS[current_error_idx];
error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
}</script>
</head>
<body>
<div class="main_section">
<h1 style="font-family: auto">测试报告</h1>
<h3>统计结果</h3>
<div class="result">
<table class="result_table">
<tbody>
<tr>
<td>hytest 版本</td>
<td>0.8.12</td>
</tr>
<tr>
<td>开始时间</td>
<td>2024/11/02 16:26:59</td>
</tr>
<tr>
<td>结束时间</td>
<td>2024/11/02 16:27:28</td>
</tr>
<tr>
<td>耗时</td>
<td>28.932 秒</td>
</tr>
<tr>
<td>预备执行用例数量</td>
<td>1</td>
</tr>
<tr>
<td>实际执用例行数量</td>
<td>1</td>
</tr>
<tr>
<td>通过</td>
<td>1</td>
</tr>
<tr>
<td>失败</td>
<td style="">0</td>
</tr>
<tr>
<td>异常</td>
<td style="">0</td>
</tr>
<tr>
<td>阻塞</td>
<td style="">0</td>
</tr>
<tr>
<td>套件初始化失败</td>
<td style="">0</td>
</tr>
<tr>
<td>套件清除 失败</td>
<td style="">0</td>
</tr>
<tr>
<td>用例初始化失败</td>
<td style="">0</td>
</tr>
<tr>
<td>用例清除 失败</td>
<td style="">0</td>
</tr>
</tbody>
</table>
<div class="result_barchart">
<div class="barchar_item">
<span>用例通过 100% : 1 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 100.0%; background-color: #04AA6D;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例失败 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #bb4069;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例异常 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #9c27b0;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例阻塞 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #dcbdbd;"></div>
</div>
</div>
</div>
</div>
<div style="margin-top:2em">
<h3 style="display:inline">执行日志</h3>
</div>
<div class="exec_log">
<div class="suite_dir" id="suite_dir cases\">
<div>
<span class="label">进入目录</span>
<span>cases\</span>
</div>
<div class="suite_setup setup" id="suite_setup setup cases\">
<div class="folder_header">
<span class="label">套件初始化</span>
<span>cases\</span>
<span class="executetime">2024-11-02 16:26:59</span>
</div>
<div class="folder_body">
<div class="info">'----------' 正在初始化浏览器 '----------'</div>
<div class="info">'----------' 正在处理SSL证书警告 '----------'</div>
<div class="info">'----------' SSL证书警告处理完成 '----------'</div>
</div>
</div>
</div>
<div class="suite_file" id="suite_file cases\设备管理\安卓信息上报.py">
<div>
<span class="label">进入文件</span>
<span>cases\设备管理\安卓信息上报.py</span>
</div>
<div class="case pass" id="case_00000001">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">设备上报_0001</span>
<span class="executetime">2024-11-02 16:27:04</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\设备管理\安卓信息上报.py::Android_000x</span>
<div class="test_steps" id="test_steps 设备上报_0001">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>连接MQTT</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>MQTT发送消息</span>
</div>
</div>
</div>
</div>
<div class="suite_teardown teardown" id="suite_teardown teardown cases\">
<div class="folder_header">
<span class="label">套件清除</span>
<span>cases\</span>
<span class="executetime">2024-11-02 16:27:26</span>
</div>
<div class="folder_body">
<div class="info">清除浏览器</div>
</div>
</div>
</div>
</div>
</div>
<div id="float_menu">
<div class="menu-item" onclick="document.querySelector(&quot;body&quot;).scrollIntoView()">页首</div>
<div class="menu-item" onclick="window.open(&quot;http://www.byhy.net/tut/auto/hytest/01&quot;, &quot;_blank&quot;); ">帮助</div>
<div class="menu-item" id="display_mode" onclick="toggle_folder_all_cases()">Summary</div>
<div class="error_jumper" display="none">
<div class="menu-item" onclick="previous_error()" title="上一个错误"></div>
<div class="menu-item" onclick="next_error()" title="下一个错误"></div>
</div>
</div>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title>测试报告</title>
<meta charset="UTF-8">
<style>body {
font-family: consolas, Verdana, sans-serif;
font-size: .95em;
color: #696e71;
display: grid;
grid-template-columns: 1fr 5rem;
}
.main_section {
width: 90%;
margin: 0 auto;
}
#float_menu{
position:fixed;
top:0;
right:0;
text-align: center;
}
#float_menu .menu-item {
cursor: pointer;
padding: .5em;
margin: .5em 0;
color: #c08580;
background-color: #f8f0ef;
font-size: 1.2em;
}
.result{
display: flex;
}
.result_table{
border-collapse: collapse;
border: 1px solid #f0e0e5;
width: 30em;
text-align: center;
font-size: 1.0em;
}
.result_table td{
border: 1px solid #f0e0e5;
padding: .3em;
}
.result_barchart{
width: 30em;
margin: 0 5em 0 5em;
}
.barchar_item{
margin: 2.5rem 0;
}
.barchart_barbox {
margin: 0.5em 0;
width: 100%;
background-color: #fff;
border: 1px solid #86c2dd;
border-radius: .2em;
}
.barchart_bar {
text-align: right;
height: 1.2rem;
}
.h3_button {
margin: 1.5em;
cursor: pointer;
color: #03a9f4;
}
.info
{
white-space:pre-wrap;
margin: .8em 1.5em;
}
.error-info
{
color: #a64747
}
.suite_dir {
margin: 1em .2em;
padding: .3em;
/* background-color: #dfeff6; */
border: 1px solid #bcd8e4;
}
.suite_file {
margin: 1em .2em;
padding: .3em;
border: 1px solid #bcd8e4;
}
.case {
margin: 1em .2em;
/* padding: .3em; */
border: 1px solid #e7d4d4;
}
.case_class_path{
margin: 0em 1em;
}
.folder_header {
padding: .2em .7em;
background-color: #fffaf9;
cursor: pointer;
}
.setup{
margin: .2em;
/* padding: .3em; */
/* border: 1px solid #e7d4d4; */
}
.teardown{
margin: .2em;
/* padding: .3em;*/
/* border: 1px solid #e7d4d4; */
}
.test_steps{
margin: .2em;
padding: .3em;
/* border: 1px solid #e7d4d4; */
}
.label {
display: inline-block;
padding: .1em .5em;
font-size: .88em;
letter-spacing: 1px;
white-space: nowrap;
color: #0d6ebc;
border-radius: .2em;
min-width: 5em;
margin-right: 2em;
font-family: consolas;
}
/* .suite_setup .label{
color: #219e26 ;
}
.suite_teardown .label{
color: #219e26;
} */
/* .case.pass .casename{
color: #329132 ;
} */
.case.pass .caselabel{
color: white;
background-color: #3b9e3f;
}
/* .case.fail .casename{
color: #a64747;
} */
.case.fail .caselabel{
color: white;
background-color: #a64747;
}
/* .case.abort .casename{
color: #953ab7;
} */
.case.abort .caselabel{
color: white;
background-color: #9c27b0;
}
.case_step {
margin: .8em;
}
.checkpoint_pass {
margin: .8em;
}
.checkpoint_fail {
margin: .8em;
}
.case_step .tag{
color: #2196f3;;
margin: .3em 1em .3em 0;
padding: .1em .3em;
font-size: .92em;
}
.checkpoint_pass .tag{
color: #009806;
margin:.3em 1em .3em .5em;
padding: .1em .3em;
font-size: .92em;
}
.checkpoint_fail .tag{
color: #9c2020;
margin:.3em 1em .3em .5em;
padding: .1em .3em;
font-size: .92em;
}
.screenshot {
border: 1px solid #86c2dd;
}
.executetime {
float: right;
}</style>
<script type="text/javascript">var FOLDER_ALL_CASES = false //是否为精简模式的标记
var ERROR_INFOS = []; // 错误信息列表
var current_error_idx = -1;
// 页面加载后执行的函数
window.addEventListener("load", function(){
// 所有 .folder_header 添加点击事件处理
let folderHeaderEles = document.querySelectorAll(".folder_header");
folderHeaderEles.forEach(function(ele) {
ele.addEventListener("click", function(event) {
let fb = event.target.closest('.folder_header').nextElementSibling;
fb.style.display = fb.style.display === 'none' ? 'block' : 'none'
});
});
// 找到所有的错误信息对象
ERROR_INFOS = document.querySelectorAll(".error-info");
});
function toggle_folder_all_cases(){
let eles = document.querySelectorAll(".folder_body");
FOLDER_ALL_CASES = !FOLDER_ALL_CASES;
document.getElementById('display_mode').innerHTML = FOLDER_ALL_CASES? "Detail" : "Summary"
for (const ele of eles){
ele.style.display = FOLDER_ALL_CASES? "none": "block"
}
}
function previous_error(){
// 查找错误必须是详细模式
if (FOLDER_ALL_CASES)
toggle_folder_all_cases()
current_error_idx -= 1;
if (current_error_idx<0)
current_error_idx = 0
let error = ERROR_INFOS[current_error_idx];
error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
}
function next_error(){
// 查找错误必须是详细模式
if (FOLDER_ALL_CASES)
toggle_folder_all_cases()
current_error_idx += 1;
if (current_error_idx > ERROR_INFOS.length-1)
current_error_idx = ERROR_INFOS.length-1
let error = ERROR_INFOS[current_error_idx];
error.scrollIntoView({behavior: "smooth", block: "center", inline: "start"});
}</script>
</head>
<body>
<div class="main_section">
<h1 style="font-family: auto">测试报告</h1>
<h3>统计结果</h3>
<div class="result">
<table class="result_table">
<tbody>
<tr>
<td>hytest 版本</td>
<td>0.8.12</td>
</tr>
<tr>
<td>开始时间</td>
<td>2024/11/02 16:29:43</td>
</tr>
<tr>
<td>结束时间</td>
<td>2024/11/02 16:30:13</td>
</tr>
<tr>
<td>耗时</td>
<td>30.483 秒</td>
</tr>
<tr>
<td>预备执行用例数量</td>
<td>1</td>
</tr>
<tr>
<td>实际执用例行数量</td>
<td>1</td>
</tr>
<tr>
<td>通过</td>
<td>1</td>
</tr>
<tr>
<td>失败</td>
<td style="">0</td>
</tr>
<tr>
<td>异常</td>
<td style="">0</td>
</tr>
<tr>
<td>阻塞</td>
<td style="">0</td>
</tr>
<tr>
<td>套件初始化失败</td>
<td style="">0</td>
</tr>
<tr>
<td>套件清除 失败</td>
<td style="">0</td>
</tr>
<tr>
<td>用例初始化失败</td>
<td style="">0</td>
</tr>
<tr>
<td>用例清除 失败</td>
<td style="">0</td>
</tr>
</tbody>
</table>
<div class="result_barchart">
<div class="barchar_item">
<span>用例通过 100% : 1 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 100.0%; background-color: #04AA6D;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例失败 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #bb4069;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例异常 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #9c27b0;"></div>
</div>
</div>
<div class="barchar_item">
<span>用例阻塞 0% : 0 个</span>
<div class="barchart_barbox">
<div class="barchart_bar" style="width: 0.0%; background-color: #dcbdbd;"></div>
</div>
</div>
</div>
</div>
<div style="margin-top:2em">
<h3 style="display:inline">执行日志</h3>
</div>
<div class="exec_log">
<div class="suite_dir" id="suite_dir cases\">
<div>
<span class="label">进入目录</span>
<span>cases\</span>
</div>
<div class="suite_setup setup" id="suite_setup setup cases\">
<div class="folder_header">
<span class="label">套件初始化</span>
<span>cases\</span>
<span class="executetime">2024-11-02 16:29:43</span>
</div>
<div class="folder_body">
<div class="info">'----------' 正在初始化浏览器 '----------'</div>
<div class="info">'----------' 正在处理SSL证书警告 '----------'</div>
<div class="info">'----------' SSL证书警告处理完成 '----------'</div>
</div>
</div>
</div>
<div class="suite_file" id="suite_file cases\设备管理\安卓信息上报.py">
<div>
<span class="label">进入文件</span>
<span>cases\设备管理\安卓信息上报.py</span>
</div>
<div class="case pass" id="case_00000001">
<div class="folder_header">
<span class="label caselabel">用例 PASS</span>
<span class="casename">设备上报_0001</span>
<span class="executetime">2024-11-02 16:29:49</span>
</div>
<div class="folder_body">
<span class="case_class_path">cases\设备管理\安卓信息上报.py::Android_000x</span>
<div class="test_steps" id="test_steps 设备上报_0001">
<span class="label">测试步骤</span>
<div class="case_step">
<span class="tag">步骤 #1</span>
<span>连接MQTT</span>
</div>
<div class="case_step">
<span class="tag">步骤 #2</span>
<span>MQTT发送消息</span>
</div>
</div>
</div>
</div>
<div class="suite_teardown teardown" id="suite_teardown teardown cases\">
<div class="folder_header">
<span class="label">套件清除</span>
<span>cases\</span>
<span class="executetime">2024-11-02 16:30:11</span>
</div>
<div class="folder_body">
<div class="info">清除浏览器</div>
</div>
</div>
</div>
</div>
</div>
<div id="float_menu">
<div class="menu-item" onclick="document.querySelector(&quot;body&quot;).scrollIntoView()">页首</div>
<div class="menu-item" onclick="window.open(&quot;http://www.byhy.net/tut/auto/hytest/01&quot;, &quot;_blank&quot;); ">帮助</div>
<div class="menu-item" id="display_mode" onclick="toggle_folder_all_cases()">Summary</div>
<div class="error_jumper" display="none">
<div class="menu-item" onclick="previous_error()" title="上一个错误"></div>
<div class="menu-item" onclick="next_error()" title="下一个错误"></div>
</div>
</div>
</body>
</html>
\ No newline at end of file
...@@ -6,39 +6,14 @@ ...@@ -6,39 +6,14 @@
== cases\__st__.py == cases\__st__.py
== cases\__init__.py
** no cases in this file, skip it.
== cases\会议室管理\__init__.py
** no cases in this file, skip it.
== cases\授权码管理\__init__.py
** no cases in this file, skip it.
== cases\登录模块\__init__.py
** no cases in this file, skip it.
== cases\登录模块\账号密码登录测试.py == cases\登录模块\账号密码登录测试.py
== cases\设备管理\__init__.py ** no cases in this file , skip it.
** no cases in this file, skip it.
== cases\设备管理\安卓信息上报.py == cases\设备管理\安卓信息上报.py
** no cases in this file, skip it.
== cases\设备管理\毫米波雷达上报.py == cases\设备管理\毫米波雷达上报.py
...@@ -47,12 +22,7 @@ ...@@ -47,12 +22,7 @@
== cases\账号管理\__st__.py == cases\账号管理\__st__.py
== cases\账号管理\__init__.py == cases\账号管理\用户管理.py
** no cases in this file, skip it.
== cases\账号管理\部门管理.py
** no cases in this file, skip it. ** no cases in this file, skip it.
...@@ -60,11 +30,11 @@ ...@@ -60,11 +30,11 @@
=== [ 执行测试用例 ] === === [ 执行测试用例 ] ===
预备执行用例数量 : 10 预备执行用例数量 : 1
========= 测试开始 : 20241102_135632 ========= ========= 测试开始 : 20241102_162943 =========
...@@ -76,285 +46,36 @@ ...@@ -76,285 +46,36 @@
'----------' SSL证书警告处理完成 '----------' '----------' SSL证书警告处理完成 '----------'
>>> cases\登录模块\账号密码登录测试.py >>> cases\设备管理\安卓信息上报.py
* 登录 UI_0001 - 2024-11-02 13:56:39
[ case execution steps ]
-- 第 1 步 -- 输入账号: None, 密码: Ubains@4321, 验证码: csba
-- 第 2 步 -- 点击登录按钮
Alert text: 请输入账号!
-- 第 3 步 -- 校验提示信息: 请输入账号!
** 检查点 ** 弹出提示 ----> 通过
PASS
[ case teardown ] 登录 UI_0001
-- 第 4 步 -- 刷新页面
* 登录 UI_0002 - 2024-11-02 13:56:40
[ case execution steps ]
-- 第 1 步 -- 输入账号: admin@czj, 密码: None, 验证码: csba
-- 第 2 步 -- 点击登录按钮
Alert text: 请输入密码!
-- 第 3 步 -- 校验提示信息: 请输入密码!
** 检查点 ** 弹出提示 ----> 通过
PASS
[ case teardown ] 登录 UI_0002
-- 第 4 步 -- 刷新页面
* 登录 UI_0003 - 2024-11-02 13:56:41
[ case execution steps ]
-- 第 1 步 -- 输入账号: admin@czj, 密码: Ubains@4321, 验证码: None
-- 第 2 步 -- 点击登录按钮
Alert text: 请输入验证码!
-- 第 3 步 -- 校验提示信息: 请输入验证码!
** 检查点 ** 弹出提示 ----> 通过
PASS
[ case teardown ] 登录 UI_0003
-- 第 4 步 -- 刷新页面
* 登录 UI_0004 - 2024-11-02 13:56:43
[ case execution steps ]
-- 第 1 步 -- 输入账号: admin@czj112, 密码: Ubains@4321, 验证码: csba
-- 第 2 步 -- 点击登录按钮
Alert text: 账号或密码错误
-- 第 3 步 -- 校验提示信息: 账号或密码错误
** 检查点 ** 弹出提示 ----> 通过
PASS
[ case teardown ] 登录 UI_0004
-- 第 4 步 -- 刷新页面
* 设备上报_0001 - 2024-11-02 16:29:49
* 登录 UI_0005 - 2024-11-02 13:56:44
[ case execution steps ]
-- 第 1 步 -- 输入账号: adM 12in@czj, 密码: Ubains@4321, 验证码: csba
-- 第 2 步 -- 点击登录按钮
Alert text: 账号或密码错误
-- 第 3 步 -- 校验提示信息: 账号或密码错误
** 检查点 ** 弹出提示 ----> 通过
PASS
[ case teardown ] 登录 UI_0005
-- 第 4 步 -- 刷新页面
* 登录 UI_0006 - 2024-11-02 13:56:45
[ case execution steps ]
-- 第 1 步 -- 输入账号: admin@czj, 密码: 12345, 验证码: csba
-- 第 2 步 -- 点击登录按钮
Alert text: 账号或密码错误
-- 第 3 步 -- 校验提示信息: 账号或密码错误
** 检查点 ** 弹出提示 ----> 通过
PASS
[ case teardown ] 登录 UI_0006
-- 第 4 步 -- 刷新页面
* 登录 UI_0007 - 2024-11-02 13:56:47
[ case execution steps ]
-- 第 1 步 -- 输入账号: admin@czj, 密码: U bains1s@432, 验证码: csba
-- 第 2 步 -- 点击登录按钮
Alert text: 账号或密码错误
-- 第 3 步 -- 校验提示信息: 账号或密码错误
** 检查点 ** 弹出提示 ----> 通过
PASS
[ case teardown ] 登录 UI_0007
-- 第 4 步 -- 刷新页面
* 登录 UI_0008 - 2024-11-02 13:56:48
[ case execution steps ] [ case execution steps ]
-- 第 1 步 -- 输入账号: admin@czj, 密码: Ubains@4321, 验证码: 123 -- 第 1 步 -- 连接MQTT
-- 第 2 步 -- 点击登录按钮
Alert text: 验证码错误
-- 第 3 步 -- 校验提示信息: 验证码错误
** 检查点 ** 弹出提示 ----> 通过
PASS
[ case teardown ] 登录 UI_0008
-- 第 4 步 -- 刷新页面
* 登录 UI_0009 - 2024-11-02 13:56:50
[ case execution steps ]
-- 第 1 步 -- 输入账号: admin@czj, 密码: Ubains@4321, 验证码: cs 12
-- 第 2 步 -- 点击登录按钮
Alert text: 验证码错误
-- 第 3 步 -- 校验提示信息: 验证码错误 -- 第 2 步 -- MQTT发送消息
** 检查点 ** 弹出提示 ----> 通过
PASS PASS
[ case teardown ] 登录 UI_0009
-- 第 4 步 -- 刷新页面
* 登录 UI_0010 - 2024-11-02 13:56:51
[ case execution steps ]
-- 第 1 步 -- 输入账号: admin@czj, 密码: Ubains@4321, 验证码: csba
-- 第 2 步 -- 点击登录按钮
Exception occurred: Message:
Stacktrace:
GetHandleVerifier [0x00007FF63C4DFD55+29557]
(No symbol) [0x00007FF63C4521F0]
(No symbol) [0x00007FF63C30B6EA]
(No symbol) [0x00007FF63C35FA15]
(No symbol) [0x00007FF63C35FC6C]
(No symbol) [0x00007FF63C3ABB07]
(No symbol) [0x00007FF63C38753F]
(No symbol) [0x00007FF63C3A88A3]
(No symbol) [0x00007FF63C3872A3]
(No symbol) [0x00007FF63C3512DF]
(No symbol) [0x00007FF63C352451]
GetHandleVerifier [0x00007FF63C80DC4D+3363437]
GetHandleVerifier [0x00007FF63C859AD7+3674359]
GetHandleVerifier [0x00007FF63C84EA7B+3629211]
GetHandleVerifier [0x00007FF63C59FC16+815670]
(No symbol) [0x00007FF63C45D69F]
(No symbol) [0x00007FF63C459264]
(No symbol) [0x00007FF63C459400]
(No symbol) [0x00007FF63C4481AF]
BaseThreadInitThunk [0x00007FFD832E257D+29]
RtlUserThreadStart [0x00007FFD83FCAF08+40]
-- 第 3 步 -- 校验提示信息: 欢迎 预定标准版测试
** 检查点 ** 弹出提示 ----> !! 不通过!!
FAIL
Traceback:
File "D:\GithubData\自动化脚本-3\ubains-module-test\预定系统\cases\登录模块\账号密码登录测试.py", line 167, in teststeps
CHECK_POINT('弹出提示', notify_text == check_text)
File "D:\GithubData\ubains-module-test\ubains-module-test\.venv\lib\site-packages\hytest\common.py", line 76, in CHECK_POINT
raise AssertionError()
AssertionError
[ case teardown ] 登录 UI_0010
-- 第 4 步 -- 刷新页面
[ suite teardown ] cases\ [ suite teardown ] cases\
清除浏览器 清除浏览器
========= 测试结束 : 20241102_135705 ========= ========= 测试结束 : 20241102_163013 =========
耗时 : 33.340 耗时 : 30.483
预备执行用例数量 : 10 预备执行用例数量 : 1
实际执行用例数量 : 10 实际执行用例数量 : 1
通过 : 9 通过 : 1
失败 : 1 失败 : 0
异常 : 0 异常 : 0
......
...@@ -6,33 +6,83 @@ ...@@ -6,33 +6,83 @@
== cases\__st__.py == cases\__st__.py
== cases\__init__.py == cases\登录模块\账号密码登录测试.py
** no cases in this file, skip it. ** no cases in this file , skip it.
== cases\设备管理\安卓信息上报.py
== cases\会议室管理\__init__.py == cases\设备管理\毫米波雷达上报.py
** no cases in this file, skip it. ** no cases in this file, skip it.
== cases\授权码管理\__init__.py == cases\账号管理\__st__.py
== cases\账号管理\用户管理.py
** no cases in this file, skip it. ** no cases in this file, skip it.
== cases\登录模块\__init__.py
=== [ 执行测试用例 ] ===
** no cases in this file, skip it. 预备执行用例数量 : 1
== cases\登录模块\账号密码登录测试.py
== cases\设备管理\__init__.py ========= 测试开始 : 20241102_162659 =========
** no cases in this file, skip it.
== cases\设备管理\安卓信息上报.py >>> cases\
[ suite setup ] cases\
'----------' 正在初始化浏览器 '----------'
'----------' 正在处理SSL证书警告 '----------'
'----------' SSL证书警告处理完成 '----------'
>>> cases\设备管理\安卓信息上报.py
* 设备上报_0001 - 2024-11-02 16:27:04
[ case execution steps ]
-- 第 1 步 -- 连接MQTT
-- 第 2 步 -- MQTT发送消息
PASS
[ suite teardown ] cases\
清除浏览器
========= 测试结束 : 20241102_162728 =========
耗时 : 28.932 秒
预备执行用例数量 : 1
实际执行用例数量 : 1
通过 : 1
失败 : 0
异常 : 0
套件初始化失败 : 0
套件清除 失败 : 0
用例初始化失败 : 0
用例清除 失败 : 0
...@@ -6,33 +6,83 @@ ...@@ -6,33 +6,83 @@
== cases\__st__.py == cases\__st__.py
== cases\__init__.py == cases\登录模块\账号密码登录测试.py
** no cases in this file, skip it. ** no cases in this file , skip it.
== cases\设备管理\安卓信息上报.py
== cases\会议室管理\__init__.py == cases\设备管理\毫米波雷达上报.py
** no cases in this file, skip it. ** no cases in this file, skip it.
== cases\授权码管理\__init__.py == cases\账号管理\__st__.py
== cases\账号管理\用户管理.py
** no cases in this file, skip it. ** no cases in this file, skip it.
== cases\登录模块\__init__.py
=== [ 执行测试用例 ] ===
** no cases in this file, skip it. 预备执行用例数量 : 1
== cases\登录模块\账号密码登录测试.py
== cases\设备管理\__init__.py ========= 测试开始 : 20241102_162516 =========
** no cases in this file, skip it.
== cases\设备管理\安卓信息上报.py >>> cases\
[ suite setup ] cases\
'----------' 正在初始化浏览器 '----------'
'----------' 正在处理SSL证书警告 '----------'
'----------' SSL证书警告处理完成 '----------'
>>> cases\设备管理\安卓信息上报.py
* 设备上报_0001 - 2024-11-02 16:25:23
[ case execution steps ]
-- 第 1 步 -- 连接MQTT
-- 第 2 步 -- MQTT发送消息
PASS
[ suite teardown ] cases\
清除浏览器
========= 测试结束 : 20241102_162547 =========
耗时 : 30.667 秒
预备执行用例数量 : 1
实际执行用例数量 : 1
通过 : 1
失败 : 0
异常 : 0
套件初始化失败 : 0
套件清除 失败 : 0
用例初始化失败 : 0
用例清除 失败 : 0
topic,clientId,appToken,companyNumber,cnum,conferenceId,macAddress,authCode,clientId,deviceId name,topic,clientId,appToken,companyNumber,cnum,conferenceId,macAddress,authCode
rebootResponseTopic,48134e6047a19a01,AND-2CT-0101,CN-2CT-UBAINS,4b521415d42650a0da515114aa36ab88,220,20:59:20:00:28:01,AND-2CT-0101,, 设备上报_0001,rebootResponseTopic,48134e6047a19a01,AND-2CT-0101,CN-2CT-UBAINS,4b521415d42650a0da515114aa36ab88,220,20:59:20:00:28:01,AND-2CT-0101
rebootResponseTopic,48134e6047a19a02,AND-2CT-0102,CN-2CT-UBAINS,6828f107eddcd6c80537e554f1ba6393,221,20:59:20:00:28:02,AND-2CT-0102,, 设备上报_0002,rebootResponseTopic,48134e6047a19a02,AND-2CT-0102,CN-2CT-UBAINS,6828f107eddcd6c80537e554f1ba6393,221,20:59:20:00:28:02,AND-2CT-0102
rebootResponseTopic,48134e6047a19a03,AND-2CT-0103,CN-2CT-UBAINS,694eba1b6f1995d4f7c085c77788ca68,222,20:59:20:00:28:03,AND-2CT-0103,, 设备上报_0003,rebootResponseTopic,48134e6047a19a03,AND-2CT-0103,CN-2CT-UBAINS,694eba1b6f1995d4f7c085c77788ca68,222,20:59:20:00:28:03,AND-2CT-0103
rebootResponseTopic,48134e6047a19a04,AND-2CT-0104,CN-2CT-UBAINS,acab665450c5bb91e11881e749934b63,223,20:59:20:00:28:04,AND-2CT-0104,, 设备上报_0004,rebootResponseTopic,48134e6047a19a04,AND-2CT-0104,CN-2CT-UBAINS,acab665450c5bb91e11881e749934b63,223,20:59:20:00:28:04,AND-2CT-0104
rebootResponseTopic,48134e6047a19a05,AND-2CT-0105,CN-2CT-UBAINS,842380cf2573785aa3e74f61c3921e1b,224,20:59:20:00:28:05,AND-2CT-0105,, 设备上报_0005,rebootResponseTopic,48134e6047a19a05,AND-2CT-0105,CN-2CT-UBAINS,842380cf2573785aa3e74f61c3921e1b,224,20:59:20:00:28:05,AND-2CT-0105
rebootResponseTopic,48134e6047a19a06,AND-2CT-0106,CN-2CT-UBAINS,4c02ca0fc3f0947ab2658b6d6b98bbfc,225,20:59:20:00:28:06,AND-2CT-0106,, 设备上报_0006,rebootResponseTopic,48134e6047a19a06,AND-2CT-0106,CN-2CT-UBAINS,4c02ca0fc3f0947ab2658b6d6b98bbfc,225,20:59:20:00:28:06,AND-2CT-0106
rebootResponseTopic,48134e6047a19a07,AND-2CT-0107,CN-2CT-UBAINS,24d712de79b9907304874c1ab158cbab,226,20:59:20:00:28:07,AND-2CT-0107,, 设备上报_0007,rebootResponseTopic,48134e6047a19a07,AND-2CT-0107,CN-2CT-UBAINS,24d712de79b9907304874c1ab158cbab,226,20:59:20:00:28:07,AND-2CT-0107
rebootResponseTopic,48134e6047a19a08,AND-2CT-0108,CN-2CT-UBAINS,ef89042cce57dab36475a32f86d515b1,227,20:59:20:00:28:08,AND-2CT-0108,, 设备上报_0008,rebootResponseTopic,48134e6047a19a08,AND-2CT-0108,CN-2CT-UBAINS,ef89042cce57dab36475a32f86d515b1,227,20:59:20:00:28:08,AND-2CT-0108
rebootResponseTopic,48134e6047a19a09,AND-2CT-0109,CN-2CT-UBAINS,278b2caed091574f88673c784e2e3c70,228,20:59:20:00:28:09,AND-2CT-0109,, 设备上报_0009,rebootResponseTopic,48134e6047a19a09,AND-2CT-0109,CN-2CT-UBAINS,278b2caed091574f88673c784e2e3c70,228,20:59:20:00:28:09,AND-2CT-0109
rebootResponseTopic,48134e6047a19a10,AND-2CT-0110,CN-2CT-UBAINS,d1f392aaa472a42399a2e071298ffca8,229,20:59:20:00:28:10,AND-2CT-0110,, 设备上报_0010,rebootResponseTopic,48134e6047a19a10,AND-2CT-0110,CN-2CT-UBAINS,d1f392aaa472a42399a2e071298ffca8,229,20:59:20:00:28:10,AND-2CT-0110
rebootResponseTopic,48134e6047a19a11,AND-2CT-0111,CN-2CT-UBAINS,67ff1af148c6c09ee380a2160b14dd47,230,20:59:20:00:28:11,AND-2CT-0111,, 设备上报_0011,rebootResponseTopic,48134e6047a19a11,AND-2CT-0111,CN-2CT-UBAINS,67ff1af148c6c09ee380a2160b14dd47,230,20:59:20:00:28:11,AND-2CT-0111
rebootResponseTopic,48134e6047a19a12,AND-2CT-0112,CN-2CT-UBAINS,c80b3f6669bae8acce37f4902a0243b8,231,20:59:20:00:28:12,AND-2CT-0112,, 设备上报_0012,rebootResponseTopic,48134e6047a19a12,AND-2CT-0112,CN-2CT-UBAINS,c80b3f6669bae8acce37f4902a0243b8,231,20:59:20:00:28:12,AND-2CT-0112
rebootResponseTopic,48134e6047a19a13,AND-2CT-0113,CN-2CT-UBAINS,0b94554e203736514af9de41d68b5f37,232,20:59:20:00:28:13,AND-2CT-0113,, 设备上报_0013,rebootResponseTopic,48134e6047a19a13,AND-2CT-0113,CN-2CT-UBAINS,0b94554e203736514af9de41d68b5f37,232,20:59:20:00:28:13,AND-2CT-0113
rebootResponseTopic,48134e6047a19a14,AND-2CT-0114,CN-2CT-UBAINS,dc7c8d24f0e2b5e545223199dc76818b,233,20:59:20:00:28:14,AND-2CT-0114,, 设备上报_0014,rebootResponseTopic,48134e6047a19a14,AND-2CT-0114,CN-2CT-UBAINS,dc7c8d24f0e2b5e545223199dc76818b,233,20:59:20:00:28:14,AND-2CT-0114
rebootResponseTopic,48134e6047a19a15,AND-2CT-0115,CN-2CT-UBAINS,0a5846605b9d3b99a6623b8230870a5b,234,20:59:20:00:28:15,AND-2CT-0115,, 设备上报_0015,rebootResponseTopic,48134e6047a19a15,AND-2CT-0115,CN-2CT-UBAINS,0a5846605b9d3b99a6623b8230870a5b,234,20:59:20:00:28:15,AND-2CT-0115
rebootResponseTopic,48134e6047a19a16,AND-2CT-0116,CN-2CT-UBAINS,5b5801447c15748408fa4ca6e2277f5a,235,20:59:20:00:28:16,AND-2CT-0116,, 设备上报_0016,rebootResponseTopic,48134e6047a19a16,AND-2CT-0116,CN-2CT-UBAINS,5b5801447c15748408fa4ca6e2277f5a,235,20:59:20:00:28:16,AND-2CT-0116
rebootResponseTopic,48134e6047a19a17,AND-2CT-0117,CN-2CT-UBAINS,968c3946b598c7bb6419ac496c2000f4,236,20:59:20:00:28:17,AND-2CT-0117,, 设备上报_0017,rebootResponseTopic,48134e6047a19a17,AND-2CT-0117,CN-2CT-UBAINS,968c3946b598c7bb6419ac496c2000f4,236,20:59:20:00:28:17,AND-2CT-0117
rebootResponseTopic,48134e6047a19a18,AND-2CT-0118,CN-2CT-UBAINS,24437bdc20f50f62d353e432899e6c87,237,20:59:20:00:28:18,AND-2CT-0118,, 设备上报_0018,rebootResponseTopic,48134e6047a19a18,AND-2CT-0118,CN-2CT-UBAINS,24437bdc20f50f62d353e432899e6c87,237,20:59:20:00:28:18,AND-2CT-0118
rebootResponseTopic,48134e6047a19a19,AND-2CT-0119,CN-2CT-UBAINS,5409a552f9c917b486d48df5912da1de,238,20:59:20:00:28:19,AND-2CT-0119,, 设备上报_0019,rebootResponseTopic,48134e6047a19a19,AND-2CT-0119,CN-2CT-UBAINS,5409a552f9c917b486d48df5912da1de,238,20:59:20:00:28:19,AND-2CT-0119
rebootResponseTopic,48134e6047a19a20,AND-2CT-0120,CN-2CT-UBAINS,9c6e5bdce14c3af47d6427e69a70a680,239,20:59:20:00:28:20,AND-2CT-0120,, 设备上报_0020,rebootResponseTopic,48134e6047a19a20,AND-2CT-0120,CN-2CT-UBAINS,9c6e5bdce14c3af47d6427e69a70a680,239,20:59:20:00:28:20,AND-2CT-0120
rebootResponseTopic,48134e6047a19a21,AND-2CT-0121,CN-2CT-UBAINS,5d3637f9a2137ca91fae4cfa9eb14161,240,20:59:20:00:28:21,AND-2CT-0121,, 设备上报_0021,rebootResponseTopic,48134e6047a19a21,AND-2CT-0121,CN-2CT-UBAINS,5d3637f9a2137ca91fae4cfa9eb14161,240,20:59:20:00:28:21,AND-2CT-0121
rebootResponseTopic,48134e6047a19a22,AND-2CT-0122,CN-2CT-UBAINS,4c8f155cacbeaeae83c6599fc119f731,241,20:59:20:00:28:22,AND-2CT-0122,, 设备上报_0022,rebootResponseTopic,48134e6047a19a22,AND-2CT-0122,CN-2CT-UBAINS,4c8f155cacbeaeae83c6599fc119f731,241,20:59:20:00:28:22,AND-2CT-0122
rebootResponseTopic,48134e6047a19a23,AND-2CT-0123,CN-2CT-UBAINS,a1c1e33712c298ff68b1bea640d03027,242,20:59:20:00:28:23,AND-2CT-0123,, 设备上报_0023,rebootResponseTopic,48134e6047a19a23,AND-2CT-0123,CN-2CT-UBAINS,a1c1e33712c298ff68b1bea640d03027,242,20:59:20:00:28:23,AND-2CT-0123
rebootResponseTopic,48134e6047a19a24,AND-2CT-0124,CN-2CT-UBAINS,1e0f1843056a1c4a45a80b7edad52f04,243,20:59:20:00:28:24,AND-2CT-0124,, 设备上报_0024,rebootResponseTopic,48134e6047a19a24,AND-2CT-0124,CN-2CT-UBAINS,1e0f1843056a1c4a45a80b7edad52f04,243,20:59:20:00:28:24,AND-2CT-0124
rebootResponseTopic,48134e6047a19a25,AND-2CT-0125,CN-2CT-UBAINS,a4b52db6122128240c922b3ee9b4abed,244,20:59:20:00:28:25,AND-2CT-0125,, 设备上报_0025,rebootResponseTopic,48134e6047a19a25,AND-2CT-0125,CN-2CT-UBAINS,a4b52db6122128240c922b3ee9b4abed,244,20:59:20:00:28:25,AND-2CT-0125
rebootResponseTopic,48134e6047a19a26,AND-2CT-0126,CN-2CT-UBAINS,f1b2d3698a082def3c7253ab0204e2e8,245,20:59:20:00:28:26,AND-2CT-0126,, 设备上报_0026,rebootResponseTopic,48134e6047a19a26,AND-2CT-0126,CN-2CT-UBAINS,f1b2d3698a082def3c7253ab0204e2e8,245,20:59:20:00:28:26,AND-2CT-0126
rebootResponseTopic,48134e6047a19a27,AND-2CT-0127,CN-2CT-UBAINS,fbbd92eb329781f78d5a3cc0f077b0d0,246,20:59:20:00:28:27,AND-2CT-0127,, 设备上报_0027,rebootResponseTopic,48134e6047a19a27,AND-2CT-0127,CN-2CT-UBAINS,fbbd92eb329781f78d5a3cc0f077b0d0,246,20:59:20:00:28:27,AND-2CT-0127
rebootResponseTopic,48134e6047a19a28,AND-2CT-0128,CN-2CT-UBAINS,b5c4ec7f5febbe786775b6a4e69b0d13,247,20:59:20:00:28:28,AND-2CT-0128,, 设备上报_0028,rebootResponseTopic,48134e6047a19a28,AND-2CT-0128,CN-2CT-UBAINS,b5c4ec7f5febbe786775b6a4e69b0d13,247,20:59:20:00:28:28,AND-2CT-0128
rebootResponseTopic,48134e6047a19a29,AND-2CT-0129,CN-2CT-UBAINS,35dc71aa75e70725cb239052a2f17c36,248,20:59:20:00:28:29,AND-2CT-0129,, 设备上报_0029,rebootResponseTopic,48134e6047a19a29,AND-2CT-0129,CN-2CT-UBAINS,35dc71aa75e70725cb239052a2f17c36,248,20:59:20:00:28:29,AND-2CT-0129
rebootResponseTopic,48134e6047a19a30,AND-2CT-0130,CN-2CT-UBAINS,63fdb9a82a270e58f5e3bb7b64da43d9,249,20:59:20:00:28:30,AND-2CT-0130,, 设备上报_0030,rebootResponseTopic,48134e6047a19a30,AND-2CT-0130,CN-2CT-UBAINS,63fdb9a82a270e58f5e3bb7b64da43d9,249,20:59:20:00:28:30,AND-2CT-0130
/uams/android/broadcast,,,,,,,,48134e6047a19a01,aa44e258a4e1e001 \ No newline at end of file
/uams/android/broadcast,,,,,,,,48134e6047a19a02,aa44e258a4e1e002
/uams/android/broadcast,,,,,,,,48134e6047a19a03,aa44e258a4e1e003
/uams/android/broadcast,,,,,,,,48134e6047a19a04,aa44e258a4e1e004
/uams/android/broadcast,,,,,,,,48134e6047a19a05,aa44e258a4e1e005
/uams/android/broadcast,,,,,,,,48134e6047a19a06,aa44e258a4e1e006
/uams/android/broadcast,,,,,,,,48134e6047a19a07,aa44e258a4e1e007
/uams/android/broadcast,,,,,,,,48134e6047a19a08,aa44e258a4e1e008
/uams/android/broadcast,,,,,,,,48134e6047a19a09,aa44e258a4e1e009
/uams/android/broadcast,,,,,,,,48134e6047a19a10,aa44e258a4e1e010
/uams/android/broadcast,,,,,,,,48134e6047a19a11,aa44e258a4e1e011
/uams/android/broadcast,,,,,,,,48134e6047a19a12,aa44e258a4e1e012
/uams/android/broadcast,,,,,,,,48134e6047a19a13,aa44e258a4e1e013
/uams/android/broadcast,,,,,,,,48134e6047a19a14,aa44e258a4e1e014
/uams/android/broadcast,,,,,,,,48134e6047a19a15,aa44e258a4e1e015
/uams/android/broadcast,,,,,,,,48134e6047a19a16,aa44e258a4e1e016
/uams/android/broadcast,,,,,,,,48134e6047a19a17,aa44e258a4e1e017
/uams/android/broadcast,,,,,,,,48134e6047a19a18,aa44e258a4e1e018
/uams/android/broadcast,,,,,,,,48134e6047a19a19,aa44e258a4e1e019
/uams/android/broadcast,,,,,,,,48134e6047a19a20,aa44e258a4e1e020
/uams/android/broadcast,,,,,,,,48134e6047a19a21,aa44e258a4e1e021
/uams/android/broadcast,,,,,,,,48134e6047a19a22,aa44e258a4e1e022
/uams/android/broadcast,,,,,,,,48134e6047a19a23,aa44e258a4e1e023
/uams/android/broadcast,,,,,,,,48134e6047a19a24,aa44e258a4e1e024
/uams/android/broadcast,,,,,,,,48134e6047a19a25,aa44e258a4e1e025
/uams/android/broadcast,,,,,,,,48134e6047a19a26,aa44e258a4e1e026
/uams/android/broadcast,,,,,,,,48134e6047a19a27,aa44e258a4e1e027
/uams/android/broadcast,,,,,,,,48134e6047a19a28,aa44e258a4e1e028
/uams/android/broadcast,,,,,,,,48134e6047a19a29,aa44e258a4e1e029
/uams/android/broadcast,,,,,,,,48134e6047a19a30,aa44e258a4e1e031
topic,clientId,appToken,companyNumber,cnum,conferenceId,macAddress,authCode
rebootResponseTopic,48134e6047a19a01,AND-2CT-0101,CN-2CT-UBAINS,4b521415d42650a0da515114aa36ab88,220,20:59:20:00:28:01,AND-2CT-0101
rebootResponseTopic,48134e6047a19a02,AND-2CT-0102,CN-2CT-UBAINS,6828f107eddcd6c80537e554f1ba6393,221,20:59:20:00:28:02,AND-2CT-0102
rebootResponseTopic,48134e6047a19a03,AND-2CT-0103,CN-2CT-UBAINS,694eba1b6f1995d4f7c085c77788ca68,222,20:59:20:00:28:03,AND-2CT-0103
rebootResponseTopic,48134e6047a19a04,AND-2CT-0104,CN-2CT-UBAINS,acab665450c5bb91e11881e749934b63,223,20:59:20:00:28:04,AND-2CT-0104
rebootResponseTopic,48134e6047a19a05,AND-2CT-0105,CN-2CT-UBAINS,842380cf2573785aa3e74f61c3921e1b,224,20:59:20:00:28:05,AND-2CT-0105
rebootResponseTopic,48134e6047a19a06,AND-2CT-0106,CN-2CT-UBAINS,4c02ca0fc3f0947ab2658b6d6b98bbfc,225,20:59:20:00:28:06,AND-2CT-0106
rebootResponseTopic,48134e6047a19a07,AND-2CT-0107,CN-2CT-UBAINS,24d712de79b9907304874c1ab158cbab,226,20:59:20:00:28:07,AND-2CT-0107
rebootResponseTopic,48134e6047a19a08,AND-2CT-0108,CN-2CT-UBAINS,ef89042cce57dab36475a32f86d515b1,227,20:59:20:00:28:08,AND-2CT-0108
\ No newline at end of file
name,clientId,deviceId
心跳上报_0001,/uams/android/broadcast,48134e6047a19a01,aa44e258a4e1e001
心跳上报_0002,/uams/android/broadcast,48134e6047a19a02,aa44e258a4e1e002
心跳上报_0003,/uams/android/broadcast,48134e6047a19a03,aa44e258a4e1e003
心跳上报_0004,/uams/android/broadcast,48134e6047a19a04,aa44e258a4e1e004
心跳上报_0005,/uams/android/broadcast,48134e6047a19a05,aa44e258a4e1e005
心跳上报_0006,/uams/android/broadcast,48134e6047a19a06,aa44e258a4e1e006
心跳上报_0007,/uams/android/broadcast,48134e6047a19a07,aa44e258a4e1e007
心跳上报_0008,/uams/android/broadcast,48134e6047a19a08,aa44e258a4e1e008
心跳上报_0009,/uams/android/broadcast,48134e6047a19a09,aa44e258a4e1e009
心跳上报_0010,/uams/android/broadcast,48134e6047a19a10,aa44e258a4e1e010
心跳上报_0011,/uams/android/broadcast,48134e6047a19a11,aa44e258a4e1e011
心跳上报_0012,/uams/android/broadcast,48134e6047a19a12,aa44e258a4e1e012
心跳上报_0013,/uams/android/broadcast,48134e6047a19a13,aa44e258a4e1e013
心跳上报_0014,/uams/android/broadcast,48134e6047a19a14,aa44e258a4e1e014
心跳上报_0015,/uams/android/broadcast,48134e6047a19a15,aa44e258a4e1e015
心跳上报_0016,/uams/android/broadcast,48134e6047a19a16,aa44e258a4e1e016
心跳上报_0017,/uams/android/broadcast,48134e6047a19a17,aa44e258a4e1e017
心跳上报_0018,/uams/android/broadcast,48134e6047a19a18,aa44e258a4e1e018
心跳上报_0019,/uams/android/broadcast,48134e6047a19a19,aa44e258a4e1e019
心跳上报_0020,/uams/android/broadcast,48134e6047a19a20,aa44e258a4e1e020
心跳上报_0021,/uams/android/broadcast,48134e6047a19a21,aa44e258a4e1e021
心跳上报_0022,/uams/android/broadcast,48134e6047a19a22,aa44e258a4e1e022
心跳上报_0023,/uams/android/broadcast,48134e6047a19a23,aa44e258a4e1e023
心跳上报_0024,/uams/android/broadcast,48134e6047a19a24,aa44e258a4e1e024
心跳上报_0025,/uams/android/broadcast,48134e6047a19a25,aa44e258a4e1e025
心跳上报_0026,/uams/android/broadcast,48134e6047a19a26,aa44e258a4e1e026
心跳上报_0027,/uams/android/broadcast,48134e6047a19a27,aa44e258a4e1e027
心跳上报_0028,/uams/android/broadcast,48134e6047a19a28,aa44e258a4e1e028
心跳上报_0029,/uams/android/broadcast,48134e6047a19a29,aa44e258a4e1e029
心跳上报_0030,/uams/android/broadcast,48134e6047a19a30,aa44e258a4e1e031
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论