Commit 2657619d authored by 王超's avatar 王超

首次提交

parents
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from `dotnet new gitignore`
# dotenv files
.env
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET
project.lock.json
project.fragment.lock.json
artifacts/
# Tye
.tye/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml
.idea
##
## Visual studio for Mac
##
# globs
Makefile.in
*.userprefs
*.usertasks
config.make
config.status
aclocal.m4
install-sh
autom4te.cache/
*.tar.gz
tarballs/
test-results/
# Mac bundle stuff
*.dmg
*.app
# content below from: https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# content below from: https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
# Windows thumbnail cache files
Thumbs.db
ehthumbs.db
ehthumbs_vista.db
# Dump file
*.stackdump
# Folder config file
[Dd]esktop.ini
# Recycle Bin used on file shares
$RECYCLE.BIN/
# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp
# Windows shortcuts
*.lnk
# Vim temporary swap files
*.swp
import time
import pytest
import os
if __name__ == '__main__':
pytest.main()
time.sleep(1)
os.system("allure generate ./temp -o ./reports --clean")
import logging
import time
from common.yaml_util import get_object_path, read_config_file
class LoggerUtil:
def creat_log(self,logger_name='log'):
#创建一个日志对象
self.logger = logging.getLogger(logger_name)
#设置全局的日志级别(critical>error>waring>info>debug)
self.logger.setLevel(logging.DEBUG)
#放置日志重复
if not self.logger.handlers:
#-----------文件日志----------
#获得日志文件的名称
self.file_log_path = get_object_path()+'/logs/'+ read_config_file('log','log_name')+str(int(time.time()))+'.log'
# print(self.file_log_path)
#创建文件日志的控制器
self.file_hander = logging.FileHandler(self.file_log_path,encoding='utf-8')
#设置文件日志的界别
file_log_lever = str(read_config_file('log','log_level')).lower()
if file_log_lever =='debug':
self.file_hander.setLevel(logging.DEBUG)
elif file_log_lever =='info':
self.file_hander.setLevel(logging.INFO)
elif file_log_lever =='warning':
self.file_hander.setLevel(logging.WARNING)
elif file_log_lever =='error':
self.file_hander.setLevel(logging.ERROR)
elif file_log_lever == 'critical':
self.file_hander.setLevel(logging.CRITICAL)
#设置文件日志的格式
self.file_hander.setFormatter(logging.Formatter(read_config_file('log','log_format')))
#将控制器加入到日志对象
self.logger.addHandler(self.file_hander)
#-----------控制台日志----------
# 创建控制台日志的控制器
self.console_hander = logging.StreamHandler()
# 设置控制台日志的界别
console_log_lever = str(read_config_file('log', 'log_level')).lower()
if console_log_lever == 'debug':
self.console_hander.setLevel(logging.DEBUG)
elif console_log_lever == 'info':
self.file_hander.setLevel(logging.INFO)
elif console_log_lever == 'warning':
self.console_hander.setLevel(logging.WARNING)
elif console_log_lever == 'error':
self.console_hander.setLevel(logging.ERROR)
elif console_log_lever == 'critical':
self.console_hander.setLevel(logging.CRITICAL)
# 设置控制台日志的格式
self.console_hander.setFormatter(logging.Formatter(read_config_file('log', 'log_format')))
# 将控制器加入到日志对象
self.logger.addHandler(self.console_hander)
return self.logger
#函数:输出正常日志
def write_log(log_message):
LoggerUtil().creat_log().info(log_message)
#函数:输出错误日志
def error_log(log_message):
LoggerUtil().creat_log().info(log_message)
raise Exception(log_message)
import pymysql
from common.yaml_util import read_config_file, get_object_path
class MysqlrUtil:
def __init__(self):
host = read_config_file('mysql','host')
user = read_config_file('mysql', 'user')
passwd = read_config_file('mysql', 'passwd')
database = read_config_file('mysql', 'database')
charset = read_config_file('mysql', 'charset')
self.connect = pymysql.connect(
host=host,
user=user,
passwd=passwd,
database=database,
charset=charset
)
self.cursor = self.connect.cursor()
def sql(self,sql):
self.cursor.execute(sql)
data_list = self.cursor.fetchall()
return data_list
def __del__(self):
self.connect.close()
self.cursor.close()
if __name__ == '__main__':
data = MysqlrUtil().sql('SELECT * FROM test01')
print(data[0][1])
\ No newline at end of file
import csv
import json
import traceback
import yaml
from common.logger_util import write_log, error_log
from common.yaml_util import get_object_path
#读取csv数据文件
def read_csv_file(csv_path):
csv_data_list = []
with open(get_object_path()+'/'+csv_path,encoding='utf-8') as f:
csv_data = csv.reader(f)
for row in csv_data:
csv_data_list.append(row)
return csv_data_list
#读取YAML测试用例文件
def read_testcase_file(yaml_path):
try:
with open(get_object_path()+yaml_path,encoding='utf-8') as f:
caseinfo = yaml.load(stream=f, Loader=yaml.FullLoader)
# print("==========读取yaml文件数据:",caseinfo)
if len(caseinfo) >= 2:
return caseinfo
else:
caseinfo_keys = dict(*caseinfo).keys()
if 'parameters' in caseinfo_keys:
new_caseinfo = analysis_parameters(*caseinfo)
return new_caseinfo
else:
return caseinfo
except Exception as f:
error_log("读取用例文件异常:异常信息: %s" %str(traceback.format_exc()))
#分析参数化
def analysis_parameters(caseinfo):
try:
caseinfo_keys = dict(caseinfo).keys()
if 'parameters' in caseinfo_keys:
for key, value in dict(caseinfo['parameters']).items():
caseinfo_str = json.dumps(caseinfo)
key_list = str(key).split('-')
# 规范csv数据的写法
length_flag = True
csv_data_list = read_csv_file(value)
one_row_csv_data = csv_data_list[0]
for csv_data in csv_data_list:
if len(csv_data) != len(one_row_csv_data):
length_flag = False
break
# 解析
new_caseinfo = []
if length_flag:
for x in range(1, len(csv_data_list)):
temp_caseinfo = caseinfo_str
for y in range(0, len(csv_data_list[x])):
if csv_data_list[0][y] in key_list:
temp_caseinfo = temp_caseinfo.replace("$csv{" + csv_data_list[0][y] + "}",
csv_data_list[x][y])
new_caseinfo.append(json.loads(temp_caseinfo))
# print("解析:",new_caseinfo)
return new_caseinfo
else:
return caseinfo
except Exception as f:
error_log("分析parameters参数化异常:异常信息: %s" %str(traceback.format_exc()))
\ No newline at end of file
This diff is collapsed.
import yaml
import os
#获取项目路径
def get_object_path():
return os.path.abspath(os.getcwd().split('common')[0])
#读取config.yml文件
def read_config_file(one_node,two_node):
with open(get_object_path()+"\\config.yml",encoding='utf-8') as f:
value = yaml.load(stream=f, Loader=yaml.FullLoader)
return value[one_node][two_node]
#读取extract.yml文件
def read_extract_file(one_node):
with open(get_object_path()+"\\extract.yml",encoding='utf-8') as f:
value = yaml.load(stream=f, Loader=yaml.FullLoader)
return value[one_node]
#写入extract.yml文件a
def write_extract_file(data):
with open(get_object_path()+"\\extract.yml",encoding='utf-8',mode='a') as f:
yaml.dump(data=data, stream=f,allow_unicode=True )
#清空extract.yml文件a
def clear_extract_file():
with open(get_object_path()+"\\extract.yml",encoding='utf-8',mode='w') as f:
f.truncate()
if __name__ == '__main__':
print(read_config_file('base','base_url'))
print(get_object_path())
base:
siot_url: http://127.0.0.1:6700
cms_url: http://127.0.0.1:18000
base_url: http://127.0.0.1:18000
tunnel:
device_ip: 127.0.0.1
log:
log_name: logs_
log_level: info
log_format: '[%(asctime)s] %(filename)s->%(funcName)s line:%(lineno)d [%(levelname)s] %(message)s'
project:
project_path: E:\Project_python\api_SIOT
x_project: d800d1a6d0be4623aaa824c28dc71981
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiU3VwZXJBZG1pbiIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWVpZGVudGlmaWVyIjoiU3VwZXJBZG1pbiIsImV4cCI6MTcwMzU3MDc1MiwiaXNzIjoiQ01TdjIiLCJhdWQiOiJBcGkifQ.cA3RR_dmMdoLbMBzjwvR276Dhx8SEeUdoSmuR1TO83w
mysql:
host: 127.0.0.1
port: 3306
user: root
password: syc123
database: TestDB
charset: utf8
sqlserver:
DRIVER: SQL Server
host: 127.0.0.1
user: sa
password: 123456
database: TestDB
import pytest
import pyodbc
from debug_talk import DubugTalk
import pymysql # 导入 pymysql 库(MySQL 数据库)
from common.yaml_util import clear_extract_file
@pytest.fixture(scope='session',autouse=True)
def clear_extract():
clear_extract_file()
@pytest.fixture(scope='function')
def create_mysqldb_fixture():
print("=============进入数据库创建流程==============")
host = DubugTalk().get_config('mysql', 'host')
user = DubugTalk().get_config('mysql', 'user')
password = DubugTalk().get_config('mysql', 'password')
database = DubugTalk().get_extract_data('x_project') + '_data'
conn = pymysql.connect(host=host, user=user, password=password,
database=database) # 建立 MySQL 连接
cursor = conn.cursor()
result = cursor.execute("SHOW DATABASES LIKE 'TestDB'")
if result > 0:
print("数据库存在")
else:
print("数据库不存在,创建testdb数据库...")
cursor.execute("create database TestDB")
print("TestDB数据库创建成功")
conn.commit()
conn.close()
# 重新连接
conn = pymysql.connect(host=host, user=user, password=password, database='TestDB') # 建立 MySQL 连接
cursor = conn.cursor()
print("创建student数据表...")
cursor.execute(
"CREATE TABLE IF NOT EXISTS student(id INT AUTO_INCREMENT PRIMARY KEY,time DATETIME,name VARCHAR(20),age INT,money float )")
print("student数据表创建成功")
conn.close()
@pytest.fixture(scope='function')
def truncate_mysqldb_fixture():
print("=============清空数据表==============")
host = DubugTalk().get_config('mysql', 'host')
user = DubugTalk().get_config('mysql', 'user')
password = DubugTalk().get_config('mysql', 'password')
database = DubugTalk().get_config('mysql', 'database')
conn = pymysql.connect(host=host, user=user, password=password, database=database) # 建立 MySQL 连接
try:
cursor = conn.cursor()
print("正在清空student数据表...")
cursor.execute(
"TRUNCATE TABLE student")
conn.commit()
print("student数据表清空成功")
except:
print("连接mysql或清空数据失败")
finally:
conn.close()
@pytest.fixture(scope='function')
def truncate_sqlerver_fixture():
print("=============清空数据表==============")
DRIVER = DubugTalk().get_config('sqlserver', 'DRIVER')
host = DubugTalk().get_config('sqlserver', 'host')
user = DubugTalk().get_config('sqlserver', 'user')
password = DubugTalk().get_config('sqlserver', 'password')
database = DubugTalk().get_config('sqlserver', 'database')
conn = pyodbc.connect(DRIVER=DRIVER, SERVER=host, DATABASE=database, UID=user, PWD=password)
try:
cursor = conn.cursor()
print("正在清空student数据表...")
cursor.execute(
"TRUNCATE TABLE student")
cursor.commit()
print("student数据表清空成功")
except:
print("连接sqlserverl或清空数据失败")
finally:
conn.close()
name,nodeType,parentId,id
报警文件夹,0,,Alarm_Folder_ID
报警组,1,Alarm_Folder_ID,Alarm_Group_ID
\ No newline at end of file
name,TableId,nodeType
归档表,Original_Table_ID,2
聚合表,Aggregation_Table_ID,3
\ No newline at end of file
name,realTime,effectiveDateTime,frequencyValue,frequencyUnit,matchAll,condition,conditionDetail,frequencyCheck,triggerType
"变量触发",false,null,1,1,false,"G1 == true",1,false,2
"变量触发",false,,1,1,false,"G1 == true",2,false,2
"变量触发",false,,1,1,false,"G1 == true",3,false,2
"变量触发",false,,1,1,false,"G1 == true",1,true,2
"变量触发",false,,5,2,false,"G1 == true",1,true,2
"变量触发",false,,1,3,false,"G1 == true",1,true,2
"变量触发",false,,1,4,false,"G1 == true",1,true,2
"变量触发",false,,36,5,false,"G1 == true",1,true,2
"变量触发",false,,1,1,false,"G1 == true || H1 != '中文'",1,false,2
"变量触发",false,,1,1,false,"A1 + B1) <= 0 || (A1 - B1) <= 0",1,false,2
"变量触发",false,,1,1,false,"(A1 * B1) > 0 && (A1 / B1)>0",1,false,2
"定时触发",false,"2023-05-22T06:15:31.000Z",1,1,false,,1,false,1
"定时触发",false,"2023-05-22T06:15:31.000Z",5,2,false,,1,false,1
"定时触发",false,"2023-05-22T06:15:31.000Z",1,3,false,,1,false,1
"定时触发",false,"2023-05-22T06:15:31.000Z",1,4,false,,1,false,1
"定时触发",false,"2023-05-22T06:15:31.000Z",36,5,false,,1,false,1
"定时触发",false,"2023-05-22T06:15:31.000Z",1,1,true,"G1 == true || H1 != '中文'",1,false,1
"定时触发",false,"2023-05-22T06:15:31.000Z",1,1,true,"A1 + B1) <= 0 || (A1 - B1) <= 0",1,false,1
"定时触发",false,"2023-05-22T06:15:31.000Z",1,1,true,"(A1 * B1) > 0 && (A1 / B1)>0",1,false,1
"实时聚合",true,,1,2,false,,1,false,1
\ No newline at end of file
name,realTime,effectiveDateTime,frequencyValue,frequencyUnit,matchAll,condition,conditionDetail,frequencyCheck,alarmPointIds,triggerType,msg
"变量触发",false,,1,1,false,,1,false,,2,"触发动作不能为空"
"定时触发",false,"",1,1,false,,1,false,,1,"请填写触发时间"
"定时触发",false,"2023-05-22T06:15:31.000Z",1,1,true,,1,false,,1,"触发动作不能为空"
enableCache,quantityLimit,timeSpanLimit,timeSpanLimitUnit,clearCache
true,1000,100,1,""
true,1000,100,2,""
true,1000,100,3,""
true,1000,100,4,""
true,1000,100,1,"A1"
true,1000,100,1,"B1"
true,1000,100,1,"G1"
true,1000,0,1,"G1"
\ No newline at end of file
fieldName,fieldType,associatedVariable,formula
系统时间,3,System_DateTime,
班次,2,System_Shift,
A1,1,I1,
B1,1,F1,
G1,1,G1,
H1,2,H1,
绝对值B1,1,,ABS( [B1] )
随机数0_1,1,,RAND( )
随机数1_100,1,,"RANDBETWEEN( 1,100 )"
四舍1位_ROUND,1,,"ROUND( [B1],1 )"
ROUNDUP1,1,,"ROUNDUP( [B1] ,1)"
ROUNDDOWN1,1,,"ROUNDDOWN( [B1] ,1)"
SUM1,1,,"SUM( [B1],[随机数1_100] )"
AVERAGE1,1,,"AVERAGE( [B1],[随机数1_100] )"
COUNT1,1,,"COUNT( [B1],[随机数1_100] )"
COUNTA1,1,,"COUNTA( [B1],[随机数1_100] )"
MAX1,1,,"MAX( [B1],[随机数1_100] )"
MEDIAN1,1,,"MEDIAN( [B1],[随机数1_100] )"
MIN1,1,,"MIN( [B1],[随机数1_100] )"
CHAR1,2,,"CHAR( 92 )"
CONCATENATE1,2,,"CONCATENATE( [H1],'123')"
LEFT2,2,,"LEFT( [H1],2 )"
LEN1,2,,"LEN( [H1] )"
LOWER1,2,,"LOWER( [H1] )"
MID12,2,,"MID( [H1],1,2 )"
REPLACE1,2,,"REPLACE( [H1],1,2,'替换' )"
RIGHT1,2,,"RIGHT( [H1],2 )"
TEXT1,2,,"TEXT( '2022-10-20','M月d日' )"
TODATE1,2,,"TODATE( '2023-06-19')"
TRIM1,2,,"TRIM( [H1] )"
UPPER1,2,,"UPPER( [H1] )"
DATE1,2,,"DATE( 2023,6,19 )"
DATEDIF1,2,,"DATEDIF( '2022-01-01','2023-10-01', 'Y')"
DAY1,2,,"DAY( [系统时间] )"
DAYS1,2,,"DAYS( '2023-06-19','2023-06-01' )"
\ No newline at end of file
name,effectiveDateTime,frequencyValue,frequencyUnit,matchAll,condition,conditionDetail,frequencyCheck,alarmPointIds,triggerType
"变量触发",null,1,1,false,"A1 == true",1,false,,2
"变量触发",,1,1,false,"A1 == true",2,false,,2
"变量触发",,1,1,false,"A1 == true",3,false,,2
"变量触发",,1,1,false,"A1 == true",1,true,,2
"变量触发",,5,2,false,"A1 == true",1,true,,2
"变量触发",,1,3,false,"A1 == true",1,true,,2
"变量触发",,1,4,false,"A1 == true",1,true,,2
"变量触发",,36,5,false,"A1 == true",1,true,,2
"变量触发",,1,1,false,"A1 == true || A12 != '中文'",1,false,,2
"变量触发",,1,1,false,"A2 + A3) <= 0 || (A2 - A3) <= 0",1,false,,2
"变量触发",,1,1,false,"(A2 * A3) > 0 && (A2 / A3)>0",1,false,,2
"字段触发",,1,1,false,,1,false,,3
"字段触发",,1,1,true,"A1 == true || A12 != '中文'",1,false,,3
"字段触发",,1,1,true,"A2 + A3) <= 0 || (A2 - A3) <= 0",1,false,,3
"字段触发",,1,1,true,"(A2 * A3) > 0 && (A2 / A3)>0",1,false,,3
"定时触发","2023-05-22T06:15:31.000Z",5,2,false,,1,false,,1
"定时触发","2023-05-22T06:15:31.000Z",1,3,false,,1,false,,1
"定时触发","2023-05-22T06:15:31.000Z",1,4,false,,1,false,,1
"定时触发","2023-05-22T06:15:31.000Z",36,5,false,,1,false,,1
"定时触发","2023-05-22T06:15:31.000Z",1,1,true,"A1 == true || A12 != '中文'",1,false,,1
"定时触发","2023-05-22T06:15:31.000Z",1,1,true,"A2 + A3) <= 0 || (A2 - A3) <= 0",1,false,,1
"定时触发","2023-05-22T06:15:31.000Z",1,1,true,"(A2 * A3) > 0 && (A2 / A3)>0",1,false,,1
"定时触发","2023-05-22T06:15:31.000Z",1,1,false,,1,false,,1
\ No newline at end of file
name,effectiveDateTime,frequencyValue,frequencyUnit,matchAll,condition,conditionDetail,frequencyCheck,alarmPointIds,triggerType,msg
"变量触发",,1,1,false,,1,false,,2,"触发动作不能为空"
"定时触发","",1,1,false,,1,false,,1,"请填写触发时间"
"定时触发","2023-05-22T06:15:31.000Z",1,1,true,,1,false,,1,"触发动作不能为空"
"字段触发",,1,1,true,,1,false,,3,"触发动作不能为空"
name,nodeId
"系统时间",time_id
"函数时间",nowtime_id
"整型A1",A1_id
"浮点型B1",B1_id
"二进制G1",G1_id
"字符串H1",H1_id
\ No newline at end of file
name,nodetype,id,msg
"文件夹",1,Folder_ID,"确认后,从列表中删除节点"
"归档表",2,Original_Table_ID,"删除该节点,将会同步删除有关联关系的数据表,是否确认删除?"
"聚合表",3,Aggregation_Table_ID,"确认后,从列表中删除节点"
\ No newline at end of file
name,TableId,nodeType,sort
归档表,Original_Table_ID,2,1
聚合表,Aggregation_Table_ID,3,2
\ No newline at end of file
name,TableId,nodeType,sort
归档表,Original_Table_ID,2,1
聚合表,Aggregation_Table_ID,3,2
文件夹,Folder_ID,1,3
\ No newline at end of file
name,value
A1,true
A2,77
A10,70.456
A12,中文
aa1,true
aa2,77
aa10,70.456
aa16,2023-10-20 18:40:55
\ No newline at end of file
name,value
A2,10
aa2,10
A10,10.123
aa10,10.123
A2,20
aa2,20
A10,20.273
aa10,20.273
A2,21
aa2,21
A10,20.283
aa10,20.283
\ No newline at end of file
name,value
A2,100
aa2,100
A10,100
aa10,100
A2,110
aa2,110
A10,110.15
aa10,110.15
A2,111
aa2,111
A10,110.16
aa10,110.16
\ No newline at end of file
name,value
A2,10
A10,10.456
A12,中文1
aa16,2023-10-20 18:40:55
\ No newline at end of file
name,value
A2,70
A10,70.456
A12,中文1
aa16,2022-11-28 09:05:01
\ No newline at end of file
name,value
A2,77
A10,77.456
A12,中文1
aa16,2022-11-28 09:05:01
\ No newline at end of file
title,name,type,msg
通道名称为空,,3,通道名称不能为空
通道名称重复,内部通道1,3,通道名称不能重复
\ No newline at end of file
title,name,description,typeName,initType,setValue
校验变量名为空,,校验变量名为空,有符号8位整型,0,null
校验变量名重复,ee1,校验变量名重复,有符号8位整型,0,null
设定值为空,ee2,设定值为空,有符号8位整型,1,
二进制-设定值为空,ee2,设定值为空,二进制变量,1,
二进制-设定值非法,ee2,设定值非法,二进制变量,1,2
int8-设定值为空,ee2,设定值为空,有符号8位整型,1,
int8-设定值非法,ee2,设定值非法,有符号8位整型,1,128
int8-设定值非法,ee2,设定值非法,有符号8位整型,1,-129
int8-设定值非法,ee2,设定值非法,有符号8位整型,1,10.5
int8-设定值非法,ee2,设定值非法,有符号8位整型,1,中文
unint8-设定值为空,ee2,设定值为空,无符号8位整型,1,
unint8-设定值非法,ee2,设定值非法,无符号8位整型,1,256
unint8-设定值非法,ee2,设定值非法,无符号8位整型,1,-1
unint8-设定值非法,ee2,设定值非法,无符号8位整型,1,10.5
unint8-设定值非法,ee2,设定值非法,无符号8位整型,1,中文
int16-设定值为空,ee2,设定值为空,有符号16位整型,1,
int16-设定值非法,ee2,设定值非法,有符号16位整型,1,32768
int16-设定值非法,ee2,设定值非法,有符号16位整型,1,-32769
int16-设定值非法,ee2,设定值非法,有符号16位整型,1,10.5
int16-设定值非法,ee2,设定值非法,有符号16位整型,1,中文
unint16-设定值为空,ee2,设定值为空,无符号16位整型,1,
unint16-设定值非法,ee2,设定值非法,无符号16位整型,1,65536
unint16-设定值非法,ee2,设定值非法,无符号16位整型,1,-1
unint16-设定值非法,ee2,设定值非法,无符号16位整型,1,10.5
unint16-设定值非法,ee2,设定值非法,无符号16位整型,1,中文
int32-设定值为空,ee2,设定值为空,有符号32位整型,1,
int32-设定值非法,ee2,设定值非法,有符号32位整型,1,2147483648
int32-设定值非法,ee2,设定值非法,有符号32位整型,1,-2147483649
int32-设定值非法,ee2,设定值非法,有符号32位整型,1,10.5
int32-设定值非法,ee2,设定值非法,有符号32位整型,1,中文
unint32-设定值为空,ee2,设定值为空,无符号32位整型,1,
unint32-设定值非法,ee2,设定值非法,无符号32位整型,1,4294967296
unint32-设定值非法,ee2,设定值非法,无符号32位整型,1,-1
unint32-设定值非法,ee2,设定值非法,无符号32位整型,1,10.5
unint32-设定值非法,ee2,设定值非法,无符号32位整型,1,中文
int64-设定值为空,ee2,设定值为空,有符号64位整型,1,
int64-设定值非法,ee2,设定值非法,有符号64位整型,1,9223372036854775808
int64-设定值非法,ee2,设定值非法,有符号64位整型,1,-9223372036854775809
int64-设定值非法,ee2,设定值非法,有符号64位整型,1,10.5
int64-设定值非法,ee2,设定值非法,有符号64位整型,1,中文
unint64-设定值为空,ee2,设定值为空,无符号64位整型,1,
unint64-设定值非法,ee2,设定值非法,无符号64位整型,1,18446744073709551616
unint64-设定值非法,ee2,设定值非法,无符号64位整型,1,-1
unint64-设定值非法,ee2,设定值非法,无符号64位整型,1,10.5
unint64-设定值非法,ee2,设定值非法,无符号64位整型,1,中文
float32-设定值为空,ee2,设定值为空,F32位浮点数IEEE754,1,
float32-设定值非法,ee2,设定值非法,F32位浮点数IEEE754,1,3.40282346638528E+39
float32-设定值非法,ee2,设定值非法,F32位浮点数IEEE754,1,-3.40282346638528E+39
float32-设定值非法,ee2,设定值非法,F32位浮点数IEEE754,1,中文
float64-设定值为空,ee2,设定值为空,F64位浮点数IEEE754,1,
float64-设定值非法,ee2,设定值非法,F64位浮点数IEEE754,1,1.7976931348623157E+309
float64-设定值非法,ee2,设定值非法,F64位浮点数IEEE754,1,-1.7976931348623157E+309
float64-设定值非法,ee2,设定值非法,F64位浮点数IEEE754,1,中文
字符串-设定值为空,ee2,设定值为空,字符串,1,
宽字符串-设定值为空,ee2,设定值为空,宽字符串,1,
日期-设定值为空,ee2,设定值为空,日期,1,
日期-设定值非法,ee2,设定值非法,日期,1,2023.01
时间-设定值为空,ee2,设定值为空,时间,1,
时间-设定值非法,ee2,设定值非法,时间,1,18.10
日期时间-设定值为空,ee2,设定值为空,日期时间,1,
日期时间-设定值非法,ee2,设定值非法,日期时间,1,2023.01
\ No newline at end of file
title,name,description,typeName,address,interval,stringLength,msg
校验变量名为空,,校验变量名为空,有符号8位整型,400001,10000,null,序号<1>变量配置错误:变量名不可为空,请重新输入
重复提交同变量名,E1,重复提交同变量名,有符号8位整型,400001,10000,null,序号<1>变量配置错误:变量名<E1>已存在,请重新输入
校验变量地址为空,E2,校验变量地址为空,有符号8位整型,,10000,null,序号<1>变量配置错误:变量地址不能为空
校验变量地址非法,E2,校验变量地址为空,有符号8位整型,abc,10000,null,序号<1>变量配置错误:变量地址<abc>错误
校验采集间隔为空,E2,校验采集间隔为空,有符号8位整型,400001,,null,序号<1>变量配置错误
字符串长度为空,E2,字符串长度为空,字符串,400001,1000,,序号<1>变量配置错误:字符长度不能为空
\ No newline at end of file
title,name,description,ServerName,DeviceID,Port,ConnectTimeOut,ResponseTimeout,PduLength,msg
设备IP为空,通道2,设备IP为空,,1,502,3,1000,220,通道配置错误:驱动配置中设备IP不能为空
设备IP非法,通道3,设备IP非法,abc,1,502,3,1000,220,通道配置错误:驱动配置中设备IP<abc>不正确
设备ID为空,通道4,设备ID为空,192.168.2.98,,502,3,1000,220,通道配置错误:驱动配置中设备ID不能为空
设备ID非法,通道5,设备ID非法,192.168.2.98,abc,502,3,1000,220,通道配置错误:驱动配置中设备ID<abc>不正确
端口号为空,通道6,端口号为空,192.168.2.98,1,,3,1000,220,通道配置错误:驱动配置中端口号不能为空
端口号非法,通道7,端口号非法,192.168.2.98,1,abc,3,1000,220,通道配置错误:驱动配置中端口号<abc>不正确
连接超时为空,通道8,连接超时为空,192.168.2.98,1,502,,1000,220,通道配置错误:驱动配置中连接超时不能为空
连接超时非法,通道9,连接超时非法,192.168.2.98,1,502,abc,1000,220,通道配置错误:驱动配置中连接超时<abc>不正确
响应超时为空,通道10,响应超时为空,192.168.2.98,1,502,3,,220,通道配置错误:驱动配置中响应超时不能为空
响应超时非法,通道11,响应超时非法,192.168.2.98,1,502,3,abc,220,通道配置错误:驱动配置中响应超时<abc>不正确
PDU长度为空,通道12,PDU长度为空,192.168.2.98,1,502,3,1000,,通道配置错误:驱动配置中PDU长度不能为空
PDU长度非法,通道13,PDU长度非法,192.168.2.98,1,502,3,1000,abc,通道配置错误:驱动配置中PDU长度<abc>不正确
\ No newline at end of file
title,index,name,description,typeName,inner_id
二进制变量,1,aa1,二进制变量,二进制变量,aa1_id
有符号8位整型,2,aa2,有符号8位整型,有符号8位整型,aa2_id
无符号8位整型,3,aa3,无符号8位整型,无符号8位整型,aa3_id
有符号16位整型,4,aa4,有符号16位整型,有符号16位整型,aa4_id
无符号16位整型,5,aa5,无符号16位整型,无符号16位整型,aa5_id
有符号32位整型,6,aa6,有符号32位整型,有符号32位整型,aa6_id
无符号32位整型,7,aa7,无符号32位整型,无符号32位整型,aa7_id
有符号64位整型,8,aa8,有符号64位整型,有符号64位整型,aa8_id
无符号64位整型,9,aa9,无符号64位整型,无符号64位整型,aa9_id
F32位浮点数IEEE754,10,aa10,F32位浮点数IEEE754,F32位浮点数IEEE754,aa10_id
F64位浮点数IEEE754,11,aa11,F64位浮点数IEEE754,F64位浮点数IEEE754,aa11_id
字符串,12,aa12,字符串,字符串,aa12_id
宽字符串-设定值为空,13,aa13,宽字符串,宽字符串,aa13_id
日期,14,aa14,日期,日期,aa14_id
时间,15,aa15,时间,时间,aa15_id
日期时间,16,aa16,日期时间,日期时间,aa16_id
\ No newline at end of file
title,index,name,description,typeName,address,interval,stringLength,zoom,digit,readWriteRule,io_id
缩放比10,1,B1,缩放比10,有符号8位整型,400080,1000,null,10,null,1,B1_id
缩放比0.1,2,B2,缩放比0.1,有符号8位整型,400081,1000,null,0.1,null,1,B2_id
缩放比小数位,舍位,3,B3,缩放比小数位,舍位,有符号16位整型,400082,1000,null,0.01,1,1,B3_id
缩放比小数位,四舍,4,B4,缩放比小数位,四舍,有符号16位整型,400083,1000,null,0.01,1,2,B4_id
缩放比小数位,进位,5,B5,缩放比小数位,进位,有符号16位整型,400084,1000,null,0.01,1,3,B5_id
浮点数小数位,舍位,6,B6,浮点数小数位,舍位,F32位浮点数IEEE754,400085,1000,null,1,2,1,B6_id
浮点数小数位,四舍,7,B7,浮点数小数位,四舍,F32位浮点数IEEE754,400087,1000,null,1,2,2,B7_id
浮点数小数位,进位,8,B8,浮点数小数位,进位,F32位浮点数IEEE754,400089,1000,null,1,2,3,B8_id
二进制,9,A1,二进制,二进制变量,400001.0,1000,null,null,null,1,A1_id
有符号8位整型,10,A2,有符号8位整型,有符号8位整型,400002,1000,null,1,null,1,A2_id
无符号8位整型,11,A3,无符号8位整型,无符号8位整型,400003,1000,null,1,null,1,B3_id
有符号16位整型,12,A4,有符号16位整型,有符号16位整型,400004,1000,null,1,null,1,A4_id
无符号16位整型,13,A5,无符号16位整型,无符号16位整型,400005,1000,null,1,null,1,A5_id
有符号32位整型,14,A6,有符号32位整型,有符号32位整型,400013,1000,null,1,null,1,A6_id
无符号32位整型,15,A7,无符号32位整型,无符号32位整型,400015,1000,null,1,null,1,A7_id
有符号64位整型,16,A8,有符号64位整型,有符号64位整型,400025,1000,null,1,null,1,A8_id
无符号64位整型,17,A9,无符号64位整型,无符号64位整型,400029,1000,null,1,null,1,A9_id
F32位浮点数IEEE754,18,A10,F32位浮点数IEEE754,F32位浮点数IEEE754,400045,1000,null,1,null,1,A10_id
F64位浮点数IEEE754,19,A11,F64位浮点数IEEE754,F64位浮点数IEEE754,400049,1000,null,1,null,1,A11_id
字符串,20,A12,字符串,字符串,400060,1000,10,null,null,1,A12_id
\ No newline at end of file
title,name,value
aa1-二进制,aa1,False
aa2-有符号8位整型,aa2,-128
aa3-无符号8位整型,aa3,255
aa4-有符号16位整型,aa4,-32768
aa5-无符号16位整型,aa5,65535
aa6-有符号32位整型,aa6,-2147483648
aa7-无符号32位整型,aa7,4294967295
aa8-有符号64位整型,aa8,-9223372036854775808
aa9-无符号64位整型,aa9,18446744073709551615
aa10-F32位浮点数IEEE754,aa10,-3.4028235E+38
aa11-F64位浮点数IEEE754,aa11,-1.7976931348623157E+308
aa12-字符串,aa12,#-~()%
aa13-宽字符串,aa13,#-~()%
aa14-日期,aa14,2023/10/20
aa15-时间,aa15,18:40:55
aa16-日期时间,aa16,2023/10/20 18:40:55
\ No newline at end of file
name,value
io_A1,True
io_A2,11
io_A10,77.456
io_A12,Abcf
title,name,value
B1-int8缩放比:10,B1,-120
B2-int8缩放比:0.1,B2,-12
B3-int16缩放比:0.01,小数位:1,舍位,B3,-327.6
B4-int16缩放比:0.01,小数位:1,四舍,B4,-327.6
B5-int16缩放比:0.01,小数位:1,进位,B5,-327.6
B6-float32小数位:2,舍位,B6,-10.45
B7-float32小数位:2,四舍,B7,-10.46
B8-float32小数位:2,进位,B8,-10.46
A1-二进制,A1,False
A2-有符号8位整型,A2,-128
A3-无符号8位整型,A3,255
A4-有符号16位整型,A4,-32768
A5-无符号16位整型,A5,65535
A6-有符号32位整型,A6,-2147483648
A7-无符号32位整型,A7,4294967295
A8-有符号64位整型,A8,-9223372036854775808
A9-无符号64位整型,A9,18446744073709551615
A10-F32位浮点数IEEE754,A10,-3.402823E+38
A11-F64位浮点数IEEE754,A11,-1.7976931348623157E+308
A12-字符串,A12, #-~()%
\ No newline at end of file
title,name
系统当前日期,System_Date
系统当前时间,System_Time
系统当前日期时间,System_DateTime
系统当前班次,System_Shift
系统当前班次日期,System_ShiftDate
\ No newline at end of file
title,name,value,result_vaule,allSuccess
aa1-二进制,aa1,1,1,true
aa1-二进制,aa1,true,true,true
aa1-二进制,aa1,0,0,true
aa1-二进制,aa1,false,false,true
aa2-有符号8位整型,aa2,127,127,true
aa2-有符号8位整型,aa2,-128,-128,true
aa3-无符号8位整型,aa3,0,0,true
aa3-无符号8位整型,aa3,255,255,true
aa4-有符号16位整型,aa4,32767,32767,true
aa4-有符号16位整型,aa4,-32768,-32768,true
aa5-无符号16位整型,aa5,0,0,true
aa5-无符号16位整型,aa5,65535,65535,true
aa6-有符号32位整型,aa6,2147483647,2147483647,true
aa6-有符号32位整型,aa6,-2147483648,-2147483648,true
aa7-无符号32位整型,aa7,0,0,true
aa7-无符号32位整型,aa7,4294967295,4294967295,true
aa8-有符号64位整型,aa8,9223372036854775807,9223372036854775807,true
aa8-有符号64位整型,aa8,-9223372036854775808,-9223372036854775808,true
aa9-无符号64位整型,aa9,0,0,true
aa9-无符号64位整型,aa9,18446744073709551615,18446744073709551615,true
aa10-F32位浮点数IEEE754,aa10,3.40282346638528E+38,3.40282346638528E+38,true
aa10-F32位浮点数IEEE754,aa10,-3.40282346638528E+38,-3.40282346638528E+38,true
aa11-F64位浮点数IEEE754,aa11,1.7976931348623157E+308,1.7976931348623157E+308,true
aa11-F64位浮点数IEEE754,aa11,-1.7976931348623157E+308,-1.7976931348623157E+308,true
aa12-字符串,aa12,文本1,文本1,true
aa12-字符串,aa12,#-~()%,#-~()%,true
aa13-宽字符串,aa13,文本2,文本2,true
aa13-宽字符串,aa13,#-~()%,#-~()%,true
aa14-日期,aa14,2023.10.20,2023.10.20,true
aa15-时间,aa15,18:40:55,18:40:55,true
aa16-日期时间,aa16,2023.10.20 18:40:55,2023.10.20 18:40:55,true
\ No newline at end of file
title,name,value,result_vaule,allSuccess,errorMsg
aa2-有符号8位整型,aa2,126.5,126.5,false,"请输入正确的值, 应在-128 - 127"
aa2-有符号8位整型,aa2,128,128,false,"请输入正确的值, 应在-128 - 127"
aa2-有符号8位整型,aa2,-129,-129,false,"请输入正确的值, 应在-128 - 127"
aa3-无符号8位整型,aa3,254.5,254.5,false,"请输入正确的值, 应在0 - 255"
aa3-无符号8位整型,aa3,256,256,false,"请输入正确的值, 应在0 - 255"
aa3-无符号8位整型,aa3,-1,-1,false,"请输入正确的值, 应在0 - 255"
aa4-有符号16位整型,aa4,32766.5,32766.5,false,"请输入正确的值, 应在-32768 - 32767"
aa4-有符号16位整型,aa4,32768,32768,false,"请输入正确的值, 应在-32768 - 32767"
aa4-有符号16位整型,aa4,-32769,-32769,false,"请输入正确的值, 应在-32768 - 32767"
aa5-无符号16位整型,aa5,65534.5,65534.5,false,"请输入正确的值, 应在0 - 65535"
aa5-无符号16位整型,aa5,65536,65536,false,"请输入正确的值, 应在0 - 65535"
aa5-无符号16位整型,aa5,-1,-1,false,"请输入正确的值, 应在0 - 65535"
aa6-有符号32位整型,aa6,2147483647.5,2147483647.5,false,"请输入正确的值, 应在-2147483648 - 2147483647"
aa6-有符号32位整型,aa6,2147483648,2147483648,false,"请输入正确的值, 应在-2147483648 - 2147483647"
aa6-有符号32位整型,aa6,-2147483649,-2147483649,false,"请输入正确的值, 应在-2147483648 - 2147483647"
aa7-无符号32位整型,aa7,429496724.5,429496724.5,false,"请输入正确的值, 应在0 - 4294967295"
aa7-无符号32位整型,aa7,4294967296,4294967296,false,"请输入正确的值, 应在0 - 4294967295"
aa7-无符号32位整型,aa7,-1,-1,false,"请输入正确的值, 应在0 - 4294967295"
aa8-有符号64位整型,aa8,9223372036854775806.5,9223372036854775806.5,false,"请输入正确的值, 应在-9223372036854775808 - 9223372036854775807"
aa8-有符号64位整型,aa8,9223372036854775808,9223372036854775808,false,"请输入正确的值, 应在-9223372036854775808 - 9223372036854775807"
aa8-有符号64位整型,aa8,-9223372036854775809,-9223372036854775809,false,"请输入正确的值, 应在-9223372036854775808 - 9223372036854775807"
aa9-无符号64位整型,aa9,18446744073709551614.5,18446744073709551614.5,false,"请输入正确的值, 应在0 - 18446744073709551615"
aa9-无符号64位整型,aa9,18446744073709551616,18446744073709551616,false,"请输入正确的值, 应在0 - 18446744073709551615"
aa9-无符号64位整型,aa9,-1,-1,false,"请输入正确的值, 应在0 - 18446744073709551615"
aa10-F32位浮点数IEEE754,aa10,3.40282346638528E+39,3.40282346638528E+39,false,"请输入正确的值, 应在-3.4028234663852886E+38 - 3.4028234663852886E+38"
aa10-F32位浮点数IEEE754,aa10,-3.40282346638528E+39,-3.40282346638528E+39,false,"请输入正确的值, 应在-3.4028234663852886E+38 - 3.4028234663852886E+38"
aa11-F64位浮点数IEEE754,aa11,1.7976931348623157E+309,1.7976931348623157E+309,false,"请输入正确的值, 应在-1.7976931348623157E+308 - 1.7976931348623157E+308"
aa11-F64位浮点数IEEE754,aa11,-1.7976931348623157E+309,-1.7976931348623157E+309,false,"请输入正确的值, 应在-1.7976931348623157E+308 - 1.7976931348623157E+308"
\ No newline at end of file
title,name,value,result_vaule,allSuccess
B1-int8缩放比:10,B1,127,127,true
B1-int8缩放比:10,B1,-128,-128,true
B2-int8缩放比:0.1,B2,12.7,12.7,true
B2-int8缩放比:0.1,B2,-12.8,-12.8,true
B3-int16缩放比:0.01,小数位:1,舍位,B3,327.67,327.6,true
B3-int16缩放比:0.01,小数位:1,舍位,B3,-327.68,-327.6,true
B4-int16缩放比:0.01,小数位:1,四舍,B4,327.57,327.6,true
B4-int16缩放比:0.01,小数位:1,四舍,B4,-327.58,-327.6,true
B5-int16缩放比:0.01,小数位:1,进位,B5,327.51,327.6,true
B5-int16缩放比:0.01,小数位:1,进位,B5,-327.51,-327.6,true
B6-float32小数位:2,舍位,B6,10.4567,10.45,true
B6-float32小数位:2,舍位,B6,-10.4567,-10.45,true
B7-float32小数位:2,四舍,B7,10.4567,10.46,true
B7-float32小数位:2,四舍,B7,-10.4567,-10.46,true
B8-float32小数位:2,进位,B8,10.4512,10.46,true
B8-float32小数位:2,进位,B8,-10.4512,-10.46,true
A1-二进制,A1,1,True,true
A1-二进制,A1,true,True,true
A1-二进制,A1,0,false,true
A1-二进制,A1,false,false,true
A2-有符号8位整型,A2,127,127,true
A2-有符号8位整型,A2,-128,-128,true
A3-无符号8位整型,A3,0,0,true
A3-无符号8位整型,A3,255,255,true
A4-有符号16位整型,A4,32767,32767,true
A4-有符号16位整型,A4,-32768,-32768,true
A5-无符号16位整型,A5,0,0,true
A5-无符号16位整型,A5,65535,65535,true
A6-有符号32位整型,A6,2147483647,2147483647,true
A6-有符号32位整型,A6,-2147483648,-2147483648,true
A7-无符号32位整型,A7,0,0,true
A7-无符号32位整型,A7,4294967295,4294967295,true
A8-有符号64位整型,A8,9223372036854775807,9223372036854775807,true
A8-有符号64位整型,A8,-9223372036854775808,-9223372036854775808,true
A9-无符号64位整型,A9,0,0,true
A9-无符号64位整型,A9,18446744073709551615,18446744073709551615,true
A10-F32位浮点数IEEE754,A10,3.40282346638528E+38,3.40282346638528E+38,true
A10-F32位浮点数IEEE754,A10,-3.40282346638528E+38,-3.40282346638528E+38,true
A11-F64位浮点数IEEE754,A11,1.7976931348623157E+308,1.7976931348623157E+308,true
A11-F64位浮点数IEEE754,A11,-1.7976931348623157E+308,-1.7976931348623157E+308,true
A12-字符串,A12,文本1,文本1,true
A12-字符串,A12, #-~()%, #-~()%,true
\ No newline at end of file
title,name,value,result_vaule,allSuccess,errorMsg
B1-int8缩放比:10,B1,1271,1271,false,"请输入正确的值, 应在-1280 - 1270"
B1-int8缩放比:10,B1,-1281,-1281,false,"请输入正确的值, 应在-1280 - 1270"
B2-int8缩放比:0.1,B2,12.8,12.8,false,"请输入正确的值, 应在-12.8 - 12.7"
B2-int8缩放比:0.1,B2,-12.9,-12.9,false,"请输入正确的值, 应在-12.8 - 12.7"
B3-int16缩放比:0.01,小数位:1,舍位,B3,327.68,327.68,false,"请输入正确的值, 应在-327.68 - 327.67"
B3-int16缩放比:0.01,小数位:1,舍位,B3,-327.69,-327.69,false,"请输入正确的值, 应在-327.68 - 327.67"
B4-int16缩放比:0.01,小数位:1,四舍,B4,327.67,327.7,false,"请输入正确的值, 应在-327.68 - 327.67"
B4-int16缩放比:0.01,小数位:1,四舍,B4,-327.68,-327.7,false,"请输入正确的值, 应在-327.68 - 327.67"
B5-int16缩放比:0.01,小数位:1,进位,B5,327.61,-327.7,false,"请输入正确的值, 应在-327.68 - 327.67"
B5-int16缩放比:0.01,小数位:1,进位,B5,-327.61,-327.7,false,"请输入正确的值, 应在-327.68 - 327.67"
A1-二进制,A1,12.8,12.8,false,"请输入正确的值, 应在false - true"
A2-有符号8位整型,A2,126.5,126.5,false,"请输入正确的值, 应在-128 - 127"
A2-有符号8位整型,A2,128,128,false,"请输入正确的值, 应在-128 - 127"
A2-有符号8位整型,A2,-129,-129,false,"请输入正确的值, 应在-128 - 127"
A3-无符号8位整型,A3,254.5,254.5,false,"请输入正确的值, 应在0 - 255"
A3-无符号8位整型,A3,256,256,false,"请输入正确的值, 应在0 - 255"
A3-无符号8位整型,A3,-1,-1,false,"请输入正确的值, 应在0 - 255"
A4-有符号16位整型,A4,32766.5,32766.5,false,"请输入正确的值, 应在-32768 - 32767"
A4-有符号16位整型,A4,32768,32768,false,"请输入正确的值, 应在-32768 - 32767"
A4-有符号16位整型,A4,-32769,-32769,false,"请输入正确的值, 应在-32768 - 32767"
A5-无符号16位整型,A5,65534.5,65534.5,false,"请输入正确的值, 应在0 - 65535"
A5-无符号16位整型,A5,65536,65536,false,"请输入正确的值, 应在0 - 65535"
A5-无符号16位整型,A5,-1,-1,false,"请输入正确的值, 应在0 - 65535"
A6-有符号32位整型,A6,2147483647.5,2147483647.5,false,"请输入正确的值, 应在-2147483648 - 2147483647"
A6-有符号32位整型,A6,2147483648,2147483648,false,"请输入正确的值, 应在-2147483648 - 2147483647"
A6-有符号32位整型,A6,-2147483649,-2147483649,false,"请输入正确的值, 应在-2147483648 - 2147483647"
A7-无符号32位整型,A7,429496724.5,429496724.5,false,"请输入正确的值, 应在0 - 4294967295"
A7-无符号32位整型,A7,4294967296,4294967296,false,"请输入正确的值, 应在0 - 4294967295"
A7-无符号32位整型,A7,-1,-1,false,"请输入正确的值, 应在0 - 4294967295"
A8-有符号64位整型,A8,9223372036854775806.5,9223372036854775806.5,false,"请输入正确的值, 应在-9223372036854775808 - 9223372036854775807"
A8-有符号64位整型,A8,9223372036854775808,9223372036854775808,false,"请输入正确的值, 应在-9223372036854775808 - 9223372036854775807"
A8-有符号64位整型,A8,-9223372036854775809,-9223372036854775809,false,"请输入正确的值, 应在-9223372036854775808 - 9223372036854775807"
A9-无符号64位整型,A9,18446744073709551614.5,18446744073709551614.5,false,"请输入正确的值, 应在0 - 18446744073709551615"
A9-无符号64位整型,A9,18446744073709551616,18446744073709551616,false,"请输入正确的值, 应在0 - 18446744073709551615"
A9-无符号64位整型,A9,-1,-1,false,"请输入正确的值, 应在0 - 18446744073709551615"
A10-F32位浮点数IEEE754,A10,3.40282346638528E+39,3.40282346638528E+39,false,"请输入正确的值, 应在-3.4028234663852886E+38 - 3.4028234663852886E+38"
A10-F32位浮点数IEEE754,A10,-3.40282346638528E+39,-3.40282346638528E+39,false,"请输入正确的值, 应在-3.4028234663852886E+38 - 3.4028234663852886E+38"
A11-F64位浮点数IEEE754,A11,,0,false,"请输入正确的值, 应在-1.7976931348623157E+308 - 1.7976931348623157E+308"
\ No newline at end of file
name,value,result_vaule,allSuccess
io_A1,1,1,true
io_A2,11,11,true
io_A10,77.456,77.456,true
io_A12,Abcf,Abcf,true
\ No newline at end of file
name,tagname,tagvalue
保存寄存器有符号8位整型,MOD_SINT1,-11
保存寄存器有符号16位整型,MOD_INT1,22
保存寄存器有符号32位整型,MOD_DINT1,33
保存寄存器无符号8位整型,MOD_USINT1,44
保存寄存器无符号16位整型,MOD_UINT1,55
保存寄存器无符号32位整型,MOD_UDINT1,66
保存寄存器F32位浮点数IEEE754,MOD_REAL1,77.456
保存寄存器二进制变量1,MOD_BOOL1,1
保存寄存器二进制变量2,MOD_BOOL2,0
保存寄存器字符串,MOD_STRING1,文本1
离散二进制变量,MOD_Q0,1
离散二进制变量,MOD_Q1,0
\ No newline at end of file
name,tagname,tagvalue
保存寄存器有符号8位整型,MOD_SINT1,-11
保存寄存器有符号16位整型,MOD_INT1,22
保存寄存器有符号32位整型,MOD_DINT1,33
保存寄存器无符号8位整型,MOD_USINT1,44
保存寄存器无符号16位整型,MOD_UINT1,55
保存寄存器无符号32位整型,MOD_UDINT1,66
保存寄存器F32位浮点数IEEE754,MOD_REAL1,77.456
保存寄存器二进制变量1,MOD_BOOL1,1
保存寄存器二进制变量2,MOD_BOOL2,0
保存寄存器字符串,MOD_STRING1,文本1
离散二进制变量,MOD_Q0,1
离散二进制变量,MOD_Q1,0
\ No newline at end of file
This diff is collapsed.
name,tagname,tagvalue
有符号8位整型,A1,-11
无符号8位整型,A2,22
有符号16位整型,A3,33
无符号16位整型,A4,44
32位浮点数,A5,55.456
二进制,A6,1
字符串,A7,文本1
\ No newline at end of file
import random
import os
import time
import datetime
from common.parameters_util import read_csv_file, read_testcase_file
from common.yaml_util import read_extract_file, read_config_file
class DubugTalk:
#获取随机数的方法
def get_random_number(self,min,max):
return random.randint(int(min),int(max))
# 获取时间戳
def get_time_stamp(self):
now = datetime.datetime.now()
timestamp = now.timestamp()
return timestamp
# print("当前时间:",now)
# print("时间戳:",timestamp)
#获取extract.yaml文件中的值
def get_extract_data(self,node_name):
return read_extract_file(node_name)
# 读取基础路径
def get_base_url(self,node_name):
return read_config_file('base',node_name)
#获取项目路径,单斜杠
def get_project_path(self):
path = os.path.abspath(os.getcwd().split('debug_talk.py')[0])
return path
# 获取项目路径,双斜杠
def get_project_path2(self):
path = os.path.abspath(os.getcwd().split('debug_talk.py')[0])
path2 = path.replace("\\","\\\\")
return path2
def get_int(self,two_name,node_name):
csv_data = read_csv_file(two_name)
print('原始:',csv_data)
print('取值:',csv_data[0][1])
print('第一个:',csv_data)
print('参数:',node_name)
csv_len= len(csv_data)
for key in range(0,csv_len):
for value in range(0,len(csv_data[key])):
# print('第二层:',csv_data[key][value])
if csv_data[key][value] == node_name:
value_data = int(csv_data[key+1][value])
return value_data
# 读取config.
def get_config(self,one,two):
return read_config_file(one,two)
if __name__ == '__main__':
# re = DubugTalk().get_int('data\create_project.csv','type')
# re1 = read_testcase_file('/testcase/EngineeringManagement/create_project100.yml')
# print(type(re),re)
# print(re1)
DubugTalk().get_project_path2()
project_id: 2
x_project: c4e1de9580554027930345fb15235cca
project_name: 工程3189
project_id: 3
folder_id: 4
x_project: 474110776d78404f97118e5c3b8b1740
project_name: 工程7766
project_id1: 5
project_id2: 6
folder_id1: 7
copy_project_id: 8
import_project_id: 9
import_remoteproject_id: 10
import_low_project_id: 11
import_remoteproject_id: 12
Authorization: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiU3VwZXJBZG1pbiIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWVpZGVudGlmaWVyIjoiU3VwZXJBZG1pbiIsImlzcyI6IkNNU3YyIiwiYXVkIjoiQXBpIn0.AJUOE6YQ5MAxDqHOIz-yQbpCKPNq5tPoFBWUY381qns
io_tunnel_id: 2
io_tunnel_id1: 3
io_group_id: 1
io_group_id: 2
io_group_id: 3
io_variable_id: 9
io_variable_id: 10
B1_id: 11
B2_id: 12
B3_id: 13
B4_id: 14
B5_id: 15
B6_id: 16
B7_id: 17
B8_id: 18
A1_id: 19
A2_id: 20
B3_id: 21
A4_id: 22
A5_id: 23
A6_id: 24
A7_id: 25
A8_id: 26
A9_id: 27
A10_id: 28
A11_id: 29
A12_id: 30
inner_tunnel_id: 4
inner_tunnel_id: 5
inner_group_id: 4
inner_group_id: 5
inner_variable_id: 31
aa1_id: 32
aa2_id: 33
aa3_id: 34
aa4_id: 35
aa5_id: 36
aa6_id: 37
aa7_id: 38
aa8_id: 39
aa9_id: 40
aa10_id: 41
aa11_id: 42
aa12_id: 43
aa13_id: 44
aa14_id: 45
aa15_id: 46
aa16_id: 47
mapping_tunnel_id: 6
logic_tunnel_id: 7
Alarm_Folder_ID: 22cb4b50-5a61-4a07-b28c-bf9cfc2b0908
Alarm_Group_ID: 439bed5c-bd1e-4639-88f2-316e651b9733
Alarm_Group_Name: 报警组650
Alarm_Group_ID: 0cf8e3d3-169c-404d-99f3-b74ce5583a90
Alarm_Group_Name: 报警组727
Alarm_Grade_ID: ae27c0a3-e1fc-4743-bdca-b1ceab2bda5f
Alarm_Grade_Name: 报警等级947
Alarm_Grade_ID: d04e2cff-d87a-4786-9bae-5b544e0903c3
Alarm_Grade_Name: 报警等级295
Alarm_Category_ID: f43761e6-c87d-4be9-8931-5677361a68fd
GroupName: 报警类别组729
Alarm_Category_ID: d5e89c97-dade-4e33-ab5c-65fe90565288
GroupName: 报警类别组142
Alarm_Category_Item_ID: 64de0b96-eabd-4450-931c-2b76e8c50cd8
Alarm_Category_Item_Name: 更新类别项342
Alarm_Point_ID: 9a5416f4-4d73-4c8a-9404-ba7a89105ccd
Alarm_Point_ID: ddfd1786-dd61-4748-8bb3-4fcb620b8634
Folder_ID: 3124a9d2-cd26-49c5-a800-2666aaecc10e
Folder_ID: fce10f6c-022c-4cf0-941d-cdab41478ec4
Original_Table_ID: 5c93dc34-5fb1-4522-8d6d-fa59902a9479
Sort_ID: 2
Original_Table_ID: 79f6745c-22a3-457a-a0ed-df2694669fd0
Sort_ID: 2
Aggregation_Table_ID: 03414f6b-eaad-4abc-b913-c0d8a864e599
Aggregation_Table_ID: a0f4cca3-c9ed-44cd-a9c1-384719959d39
time_id: 记录时间
A2_id: FTF548c36132fd3491a982bf5ed8a27f4b5
Folder_ID1: ac8d9d4d-ac9e-41e4-86d1-3b9f4161b60c
Original_Table_Timing_Trigger_ID: 222957c3-4c6b-4d71-adb3-de3ee304b5a0
Original_Table_var_Trigger_ID: a7c9e606-ee46-4c9b-9373-706b93acb675
Original_Table_field_Trigger_ID: 6caaefb2-b11c-4979-a5e2-cf46aed706e0
Original_Table_change_Trigger_ID: cf2ccd33-b6d8-48e4-ab03-50bbcbcd6334
Original_Table_alarm_Trigger_ID: aa9d1df5-71c3-4cfd-acbb-aa26498cf9c7
Folder_ID2: d8864e5a-853e-408c-a696-4f6b17ab96a5
Aggregation_Table_Real_Time_Trigger_ID: 26bb671f-feb1-41e3-a6e5-756f5932d8e0
record_time_id: 记录时间
system_time_id: 记录时间
A1_id: FTF72183597bf84484ba5394c4202464b54
B1_id: FTF70e9c46a962e444eaca13dc138add1cd
G1_id: FTFd01eae3638e34e20b0835eba74f0dd12
H1_id: FTF6b998f051da94d6f9b7e9567f3a19f11
Aggregation_Table_Timing_Trigger_ID: 32e26551-2180-4de5-ba79-bfd89c00064d
record_time_id: 记录时间
system_time_id: 记录时间
A1_id: FTF72183597bf84484ba5394c4202464b54
B1_id: FTF70e9c46a962e444eaca13dc138add1cd
G1_id: FTFd01eae3638e34e20b0835eba74f0dd12
H1_id: FTF6b998f051da94d6f9b7e9567f3a19f11
Aggregation_Table_var_Trigger_ID: db8506d8-125b-4d5c-a2fd-18e2bb13c3c2
record_time_id: 记录时间
system_time_id: 记录时间
A1_id: FTF72183597bf84484ba5394c4202464b54
B1_id: FTF70e9c46a962e444eaca13dc138add1cd
G1_id: FTFd01eae3638e34e20b0835eba74f0dd12
H1_id: FTF6b998f051da94d6f9b7e9567f3a19f11
view_folder_id: 1
view_folder_delete_id: 2
view_folder_move_id: 3
move_view_id: 4
view_id: 5
view_delete_id: 6
view_delete_id1: 7
view_delete_id2: 8
move_view_id: 9
groupKey: 我的\图库组415
groupKey: 我的\重命名795
groupKey_delete: 我的\图库组90
imageName11: 11.jpeg
imageName22: 22.png
imageName33: 33.jpg
imageName44: 44.gif
imageName: 22 (1).png
history_folder_id: 91abc6d8-c8c9-4b1c-87a1-79a41f894363
history_folder_delete_id: fdbd0b81-c73b-414c-9ada-b24158b75adf
history_group_id: 5513e093-cbf8-4380-b34f-8bba9ed7d2c3
history_group_delete_id: 16de2a99-f073-4072-9c6a-514fb82a71af
language_id: 1
translate_id: 1
intn_id: 1
intn_id: 2
maptable_id: 1
copy_maptable_id: 2
query_maptable_id: 3
modify_maptable_id: 4
time_maptable_id: 5
var_maptable_id: 6
alarm_maptable_id: 7
sqlserver_intn_id: 3
sqlserver_maptable_id: 8
sqlserver_query_maptable_id: 9
sqlserver_modify_maptable_id: 10
sqlserver_time_maptable_id: 11
sqlserver_var_maptable_id: 12
sqlserver_alarm_maptable_id: 13
[pytest]
addopts=-vs --alluredir ./temp --clean-alluredir
testpaths=./testcase
python_files=test_*.py
python_classes=Test*
python_functions=test
\ No newline at end of file
import os
import jinja2
import yaml
import random
def render(tpl_path, **kwargs):
path, filename = os.path.split(tpl_path)
return jinja2.Environment(loader=jinja2.FileSystemLoader(path or './')
).get_template(filename).render(**kwargs)
# yaml 文件调用以下函数
def rand_str():
return str(random.randint(1000000, 2000000))
if __name__ == '__main__':
r = render("aa.yml", **{"rand_str": rand_str})
print(r)
print(yaml.safe_load(r))
\ No newline at end of file
<!DOCTYPE html>
<html dir="ltr">
<head>
<meta charset="utf-8">
<title>Allure Report</title>
<link rel="favicon" href="favicon.ico?v=2">
<link rel="stylesheet" type="text/css" href="styles.css">
<link rel="stylesheet" href="plugins/screen-diff/styles.css">
<link rel="stylesheet" href="plugins/custom-logo/styles.css">
</head>
<body>
<div id="alert"></div>
<div id="content">
<span class="spinner">
<span class="spinner__circle"></span>
</span>
</div>
<div id="popup"></div>
<script src="app.js"></script>
<script src="plugins/behaviors/index.js"></script>
<script src="plugins/packages/index.js"></script>
<script src="plugins/screen-diff/index.js"></script>
</body>
</html>
pytest
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures
allure-pytest
\ No newline at end of file
{"uuid": "340ea9e8-09b5-4cd9-84dd-cd7f0402c557", "befores": [{"name": "caseinfo", "status": "passed", "start": 1716363488474, "stop": 1716363488474}], "start": 1716363488474, "stop": 1716363488529}
\ No newline at end of file
- name: 比对工程id
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/${get_extract_data(project_id)}/checkprojectidmatch
method: post
files:
formFile: ${get_project_path()}\data\EngineeringManagement\205beta2备份.cmsbak
validate:
- equals: {status_code: 200}
- equals: {content: false}
\ No newline at end of file
- name: 创建工程副本
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/copyprojectnode
method: post
data:
parentId: ${get_extract_data(folder_id)}
path: C:\自动化工程
name: 工程副本${get_time_stamp()}
type: 1
rawProjectNodeID: ${get_extract_data(project_id)}
copyType: 0
extract:
copy_project_id: content
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 创建文件夹
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node
method: post
data:
name: 文件夹${get_random_number(1000,9999)}
type: 0
extract:
folder_id: content
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 创建工程
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node
method: post
data:
name: 工程${get_random_number(1000,9999)}
path: C:\自动化工程
type: 1
extract:
project_id: content
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 备份工程
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/data/backup/${get_extract_data(import_remoteproject_id)}/true
method: post
json:
["history","data","alarm","curve_root","curve_config","user_root","user_config","role_config","device_root","device_log","login_log","module_log"]
validate:
- equals: {status_code: 200}
- name: 删除工程
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/deletenodes
method: put
data:
ids: ${get_extract_data(import_remoteproject_id)}
isDeleteFile: true
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 远程导入工程文件
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/importremoteproject
method: post
files:
file: ${get_project_path2()}\data\EngineeringManagement\2.1.0工程(升级验证)_升2.2.cmsproj
extract:
import_remoteproject_id: id
validate:
- equals: {status_code: 200}
- contains: id
- name: 数据恢复
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/${get_extract_data(import_remoteproject_id)}/import
method: post
files:
formFile: ${get_project_path()}\data\EngineeringManagement\升级工程备份文件(CMS2.2.0).cmsbak
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 创建文件夹
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node
method: post
data:
name: 文件夹${get_random_number(1000,9999)}
type: 0
extract:
folder_id1: content
validate:
- equals: {status_code: 200}
- name: 删除文件夹
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/deletenodes
method: put
data:
ids: ${get_extract_data(folder_id1)}
isDeleteFile: true
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 创建工程
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node
method: post
data:
name: 工程${get_random_number(1000,9999)}
path: C:\自动化工程
type: 1
extract:
project_id2: content
validate:
- equals: {status_code: 200}
- name: 删除工程
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/deletenodes
method: put
data:
ids: ${get_extract_data(project_id2)}
isDeleteFile: true
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 创建工程
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node
method: post
data:
name: 删除工程保留路径下的文件${get_time_stamp()}
path: C:\自动化工程
type: 1
extract:
project_id1: content
validate:
- equals: {status_code: 200}
- name: 删除工程
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/deletenodes
method: put
data:
ids: ${get_extract_data(project_id1)}
isDeleteFile: false
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 查询
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/tree?rootId=&isOrderByDesc=false&orderFieldName=name&keyWord=副本
method: get
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 获取鉴权码
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/auth/requesttoken
method: post
json:
""
extract:
Authorization: content
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 获取工程信息
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/${get_extract_data(project_id)}/info
method: get
extract:
x_project: identifier
project_name: name
validate:
- equals: {status_code: 200}
- contains: id
\ No newline at end of file
- name: 获取工程树节点
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/tree
method: get
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 获取token
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/auth/requesttoken
method: post
json:
""
headers:
X-Project: ${get_extract_data(x_project)}
extract:
Authorization: content
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 获取当前软件版本
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/getcurrentversion
method: get
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 检查本地工程id是否冲突
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/checklocalprojectfileidconflict
method: post
data:
localFilePath: ${get_project_path2()}\data\EngineeringManagement\RC8.cmsproj
validate:
- equals: {status_code: 200}
- equals: {result: False}
- name: 导入本地工程文件
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/importlocalproject
method: post
data:
localFilePath: ${get_project_path2()}\data\EngineeringManagement\RC8.cmsproj
importConflictHandleType: 1
extract:
import_project_id: id
validate:
- equals: {status_code: 200}
- contains: id
- name: 删除工程
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/deletenodes
method: put
data:
ids: ${get_extract_data(import_project_id)}
isDeleteFile: false
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 检查远程工程id是否冲突
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/checkremoteprojectfileidconflict
method: post
files:
file: ${get_project_path2()}\data\EngineeringManagement\RC8.cmsproj
validate:
- equals: {status_code: 200}
- equals: {result: False}
- name: 远程导入工程文件
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/importremoteproject
method: post
files:
file: ${get_project_path2()}\data\EngineeringManagement\RC8.cmsproj
extract:
import_remoteproject_id: id
validate:
- equals: {status_code: 200}
- contains: id
- name: 删除工程
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/deletenodes
method: put
data:
ids: ${get_extract_data(import_remoteproject_id)}
isDeleteFile: false
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 移动工程节点
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/moveprojectnodes
method: put
data:
destNodeID: ${get_extract_data(folder_id)}
selectNodeIDs: ${get_extract_data(project_id)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 刷新列表
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/tree?rootId=&isOrderByDesc=false&orderFieldName=name&keyWord=
method: get
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 创建工程
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node
method: post
data:
name: 工程${get_random_number(1000,9999)}
path: C:\自动化工程
type: 1
extract:
project_id: content
validate:
- equals: {status_code: 200}
- name: 获取工程信息
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/${get_extract_data(project_id)}/info
method: get
extract:
x_project: identifier
project_name: name
validate:
- equals: {status_code: 200}
- contains: id
- name: 重命名工程名称
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/updatenode
method: put
data:
Name: 重命名工程${get_random_number(1000,9999)}
Path: C:\自动化工程\${get_extract_data(project_name)}.cmsproj
Type: 1
Id: ${get_extract_data(project_id)}
validate:
- equals: {status_code: 200}
- name: 删除工程
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/deletenodes
method: put
data:
ids: ${get_extract_data(project_id)}
isDeleteFile: true
validate:
- equals: {status_code: 200}
\ No newline at end of file
import allure
import pytest
import time
from common.parameters_util import read_testcase_file
from common.requests_util import RequestUtil
@allure.epic("CMS2.0")
@allure.feature("工程管理")
class TestCreat():
@allure.story("接口名称:重命名工程")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/1_EngineeringManagement/rename_project.yml'))
def test_rename_project(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
time.sleep(5)
@allure.story("接口名称:创建工程")
@pytest.mark.parametrize('caseinfo',read_testcase_file('/testcase/1_EngineeringManagement/creat_project.yml'))
def test_creat_project(self,caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:创建文件夹")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/1_EngineeringManagement/creat_folder.yml'))
def test_creat_folder(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:获取工程信息")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/1_EngineeringManagement/get_project_info.yml'))
def test_get_project_info(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:获取工程树节点")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/1_EngineeringManagement/get_project_tree.yml'))
def test_get_project_tree(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:移动工程到文件夹下")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/1_EngineeringManagement/move_project.yml'))
def test_move_project(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:删除工程并保留路径下的文件")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/1_EngineeringManagement/delete_project_pathreserve.yml'))
def test_delete_project_pathreserve(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:删除工程并删除路径下的文件")
@pytest.mark.parametrize('caseinfo',read_testcase_file('/testcase/1_EngineeringManagement/delete_project_pathdelete.yml'))
def test_delete_project_pathdelete(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:删除文件夹")
@pytest.mark.parametrize('caseinfo',read_testcase_file('/testcase/1_EngineeringManagement/delete_folder.yml'))
def test_delete_folder(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:创建工程副本")
@pytest.mark.parametrize('caseinfo',read_testcase_file('/testcase/1_EngineeringManagement/copy_project.yml'))
def test_copy_project(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:查询")
@pytest.mark.parametrize('caseinfo',read_testcase_file('/testcase/1_EngineeringManagement/find_node.yml'))
def test_find_node(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:刷新列表")
@pytest.mark.parametrize('caseinfo',read_testcase_file('/testcase/1_EngineeringManagement/refresh_node.yml'))
def test_refresh_node(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:导入本地工程文件")
@pytest.mark.parametrize('caseinfo',read_testcase_file('/testcase/1_EngineeringManagement/import_local_project.yml'))
def test_import_local_project(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:导入远程工程文件")
@pytest.mark.parametrize('caseinfo',read_testcase_file('/testcase/1_EngineeringManagement/import_remote_project.yml'))
def test_import_remote_project(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:获取当前软件版本")
@pytest.mark.parametrize('caseinfo',read_testcase_file('/testcase/1_EngineeringManagement/get_version.yml'))
def test_get_version(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:升级工程版本")
@pytest.mark.parametrize('caseinfo',read_testcase_file('/testcase/1_EngineeringManagement/upgrade_project_version.yml'))
def test_upgrade_project_version(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:比对工程id")
@pytest.mark.parametrize('caseinfo',
read_testcase_file('/testcase/1_EngineeringManagement/check_project_different_id.yml'))
def test_check_prject_id(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:数据恢复")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/1_EngineeringManagement/data_recovery.yml'))
def test_data_recovery(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
time.sleep(2)
@allure.story("接口名称:备份工程")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/1_EngineeringManagement/data_backup.yml'))
def test_data_backup(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
time.sleep(2)
@allure.story("接口名称:获取鉴权码")
@pytest.mark.parametrize('caseinfo',read_testcase_file('/testcase/1_EngineeringManagement/get_requesttoken.yml'))
def test_get_requesttoken(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
time.sleep(5)
- name: 更新节点-重命名工程
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/updatenode
method: put
data:
ParentId: null
Id: ${get_extract_data(project_id)}
Name: 重命名${get_random_number(1000,9999)}
Path: C:\自动化工程\${get_extract_data(project_name)}.cmsproj
Type: 1
validate:
- equals: {status_code: 200}
- contains: id
- contains: name
\ No newline at end of file
- name: 检查本地工程id是否冲突
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/checklocalprojectfileidconflict
method: post
data:
localFilePath: ${get_project_path2()}\data\EngineeringManagement\2.0.2测试兼容性.cmsproj
validate:
- equals: {status_code: 200}
- equals: {result: False}
- name: 导入本地低版本工程文件
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/importlocalproject
method: post
data:
localFilePath: ${get_project_path2()}\data\EngineeringManagement\2.0.2测试兼容性.cmsproj
importConflictHandleType: 1
extract:
import_low_project_id: id
validate:
- equals: {status_code: 200}
- name: 升级工程
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/updateprojectfile
method: put
data:
id: ${get_extract_data(import_low_project_id)}
isKeepOldFile: true
validate:
- equals: {status_code: 200}
- name: 删除升级后的工程
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/node/deletenodes
method: put
data:
ids: ${get_extract_data(import_low_project_id)}
isDeleteFile: true
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 开始时间不可大于结束时间
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/base/shift
method: put
json:
{"count":1,"startTime":{"isNextDay":false,"time":"08:00"},"endTime":{"isNextDay":false,"time":"07:00"},"shifts":[{"id":0,"shiftName":"班次1","startTime":{"isNextDay":false,"time":"08:00"},"endTime":{"isNextDay":false,"time":"07:00"}}]}
headers:
X-Project: ${get_extract_data(x_project)}
validate:
- equals: {status_code: 400}
- equals: {code: 400}
- equals: {msg: 班次开始时间大于结束时间}
\ No newline at end of file
- name: 班次开始时间不能小于上一个班次结束时间
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/base/shift
method: put
json:
{"count":2,"startTime":{"isNextDay":false,"time":"08:00"},"endTime":{"isNextDay":true,"time":"08:00"},"shifts":[{"shiftName":"早班","startTime":{"isNextDay":false,"time":"08:00"},"endTime":{"isNextDay":false,"time":"20:00"},"id":0},{"shiftName":"晚班","startTime":{"isNextDay":false,"time":"18:00"},"endTime":{"isNextDay":true,"time":"08:00"},"id":1}]}
headers:
X-Project: ${get_extract_data(x_project)}
validate:
- equals: {status_code: 400}
- equals: {code: 400}
- equals: {msg: 班次开始时间小于上一班次结束时间}
\ No newline at end of file
- name: 创建跨天班次
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/base/shift
method: put
json:
{"count":2,"startTime":{"isNextDay":false,"time":"08:00"},"endTime":{"isNextDay":true,"time":"08:00"},"shifts":[{"shiftName":"早班","startTime":{"isNextDay":false,"time":"08:00"},"endTime":{"isNextDay":false,"time":"20:00"},"id":0},{"shiftName":"晚班","startTime":{"isNextDay":false,"time":"20:00"},"endTime":{"isNextDay":true,"time":"08:00"},"id":1}]}
headers:
X-Project: ${get_extract_data(x_project)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 获取班次配置
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/base/shift
method: get
headers:
X-Project: ${get_extract_data(x_project)}
validate:
- equals: {status_code: 200}
- equals: {status_code: 200}
\ No newline at end of file
import allure
import pytest
from common.parameters_util import read_testcase_file
from common.requests_util import RequestUtil
@allure.epic("CMS2.0")
@allure.feature("基础管理")
class TestCreat():
@allure.story("接口名称:创建跨天班次")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/2_BasicManagement/creat_classes.yml'))
def test_creat_classes(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:获取班次配置")
@pytest.mark.parametrize('caseinfo',
read_testcase_file('/testcase/2_BasicManagement/get_classes_info.yml'))
def test_get_classes_info(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:创建班次-开始时间不可大于结束时间")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/2_BasicManagement/Start_time_gt_end_time.yml'))
def test_Start_time_gt_end_time(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:创建班次-班次开始时间不能小于上一个班次结束时间")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/2_BasicManagement/Start_time_lt_classes_end_time.yml'))
def test_Start_time_lt_classes_end_time(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
\ No newline at end of file
- name: 批量删除io变量
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/variable/tunnel/${get_extract_data(io_tunnel_id)}/tag/
method: delete
json:
- ${get_extract_data(io_variable_id)}
headers:
X-Project: ${get_extract_data(x_project)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 创建内部变量组
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/variable/tunnel/${get_extract_data(inner_tunnel_id)}/group
method: post
json:
{"name":"内部组1"}
headers:
X-Project: ${get_extract_data(x_project)}
extract:
inner_group_id: id
validate:
- equals: {status_code: 200}
- contains: id
- name: 校验内部变量组-变量组为空
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/variable/tunnel/${get_extract_data(inner_tunnel_id)}/group
method: post
json:
{"name":""}
headers:
X-Project: ${get_extract_data(x_project)}
validate:
- equals: {status_code: 400}
- equals: {content: 变量组名称不能为空}
- name: 校验内部变量组-变量组重复
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/variable/tunnel/${get_extract_data(inner_tunnel_id)}/group
method: post
json:
{"name":"内部组1"}
headers:
X-Project: ${get_extract_data(x_project)}
validate:
- equals: {status_code: 400}
- equals: {content: 变量组名称不能重复}
- name: 删除内部变量组
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/variable/tunnel/${get_extract_data(inner_tunnel_id)}/group/${get_extract_data(inner_group_id)}
method: delete
headers:
X-Project: ${get_extract_data(x_project)}
validate:
- equals: {status_code: 200}
- name: 创建内部通道1
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/variable/tunnel
method: post
json:
{"type":3,"name":"内部通道1","description":"","config":null}
headers:
X-Project: ${get_extract_data(x_project)}
extract:
inner_tunnel_id: id
validate:
- equals: {status_code: 200}
- contains: id
- name: 校验内部通道必填项-通道名为空
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/variable/tunnel
method: post
json:
type: 3
name: ""
description: ""
config: null
headers:
X-Project: ${get_extract_data(x_project)}
validate:
- equals: {status_code: 400}
- equals: {content: 通道名称不能为空}
- name: 校验内部通道必填项-通道名重复
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/variable/tunnel
method: post
json:
type: 3
name: "内部通道1"
description: ""
config: null
headers:
X-Project: ${get_extract_data(x_project)}
validate:
- equals: {status_code: 400}
- equals: {content: 通道名称不能重复}
- name: 删除通道1
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/variable/tunnel/${get_extract_data(inner_tunnel_id)}
method: delete
headers:
X-Project: ${get_extract_data(x_project)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment