Commit d93e7c1d authored by 王超's avatar 王超

第一次提交9.12

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
import json
import re
import traceback
import requests
import jsonpath
from common.logger_util import write_log, error_log
from common.yaml_util import read_config_file, read_extract_file, write_extract_file
from common.mysql_util import MysqlrUtil
from debug_talk import DubugTalk
#取消缩进: shift + tab
class RequestUtil():
session = requests.session()
def __init__(self,):
self.base_url =""
self.last_headers = {}
self.res_fomat = 0
# 列表数据解析为非字符串类型
def list_load(self,data):
list_data = []
list_index = 0
for data_dot in data:
if isinstance(data_dot, dict):
# print("=========字典============:",data_dot)
for key, value in dict(data_dot).items():
# print("key:",key,"value:",value)
int_value = 0
if isinstance(value,str):
if 'ddt{{' in value and '}}' in value:
new_value = value[5:-2]
if new_value.lower() == 'false':
int_value = False
elif new_value.lower() == 'true':
int_value = True
elif '.' in new_value:
int_value = float(new_value)
elif "" == new_value or 'null' == new_value:
int_value = None
elif '[]' == new_value:
int_value = []
else:
int_value = int(new_value)
data[list_index][key] = int_value
# 不存在ddt{{}}格式就直接返回
else:
data[list_index][key] = value
elif isinstance(value,dict):
self.int_load(value)
else:
data[list_index][key] = value
elif isinstance(data_dot, list):
print("列表内嵌套列表,暂不支持")
########暂时没有这种类型,暂不处理#########
else:
# =====非字典和列表格式=======
if 'ddt{{' in data_dot and '}}' in data_dot:
new_value = data_dot[5:-2]
if new_value.lower() == 'false':
int_value = False
elif new_value.lower() == 'true':
int_value = True
elif '.' in new_value:
int_value = float(new_value)
elif "" == new_value or 'null' == new_value:
int_value = None
elif '[]' == new_value:
int_value = []
else:
int_value = int(new_value)
data[list_index] = int_value
else:
data[list_index] = data_dot
list_index += 1
return data
# 解析为非字符串类型
def int_load(self,data):
str_data = json.dumps(data)
if 'ddt{{' in str_data and '}}' in str_data:
# data是dict格式
if isinstance(data, dict):
for key, value in dict(data).items():
int_value = 0
# 嵌套列表
if isinstance(value, list):
list_data = self.list_load(value)
data[key] = list_data
else:
value = str(value)
if 'ddt{{' in value and '}}' in value:
new_value = value[5:-2]
if new_value.lower() == 'false':
int_value = False
elif new_value.lower() == 'true':
int_value = True
elif '.' in new_value:
int_value = float(new_value)
elif "" == new_value or 'null' == new_value:
int_value = None
elif '[]' == new_value:
int_value = []
else:
int_value = int(new_value)
data[key] = int_value
return data
# data是list格式
if isinstance(data, list):
data = self.list_load(data)
return data
# 不存在ddt{{}}格式就直接返回
else:
return data
# 热加载替换解析
def replace_load(self, data):
# 不管是什么类型统一转化成字符串格式
if data and isinstance(data, dict):
str_data = json.dumps(data)
elif data and isinstance(data,list):
str_data = json.dumps(data)
else:
str_data = data
# 替换值
for i in range(1, str_data.count('${') + 1):
if '${' in str_data and '}' in str_data:
start = str_data.index('${')
end = str_data.index('}', start)
old_value = str_data[start:end + 1]
func_name = old_value[2:old_value.index('(')]
args_value = old_value[old_value.index('(') + 1:old_value.index(')')]
if len(args_value)==0:
new_value = getattr(DubugTalk(), func_name)()
else:
new_value = getattr(DubugTalk(), func_name)(*args_value.split(','))
str_data = str_data.replace(old_value, str(new_value))
# 还原数据类型
# print("===========解析后:",str_data)
if data and isinstance(data, dict):
data = json.loads(str_data)
data = self.int_load(data)
elif data and isinstance(data,list):
data = json.loads(str_data)
data = self.int_load(data)
else:
data = str_data
# 返回
return data
# 规范YAML测试用例文件的写法
def analysis_yaml(self, caseinfo: object) -> object:
# print("==========caseinfo:",caseinfo)
try:
# 1.必须有的四个一级关键字:name,base_url,request,validate
caseinfo_keys = dict(caseinfo).keys()
if 'name' in caseinfo_keys and 'base_url' in caseinfo_keys and 'request' in caseinfo_keys and 'validate' in caseinfo_keys:
# 2.在request一级关键字下必须包括两个二级关键字:method,url
request_keys = dict(caseinfo['request']).keys()
if 'method' in request_keys and 'url' in request_keys:
# 参数(param,data,json),请求头,文件上传这些都不能约束
self.base_url = caseinfo['base_url']
name = caseinfo['name']
method = caseinfo['request'].pop('method')
# url = caseinfo['request']['url']
url = caseinfo['request'].pop('url')
headers = None
if jsonpath.jsonpath(caseinfo, '$..headers'):
headers = caseinfo['request']['headers']
del caseinfo['request']['headers']
files = None
if jsonpath.jsonpath(caseinfo, '$..files'):
files = caseinfo['request']['files']
for key,value in dict(files).items():
files_value = self.replace_load(value)
files[key] = open(files_value,'rb')
del caseinfo['request']['files']
res = self.send_request(name =name,method=method,
url=url,
headers=headers, files=files,
**caseinfo['request'])
# '----------------------------------------------------------------------------'
status_code = res.status_code
try:
return_data = res.json() # json提取
return_text = json.dumps(return_data)
except:
self.res_fomat = 1
# 接口关联的变量,既支持正则表达式,也支持json提取
if self.res_fomat == 0:
return_data = res.json() # json提取
return_text = json.dumps(return_data)
if 'extract' in caseinfo:
for key, value in dict(caseinfo['extract']).items():
# 正则表达式
if '(.+?)' in value or '(.*?)' in value:
ze_value = re.findall(value, return_text)
if ze_value:
extract_data = {key: ze_value[1]}
write_extract_file(extract_data)
elif value == "content":
if isinstance(return_data,list):
extract_data = {key: return_data[0]}
write_extract_file(extract_data)
elif isinstance(return_data,dict):
extract_data = {key: return_data}
write_extract_file(extract_data)
else:
extract_data = {key: return_data}
write_extract_file(extract_data)
# json、list提取
else:
if isinstance(return_data, list):
value_data = str(value).split('.')
key_data = value_data[0]
value_data = int(value_data[1])
extract_data = {key: return_data[value_data][key_data]}
write_extract_file(extract_data)
elif isinstance(return_data, dict):
if "." in str(value):
# 仅针对key加索引类型,如:originalId.0
key_list = str(value).split('.')
value1 = key_list[0]
value2 = int(key_list[1])
value_list = jsonpath.jsonpath(return_data, '$..%s' % value1)
extract_data = {key: value_list[value2]}
write_extract_file(extract_data)
else:
value_data = jsonpath.jsonpath(return_data, '$..%s' % value)
# print("++++++++++++:",value_data)
extract_data = {key: value_data[0]}
write_extract_file(extract_data)
# 断言封装
yq_result = caseinfo['validate']
# print("实际结果:",return_data)
self.validate_result(yq_result, return_data, status_code)
else:
return_text = res.text # 正则提取
if 'extract' in caseinfo:
for key, value in dict(caseinfo['extract']).items():
# 正则表达式
if '(.+?)' in value or '(.*?)' in value:
ze_value = re.findall(value, return_text)
if ze_value:
extract_data = {key: ze_value[1]}
write_extract_file(extract_data)
elif value == "content":
extract_data = {key: return_text}
write_extract_file(extract_data)
# 断言封装
yq_result = caseinfo['validate']
self.validate_result(yq_result, return_text, status_code)
else:
error_log('2.在request一级关键字下必须包括两个二级关键字:method,url')
else:
error_log("1.必须有的四个一级关键字:name,base_url,request,validate")
except Exception as f:
error_log("分析YAML文件异常:异常信息: %s" % str(traceback.format_exc()))
# # 统一替换方法,data可以是url(string),也可以是参数(字典,字典中包含有列表),也可以是有请求头(字典)
# def replace_value(self, data):
# # 不管是什么类型统一转化成字符串格式
# if data and isinstance(data, dict): # 如果data不为空并且data的类型是一个字典
# str_data = json.dumps(data)
# else:
# str_data = data
#
# # 替换值
# for i in range(1, str_data.count('{{') + 1):
# if '{{' in str_data and '}}' in str_data:
# start = str_data.index('{{')
# end = str_data.index('}}', start)
# old_value = str_data[start:end + 2]
# new_value = read_extract_file(old_value[2:-2])
# str_data = str_data.replace(old_value, new_value)
#
# # 还原数据类型
# if data and isinstance(data, dict):
# data = json.loads(str_data)
# else:
# data = str_data
#
# # 返回
# return data
# 统一发送请求的方法
def send_request(self, name, method, url, headers=None,file=None,**kwargs):
try:
# 处理method
self.last_method = str(method).lower()
# 处理基础路径
self.base_url = self.replace_load(self.base_url) + self.replace_load(url)
# 处理请求头
if headers and isinstance(headers, dict):
self.last_headers = self.replace_load(headers)
# 处理请求数据,可能是params,data,json
for key, value in kwargs.items():
if key in ['params', 'data', 'json']:
kwargs[key] = self.replace_load(value)
# 收集日志
write_log("\n-------------接口请求开始-----------")
write_log("接口名称:%s"%name)
write_log("接口方式:%s"%self.last_method)
write_log("接口路径:%s"%self.base_url)
write_log("请求头:%s"%self.last_headers)
if 'params' in kwargs.keys():
write_log("请求参数:%s"%kwargs['params'])
elif 'data' in kwargs.keys():
write_log("请求参数:%s"%kwargs['data'])
elif 'json' in kwargs.keys():
write_log("请求参数:%s"%kwargs['json'])
write_log("文件上传:%s"%file)
# 发送请求s
res = RequestUtil.session.request(method=self.last_method, url=self.base_url, headers=self.last_headers, **kwargs)
return res
except Exception as f:
error_log("发送请求异常:异常信息: %s" % str(traceback.format_exc()))
#断言封装
def validate_result(self,yq_result,sj_result,status_code):
try:
"""
:param yq_result: 预期结果
:param sj_result: 实际结果
:param status_code: 实际返回的状态码
:return:
"""
#解析
yq_result = self.replace_load(yq_result)
yq_result_list = []
#断言是否成功的标记:0是成功,其他失败
# print('预期结果:',yq_result)
# print('实际结果:',sj_result,status_code)
flag = 0
#解析
if yq_result and isinstance(yq_result,list):
# print("预期结果:",yq_result)
for yq in yq_result:
#断言参数解析
yq = self.replace_load(yq)
for key,value in dict(yq).items():
#等于断言
if key=='equals':
for assert_key,assert_value in dict(value).items():
# print("=====assert_key:",assert_key,"assert_value:",assert_value,"status_code: ",status_code)
if assert_key=="status_code":
if status_code != assert_value:
flag = flag + 1
error_log("断言失败:"+assert_key+"不等于"+str(assert_value))
elif assert_key == "content":
if sj_result != assert_value:
flag = flag + 1
error_log("断言失败:" + assert_key + "不等于" + str(assert_value))
else:
#根据key提取所有value
value_list = jsonpath.jsonpath(sj_result,'$..%s'%assert_key)
# print("实际结果key_list:",value_list)
# print("预期结果assert_value:", assert_value)
if value_list:
if assert_value not in value_list:
flag + flag+1
error_log("断言失败:" + assert_key + "不等于" + str(assert_value))
else:
flag = flag+1
error_log("断言失败:返回结果中不存在:"+assert_key)
elif key=='not_equals':
for assert_key,assert_value in dict(value).items():
# print("assert_key:",assert_key,"assert_value:",assert_value)
if assert_key=="status_code":
if status_code==assert_value:
flag = flag + 1
error_log("断言失败:"+assert_key+"等于"+str(assert_value))
elif assert_key == "content":
if sj_result == assert_value:
flag = flag + 1
error_log("断言失败:" + assert_key + "等于" + str(assert_value))
else:
#根据key提取所有value
value_list = jsonpath.jsonpath(sj_result,'$..%s'%assert_key)
# print("实际结果key_list:",value_list)
# print("预期结果assert_value:", assert_value)
if value_list:
if assert_value in value_list:
flag + flag+1
error_log("断言失败:" + assert_key + "等于" + str(assert_value))
else:
flag = flag+1
error_log("断言失败:返回结果中存在:"+assert_key)
#包含断言
elif key=="contains":
if isinstance(sj_result,str):
if value not in sj_result:
flag = flag + 1
error_log("断言失败:返回结果不包含字符串:" + value)
else:
if value not in json.dumps(sj_result):
flag = flag + 1
error_log("断言失败:返回结果不包含字符串:" + value)
elif key=="not_contain":
if isinstance(sj_result,str):
if value in sj_result:
flag = flag + 1
error_log("断言失败:返回结果包含字符串:" + value)
else:
if value in json.dumps(sj_result):
flag = flag + 1
error_log("断言失败:返回结果包含字符串:" + value)
#数据库断言
elif key == "mysql":
for assert_key, assert_value in dict(value).items():
if assert_key=="gt":
data = MysqlrUtil().sql(assert_value)
if len(data)==0:
flag = flag + 1
error_log("断言失败:"+assert_key+"不等于"+str(assert_value))
#数值大于
elif key == "greater_than":
for assert_key, assert_value in dict(value).items():
key_list = jsonpath.jsonpath(sj_result, '$..%s' % assert_key)
# print("key_list:",key_list)
# print("实际结果key_list:",key_list,type(key_list[0]))
# print("预期结果assert_value:", assert_value,type(assert_value))
#取列表中第一条数据进行判断
if key_list:
if assert_value > key_list[0]:
flag + flag + 1
error_log("断言失败:" + assert_key + "不大于" + str(assert_value))
else:
flag = flag + 1
error_log("断言失败:返回结果中不存在:" + assert_key)
# 字符串长度大于
elif key == "length_greater_than":
for assert_key, assert_value in dict(value).items():
key_list = jsonpath.jsonpath(sj_result, '$..%s' % assert_key)
# print("key_list:",key_list)
# print("实际结果key_list:",key_list,type(key_list[0]))
# print("预期结果assert_value:", assert_value,type(assert_value))
#取列表中第一条数据进行判断
if key_list:
if assert_value > len(key_list[0]):
flag + flag + 1
error_log("断言失败:" + assert_key + "不大于" + str(assert_value))
else:
flag = flag + 1
error_log("断言失败:返回结果中不存在:" + assert_key)
else:
error_log("框架不支持该断言方式")
yq_result_list.append(yq)
# 收集日志
write_log('预期结果:%s' % yq_result_list)
write_log('实际结果:%s' % sj_result)
assert flag==0
write_log("接口请求成功!")
write_log("\n-------------接口请求结束-----------\n")
except Exception as f:
write_log('实际结果:%s' % sj_result)
write_log("接口请求失败!")
write_log("-------------接口请求结束-----------\n")
error_log("断言异常:异常信息: %s" % str(traceback.format_exc()))
if __name__ == '__main__':
list_data2 = {'realTime': 'ddt{{false}}', 'triggers': [
{'effectiveDateTime': 'ddt{{false}}', 'frequencyValue': 'ddt{{1}}', 'freq': 'ddt{{77.77}}', 'freqstr': '',
'condition': 'A1==100'}]}
dict_data = {'effectiveDateTime': 'ddt{{false}}', 'frequencyValue': 'ddt{{1}}', 'freq': 'ddt{{77.77}}',
'freqstr': '', 'condition': 'A1==100'}
list_data = [
{'effectiveDateTime': 'ddt{{false}}', 'frequencyValue': 'ddt{{1}}', 'freq': 'ddt{{77.77}}', 'freqstr': '',
'condition': 'A1==100'},
{'effectiveDateTime': 'ddt{{false}}', 'frequencyValue': 'ddt{{1}}', 'freq': 'ddt{{77.77}}', 'freqstr': '',
'condition': 'A1==100'}]
dict_data2 = {'effectiveDateTime': False, 'frequencyValue': 1, 'freq': 77.77, 'freqstr': '', 'condition': 'A1==100'}
list_data3 = ['ddt{{false}}', 'ddt{{77.77}}', 'freqstr']
dict_data3 = {'realTime': False, 'triggers': [{'effectiveDateTime': '', 'frequencyValue': 'ddt{{1}}', 'frequencyUnit': 2, 'matchAll': False, 'condition': 'A1==100', 'conditionDetail': 1, 'frequencyCheck': False, 'triggerType': 2}]}
dict_data4 = {'realTime': 'ddt{{$csv{realTime}}}', 'triggers': [{'effectiveDateTime': '2023-05-22T06:15:31.000Z', 'frequencyValue': 'ddt{{1}}', 'frequencyUnit': 'ddt{{1}}', 'matchAll': 'ddt{{false}}', 'condition': '', 'conditionDetail': 'ddt{{1}}', 'frequencyCheck': 'ddt{{false}}', 'triggerType': 'ddt{{1}}'}]}
list_data5 = [{'archiveSetting': None, 'groupId': 51, 'name': '', 'description': '校验变量名为空', 'typeName': '有符号8位整型', 'config': {'readWriteMode': 0, 'address': '400001', 'interval': 'ddt{{10000}}'}, 'stringLength': 'null', 'zoom': 1, 'digit': None, 'readWriteRule': 1, 'index': 1}]
shijijieguo = [{'_id': 3, '记录时间': '2023-10-09 14:49:48', '__$按年分组_year': '2023-01-01 00:00:00', '__$按年分组_month': '2023-01-01 00:00:00', '__$按年分组_day': '2023-01-01 00:00:00', '__$按年分组_hour': '2023-01-01 00:00:00', '__$按年分组_minute': '2023-01-01 00:00:00', '__$按年分组_quarter': '2023-01-01 00:00:00', '__$按年分组_week': '2022-12-26 00:00:00', '__$按季度分组_year': '2023-01-01 00:00:00', '__$按季度分组_month': '2023-10-01 00:00:00', '__$按季度分组_day': '2023-10-01 00:00:00', '__$按季度分组_hour': '2023-10-01 00:00:00', '__$按季度分组_minute': '2023-10-01 00:00:00', '__$按季度分组_quarter': '2023-10-01 00:00:00', '__$按季度分组_week': '2023-09-25 00:00:00', '__$按月分组_year': '2023-01-01 00:00:00', '__$按月分组_month': '2023-10-01 00:00:00', '__$按月分组_day': '2023-10-01 00:00:00', '__$按月分组_hour': '2023-10-01 00:00:00', '__$按月分组_minute': '2023-10-01 00:00:00', '__$按月分组_quarter': '2023-10-01 00:00:00', '__$按月分组_week': '2023-09-25 00:00:00', '__$按周分组_year': '2023-01-01 00:00:00', '__$按周分组_month': '2023-10-01 00:00:00', '__$按周分组_day': '2023-10-09 00:00:00', '__$按周分组_hour': '2023-10-09 00:00:00', '__$按周分组_minute': '2023-10-09 00:00:00', '__$按周分组_quarter': '2023-10-01 00:00:00', '__$按周分组_week': '2023-10-09 00:00:00', '__$按日分组_year': '2023-01-01 00:00:00', '__$按日分组_month': '2023-10-01 00:00:00', '__$按日分组_day': '2023-10-09 00:00:00', '__$按日分组_hour': '2023-10-09 00:00:00', '__$按日分组_minute': '2023-10-09 00:00:00', '__$按日分组_quarter': '2023-10-01 00:00:00', '__$按日分组_week': '2023-10-09 00:00:00', '__$按小时分组_year': '2023-01-01 00:00:00', '__$按小时分组_month': '2023-10-01 00:00:00', '__$按小时分组_day': '2023-10-09 00:00:00', '__$按小时分组_hour': '2023-10-09 14:00:00', '__$按小时分组_minute': '2023-10-09 14:00:00', '__$按小时分组_quarter': '2023-10-01 00:00:00', '__$按小时分组_week': '2023-10-09 00:00:00', '__$按分钟分组_year': '2023-01-01 00:00:00', '__$按分钟分组_month': '2023-10-01 00:00:00', '__$按分钟分组_day': '2023-10-09 00:00:00', '__$按分钟分组_hour': '2023-10-09 14:00:00', '__$按分钟分组_minute': '2023-10-09 14:49:00', '__$按分钟分组_quarter': '2023-10-01 00:00:00', '__$按分钟分组_week': '2023-10-09 00:00:00', '__$系统时间_year': '2023-01-01 00:00:00', '__$系统时间_month': '2023-10-01 00:00:00', '__$系统时间_day': '2023-10-09 00:00:00', '__$系统时间_hour': '2023-10-09 14:00:00', '__$系统时间_minute': '2023-10-09 14:49:00', '__$系统时间_quarter': '2023-10-01 00:00:00', '__$系统时间_week': '2023-10-09 00:00:00', '__$DATE1_year': '2023-01-01 00:00:00', '__$DATE1_month': '2023-06-01 00:00:00', '__$DATE1_day': '2023-06-19 00:00:00', '__$DATE1_hour': '2023-06-19 00:00:00', '__$DATE1_minute': '2023-06-19 00:00:00', '__$DATE1_quarter': '2023-04-01 00:00:00', '__$DATE1_week': '2023-06-19 00:00:00', '__$TODAY1_year': '2023-01-01 00:00:00', '__$TODAY1_month': '2023-10-01 00:00:00', '__$TODAY1_day': '2023-10-09 00:00:00', '__$TODAY1_hour': '2023-10-09 00:00:00', '__$TODAY1_minute': '2023-10-09 00:00:00', '__$TODAY1_quarter': '2023-10-01 00:00:00', '__$TODAY1_week': '2023-10-09 00:00:00', '按年分组': '2023', '按季度分组': '2023-04', '按月分组': '2023-10', '按周分组': '2023-42', '按日分组': '2023-10-09', '按小时分组': '2023-10-09 14', '按分钟分组': '2023-10-09 14:49', 'A1': 528.0, 'B1': 3717.888, 'G1': 48.0, 'ROUND1': 3717.9, 'ROUNDUP1': 3717.9, 'ROUNDDOWN1': 3717.8, 'SUM1': 4245.888, 'AVERAGE1': 2122.944, 'COUNT1': 2.0, 'COUNTA1': 2.0, 'MAX1': 3717.888, 'MEDIAN1': 2122.944, 'MIN1': 528.0, 'ABS1': 3717.888, 'max_B1': 3717.888, 'min_B1': 3717.888, '系统时间': '2023-10-09 14:49:47', 'DATE1': '2023-06-19 00:00:00', 'DATEDIF1': '1', 'DAY1': '9', 'DAYS1': '18', 'HOUR1': '14', 'MINUTE1': '49', 'MONTH1': '10', 'NOW1': '2023-10-09 14:49:48', 'SECOND1': '47', 'YEAR1': '2023', 'TODAY1': '2023-10-09 00:00:00', '差值年': 3.0, '差值月': 5.0, '差值天': 26.0, '差值时': 9.0, '差值分': 15.0, '差值秒': 20.0, 'H1': 'Abcf', 'CHAR1': '\\', 'CONCATENATE1': 'Abcf123', 'LEFT2': 'Ab', 'LEN1': '4', 'LOWER1': 'abcf', 'MID12': 'Ab', 'REPLACE1': '替换cf', 'RIGHT1': 'cf', 'TODATE1': '2023-06-19 00:00:00', 'TRIM1': 'Abcf', 'UPPER1': 'ABCF', '去空格后长度': '4', 'AND1': '0', 'FALSE1': '0', 'TRUE1': '1', 'IF1': '及格', 'NOT_true1': '0', 'NOT_false1': '1', 'OR1': '0'}, {'_id': 2, '记录时间': '2023-10-09 14:49:48', '__$按年分组_year': '2023-01-01 00:00:00', '__$按年分组_month': '2023-01-01 00:00:00', '__$按年分组_day': '2023-01-01 00:00:00', '__$按年分组_hour': '2023-01-01 00:00:00', '__$按年分组_minute': '2023-01-01 00:00:00', '__$按年分组_quarter': '2023-01-01 00:00:00', '__$按年分组_week': '2022-12-26 00:00:00', '__$按季度分组_year': '2023-01-01 00:00:00', '__$按季度分组_month': '2023-10-01 00:00:00', '__$按季度分组_day': '2023-10-01 00:00:00', '__$按季度分组_hour': '2023-10-01 00:00:00', '__$按季度分组_minute': '2023-10-01 00:00:00', '__$按季度分组_quarter': '2023-10-01 00:00:00', '__$按季度分组_week': '2023-09-25 00:00:00', '__$按月分组_year': '2023-01-01 00:00:00', '__$按月分组_month': '2023-10-01 00:00:00', '__$按月分组_day': '2023-10-01 00:00:00', '__$按月分组_hour': '2023-10-01 00:00:00', '__$按月分组_minute': '2023-10-01 00:00:00', '__$按月分组_quarter': '2023-10-01 00:00:00', '__$按月分组_week': '2023-09-25 00:00:00', '__$按周分组_year': '2023-01-01 00:00:00', '__$按周分组_month': '2023-10-01 00:00:00', '__$按周分组_day': '2023-10-09 00:00:00', '__$按周分组_hour': '2023-10-09 00:00:00', '__$按周分组_minute': '2023-10-09 00:00:00', '__$按周分组_quarter': '2023-10-01 00:00:00', '__$按周分组_week': '2023-10-09 00:00:00', '__$按日分组_year': '2023-01-01 00:00:00', '__$按日分组_month': '2023-10-01 00:00:00', '__$按日分组_day': '2023-10-09 00:00:00', '__$按日分组_hour': '2023-10-09 00:00:00', '__$按日分组_minute': '2023-10-09 00:00:00', '__$按日分组_quarter': '2023-10-01 00:00:00', '__$按日分组_week': '2023-10-09 00:00:00', '__$按小时分组_year': '2023-01-01 00:00:00', '__$按小时分组_month': '2023-10-01 00:00:00', '__$按小时分组_day': '2023-10-09 00:00:00', '__$按小时分组_hour': '2023-10-09 14:00:00', '__$按小时分组_minute': '2023-10-09 14:00:00', '__$按小时分组_quarter': '2023-10-01 00:00:00', '__$按小时分组_week': '2023-10-09 00:00:00', '__$按分钟分组_year': '2023-01-01 00:00:00', '__$按分钟分组_month': '2023-10-01 00:00:00', '__$按分钟分组_day': '2023-10-09 00:00:00', '__$按分钟分组_hour': '2023-10-09 14:00:00', '__$按分钟分组_minute': '2023-10-09 14:48:00', '__$按分钟分组_quarter': '2023-10-01 00:00:00', '__$按分钟分组_week': '2023-10-09 00:00:00', '__$系统时间_year': '2023-01-01 00:00:00', '__$系统时间_month': '2023-10-01 00:00:00', '__$系统时间_day': '2023-10-09 00:00:00', '__$系统时间_hour': '2023-10-09 14:00:00', '__$系统时间_minute': '2023-10-09 14:48:00', '__$系统时间_quarter': '2023-10-01 00:00:00', '__$系统时间_week': '2023-10-09 00:00:00', '__$DATE1_year': '2023-01-01 00:00:00', '__$DATE1_month': '2023-06-01 00:00:00', '__$DATE1_day': '2023-06-19 00:00:00', '__$DATE1_hour': '2023-06-19 00:00:00', '__$DATE1_minute': '2023-06-19 00:00:00', '__$DATE1_quarter': '2023-04-01 00:00:00', '__$DATE1_week': '2023-06-19 00:00:00', '__$TODAY1_year': '2023-01-01 00:00:00', '__$TODAY1_month': '2023-10-01 00:00:00', '__$TODAY1_day': '2023-10-09 00:00:00', '__$TODAY1_hour': '2023-10-09 00:00:00', '__$TODAY1_minute': '2023-10-09 00:00:00', '__$TODAY1_quarter': '2023-10-01 00:00:00', '__$TODAY1_week': '2023-10-09 00:00:00', '按年分组': '2023', '按季度分组': '2023-04', '按月分组': '2023-10', '按周分组': '2023-42', '按日分组': '2023-10-09', '按小时分组': '2023-10-09 14', '按分钟分组': '2023-10-09 14:48', 'A1': 660.0, 'B1': 4647.36, 'G1': 60.0, 'ROUND1': 4647.4, 'ROUNDUP1': 4647.4, 'ROUNDDOWN1': 4647.3, 'SUM1': 5307.36, 'AVERAGE1': 2653.68, 'COUNT1': 2.0, 'COUNTA1': 2.0, 'MAX1': 4647.36, 'MEDIAN1': 2653.68, 'MIN1': 660.0, 'ABS1': 4647.36, 'max_B1': 4647.36, 'min_B1': 4647.36, '系统时间': '2023-10-09 14:48:59', 'DATE1': '2023-06-19 00:00:00', 'DATEDIF1': '1', 'DAY1': '9', 'DAYS1': '18', 'HOUR1': '14', 'MINUTE1': '48', 'MONTH1': '10', 'NOW1': '2023-10-09 14:49:48', 'SECOND1': '59', 'YEAR1': '2023', 'TODAY1': '2023-10-09 00:00:00', '差值年': 3.0, '差值月': 5.0, '差值天': 26.0, '差值时': 9.0, '差值分': 15.0, '差值秒': 20.0, 'H1': 'Abcf', 'CHAR1': '\\', 'CONCATENATE1': 'Abcf123', 'LEFT2': 'Ab', 'LEN1': '4', 'LOWER1': 'abcf', 'MID12': 'Ab', 'REPLACE1': '替换cf', 'RIGHT1': 'cf', 'TODATE1': '2023-06-19 00:00:00', 'TRIM1': 'Abcf', 'UPPER1': 'ABCF', '去空格后长度': '4', 'AND1': '0', 'FALSE1': '0', 'TRUE1': '1', 'IF1': '及格', 'NOT_true1': '0', 'NOT_false1': '1', 'OR1': '0'}, {'_id': 1, '记录时间': '2023-10-09 14:48:48', '__$按年分组_year': '2023-01-01 00:00:00', '__$按年分组_month': '2023-01-01 00:00:00', '__$按年分组_day': '2023-01-01 00:00:00', '__$按年分组_hour': '2023-01-01 00:00:00', '__$按年分组_minute': '2023-01-01 00:00:00', '__$按年分组_quarter': '2023-01-01 00:00:00', '__$按年分组_week': '2022-12-26 00:00:00', '__$按季度分组_year': '2023-01-01 00:00:00', '__$按季度分组_month': '2023-10-01 00:00:00', '__$按季度分组_day': '2023-10-01 00:00:00', '__$按季度分组_hour': '2023-10-01 00:00:00', '__$按季度分组_minute': '2023-10-01 00:00:00', '__$按季度分组_quarter': '2023-10-01 00:00:00', '__$按季度分组_week': '2023-09-25 00:00:00', '__$按月分组_year': '2023-01-01 00:00:00', '__$按月分组_month': '2023-10-01 00:00:00', '__$按月分组_day': '2023-10-01 00:00:00', '__$按月分组_hour': '2023-10-01 00:00:00', '__$按月分组_minute': '2023-10-01 00:00:00', '__$按月分组_quarter': '2023-10-01 00:00:00', '__$按月分组_week': '2023-09-25 00:00:00', '__$按周分组_year': '2023-01-01 00:00:00', '__$按周分组_month': '2023-10-01 00:00:00', '__$按周分组_day': '2023-10-09 00:00:00', '__$按周分组_hour': '2023-10-09 00:00:00', '__$按周分组_minute': '2023-10-09 00:00:00', '__$按周分组_quarter': '2023-10-01 00:00:00', '__$按周分组_week': '2023-10-09 00:00:00', '__$按日分组_year': '2023-01-01 00:00:00', '__$按日分组_month': '2023-10-01 00:00:00', '__$按日分组_day': '2023-10-09 00:00:00', '__$按日分组_hour': '2023-10-09 00:00:00', '__$按日分组_minute': '2023-10-09 00:00:00', '__$按日分组_quarter': '2023-10-01 00:00:00', '__$按日分组_week': '2023-10-09 00:00:00', '__$按小时分组_year': '2023-01-01 00:00:00', '__$按小时分组_month': '2023-10-01 00:00:00', '__$按小时分组_day': '2023-10-09 00:00:00', '__$按小时分组_hour': '2023-10-09 14:00:00', '__$按小时分组_minute': '2023-10-09 14:00:00', '__$按小时分组_quarter': '2023-10-01 00:00:00', '__$按小时分组_week': '2023-10-09 00:00:00', '__$按分钟分组_year': '2023-01-01 00:00:00', '__$按分钟分组_month': '2023-10-01 00:00:00', '__$按分钟分组_day': '2023-10-09 00:00:00', '__$按分钟分组_hour': '2023-10-09 14:00:00', '__$按分钟分组_minute': '2023-10-09 14:47:00', '__$按分钟分组_quarter': '2023-10-01 00:00:00', '__$按分钟分组_week': '2023-10-09 00:00:00', '__$系统时间_year': '2023-01-01 00:00:00', '__$系统时间_month': '2023-10-01 00:00:00', '__$系统时间_day': '2023-10-09 00:00:00', '__$系统时间_hour': '2023-10-09 14:00:00', '__$系统时间_minute': '2023-10-09 14:47:00', '__$系统时间_quarter': '2023-10-01 00:00:00', '__$系统时间_week': '2023-10-09 00:00:00', '__$DATE1_year': '2023-01-01 00:00:00', '__$DATE1_month': '2023-06-01 00:00:00', '__$DATE1_day': '2023-06-19 00:00:00', '__$DATE1_hour': '2023-06-19 00:00:00', '__$DATE1_minute': '2023-06-19 00:00:00', '__$DATE1_quarter': '2023-04-01 00:00:00', '__$DATE1_week': '2023-06-19 00:00:00', '__$TODAY1_year': '2023-01-01 00:00:00', '__$TODAY1_month': '2023-10-01 00:00:00', '__$TODAY1_day': '2023-10-09 00:00:00', '__$TODAY1_hour': '2023-10-09 00:00:00', '__$TODAY1_minute': '2023-10-09 00:00:00', '__$TODAY1_quarter': '2023-10-01 00:00:00', '__$TODAY1_week': '2023-10-09 00:00:00', '按年分组': '2023', '按季度分组': '2023-04', '按月分组': '2023-10', '按周分组': '2023-42', '按日分组': '2023-10-09', '按小时分组': '2023-10-09 14', '按分钟分组': '2023-10-09 14:47', 'A1': 616.0, 'B1': 4337.536, 'G1': 56.0, 'ROUND1': 4337.5, 'ROUNDUP1': 4337.6, 'ROUNDDOWN1': 4337.5, 'SUM1': 4953.536, 'AVERAGE1': 2476.768, 'COUNT1': 2.0, 'COUNTA1': 2.0, 'MAX1': 4337.536, 'MEDIAN1': 2476.768, 'MIN1': 616.0, 'ABS1': 4337.536, 'max_B1': 4337.536, 'min_B1': 4337.536, '系统时间': '2023-10-09 14:47:59', 'DATE1': '2023-06-19 00:00:00', 'DATEDIF1': '1', 'DAY1': '9', 'DAYS1': '18', 'HOUR1': '14', 'MINUTE1': '47', 'MONTH1': '10', 'NOW1': '2023-10-09 14:48:48', 'SECOND1': '59', 'YEAR1': '2023', 'TODAY1': '2023-10-09 00:00:00', '差值年': 3.0, '差值月': 5.0, '差值天': 26.0, '差值时': 9.0, '差值分': 15.0, '差值秒': 20.0, 'H1': 'Abcf', 'CHAR1': '\\', 'CONCATENATE1': 'Abcf123', 'LEFT2': 'Ab', 'LEN1': '4', 'LOWER1': 'abcf', 'MID12': 'Ab', 'REPLACE1': '替换cf', 'RIGHT1': 'cf', 'TODATE1': '2023-06-19 00:00:00', 'TRIM1': 'Abcf', 'UPPER1': 'ABCF', '去空格后长度': '4', 'AND1': '0', 'FALSE1': '0', 'TRUE1': '1', 'IF1': '及格', 'NOT_true1': '0', 'NOT_false1': '1', 'OR1': '0'}]
sj_result = [{"id": 15, "name": "配方_401", "formulaSetId": "5143fa08-faeb-4da6-9321-847b56afb759"}, {"id": 16, "name": "配方_279", "formulaSetId": "5143fa08-faeb-4da6-9321-847b56afb759"}, {"id": 17, "name": "配方副本_973","formulaSetId":"5143fa08-faeb-4da6-9321-847b56afb759"}]
yq_result = [{'equals': {'status_code': 200}}, {'contains': 'id'}]
status_code = 200
data= RequestUtil().validate_result(yq_result,sj_result,status_code)
print(data)
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: D:\QW\WXWork\1688857353444240\Cache\File\2024-08
x_project: 1739f9aac285443f973c035f205bcb4b
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiU3VwZXJBZG1pbiIsImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzLzIwMDUvMDUvaWRlbnRpdHkvY2xhaW1zL25hbWVpZGVudGlmaWVyIjoiU3VwZXJBZG1pbiIsImlzcyI6IkNNU3YyIiwiYXVkIjoiQXBpIn0.AJUOE6YQ5MAxDqHOIz-yQbpCKPNq5tPoFBWUY381qns
mysql:
host: 127.0.0.1
port: 3306
user: root
password: 123456
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()
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
from datetime import datetime
class DubugTalk:
#获取随机数的方法
def get_random_number(self,min,max):
return random.randint(int(min),int(max))
# 获取时间戳
def get_time_stamp(self):
now = datetime.now().timestamp()
# timestamp = now.timestamp()
# print(now)
return now
def get_data(self):
# 获取当前日期
current_date = datetime.now().date()
return current_date
#获取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_Authorization(self,node_name):
return read_config_file('project',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_time_stamp()
BarcodeVerificationRule1_concurrencyStamp: f0447c6f41df4242b4b504b973761798
# 这是一个示例 Python 脚本。
# 按 Shift+F10 执行或将其替换为您的代码。
# 按 双击 Shift 在所有地方搜索类、文件、工具窗口、操作和设置。
def print_hi(name):
# 在下面的代码行中使用断点来调试脚本。
print(f'Hi, {name}') # 按 Ctrl+F8 切换断点。
# 按装订区域中的绿色按钮以运行脚本。
if __name__ == '__main__':
print_hi('PyCharm')
# 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助
[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
This source diff could not be displayed because it is too large. You can view the blob instead.
INFO log:logger_util.py:61
-------------接口请求开始-----------
INFO log:logger_util.py:61 接口名称:查询条码校验规则
INFO log:logger_util.py:61 接口方式:get
INFO log:logger_util.py:61 接口路径:http://127.0.0.1:18000/api/v1/barcodemanagement/barcodeverification?SkipCount=0&MaxResultCount=50
INFO log:logger_util.py:61 请求头:{'X-Project': '${get_project_Authorization(x_project)}', 'Authorization': '${get_project_Authorization(Authorization)}'}
INFO log:logger_util.py:61 请求参数:{'SkipCount': 0, 'MaxResultCount': 50}
INFO log:logger_util.py:61 文件上传:None
INFO log:logger_util.py:61 预期结果:[{'equals': {'status_code': 200}}]
INFO log:logger_util.py:61 实际结果:{'totalCount': 1, 'items': [{'name': '条码校验规则-解析条码段', 'isUsed': True, 'verificationRule': 1, 'verificationRuleDisplay': '条码规则-分隔符号-自定义名称1;自定义名称2', 'verificationType': None, 'verificationTypeDisplay': '物料编号校验、长度检验', 'barcodeLength': None, 'barcodeAnalysisId': '989a6e21-a818-53e9-7e4a-3a148acc6b60', 'barcodeAnalysisName': '条码规则-分隔符号', 'barcodeAnalysisDetails': [{'sort': 0, 'name': '自定义名称1', 'content': 'AAA', 'digit': 3, 'verificationType': 1, 'verificationTypeDisplay': '物料编号校验'}, {'sort': 1, 'name': '自定义名称2', 'content': 'BBB', 'digit': 3, 'verificationType': 0, 'verificationTypeDisplay': '长度检验'}], 'lastModificationTime': '2024-08-22T13:46:49.885366', 'remark': '备注略略略-编辑', 'concurrencyStamp': 'f0447c6f41df4242b4b504b973761798', 'id': 'db94b2d3-8894-05f3-4606-3a148acc6bf0', 'extraProperties': {}}]}
INFO log:logger_util.py:61 接口请求成功!
INFO log:logger_util.py:61
-------------接口请求结束-----------
\ No newline at end of file
"Epic","Feature","Story","FAILED","BROKEN","PASSED","SKIPPED","UNKNOWN"
"cms2.0","工程管理","接口名称:查询条码校验规则","0","0","1","0","0"
{"uid":"b1a8273437954620fa374b796ffaacdd","name":"behaviors","children":[{"name":"cms2.0","children":[{"name":"工程管理","children":[{"name":"接口名称:查询条码校验规则","children":[{"name":"查询条码校验规则","uid":"bb93da3bdd9aa61e","parentUid":"3b035d2999b49342de5a3e33a2508da1","status":"passed","time":{"start":1726105234401,"stop":1726105234497,"duration":96},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":["{'name': '查询条码校验规则', 'base_url': '${get_base_url(cms_url)}', 'request': {'url': '/api/v1/barcodemanagement/barcodeverification?SkipCount=0&MaxResultCount=50', 'method': 'get', 'params': {'SkipCount': 0, 'MaxResultCount': 50}, 'headers': {'X-Project': '${get_project_Authorization(x_project)}', 'Authorization': '${get_project_Authorization(Authorization)}'}}, 'extract': {'BarcodeVerificationRule1_concurrencyStamp': 'concurrencyStamp'}, 'validate': [{'equals': {'status_code': 200}}]}"],"tags":[]}],"uid":"3b035d2999b49342de5a3e33a2508da1"}],"uid":"966428bcdcd3029848aff416c5684a40"}],"uid":"f1dd5bbbf65fae4863d5c7e7b3130f8c"}]}
\ No newline at end of file
{"uid":"4b4757e66a1912dae1a509f688f20b0f","name":"categories","children":[]}
\ No newline at end of file
{"uid":"83edc06c07f9ae9e47eb6dd1b683e4e2","name":"packages","children":[{"name":"testcase.9_BarcodeManagement.test_Barcode","children":[{"name":"查询条码校验规则","uid":"bb93da3bdd9aa61e","parentUid":"98b05fc2e90006c4676555c780a03065","status":"passed","time":{"start":1726105234401,"stop":1726105234497,"duration":96},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":["{'name': '查询条码校验规则', 'base_url': '${get_base_url(cms_url)}', 'request': {'url': '/api/v1/barcodemanagement/barcodeverification?SkipCount=0&MaxResultCount=50', 'method': 'get', 'params': {'SkipCount': 0, 'MaxResultCount': 50}, 'headers': {'X-Project': '${get_project_Authorization(x_project)}', 'Authorization': '${get_project_Authorization(Authorization)}'}}, 'extract': {'BarcodeVerificationRule1_concurrencyStamp': 'concurrencyStamp'}, 'validate': [{'equals': {'status_code': 200}}]}"],"tags":[]}],"uid":"testcase.9_BarcodeManagement.test_Barcode"}]}
\ No newline at end of file
"Status","Start Time","Stop Time","Duration in ms","Parent Suite","Suite","Sub Suite","Test Class","Test Method","Name","Description"
"passed","Thu Sep 12 09:40:34 CST 2024","Thu Sep 12 09:40:34 CST 2024","96","testcase.9_BarcodeManagement","test_Barcode","TestCreat","","","查询条码校验规则","查询条码校验规则"
{"uid":"98d3104e051c652961429bf95fa0b5d6","name":"suites","children":[{"name":"testcase.9_BarcodeManagement","children":[{"name":"test_Barcode","children":[{"name":"TestCreat","children":[{"name":"查询条码校验规则","uid":"bb93da3bdd9aa61e","parentUid":"b0df59d50d358443d64eb72f35f93356","status":"passed","time":{"start":1726105234401,"stop":1726105234497,"duration":96},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":["{'name': '查询条码校验规则', 'base_url': '${get_base_url(cms_url)}', 'request': {'url': '/api/v1/barcodemanagement/barcodeverification?SkipCount=0&MaxResultCount=50', 'method': 'get', 'params': {'SkipCount': 0, 'MaxResultCount': 50}, 'headers': {'X-Project': '${get_project_Authorization(x_project)}', 'Authorization': '${get_project_Authorization(Authorization)}'}}, 'extract': {'BarcodeVerificationRule1_concurrencyStamp': 'concurrencyStamp'}, 'validate': [{'equals': {'status_code': 200}}]}"],"tags":[]}],"uid":"b0df59d50d358443d64eb72f35f93356"}],"uid":"ef30afbeedc4e4c4ab00204a7a6bfc86"}],"uid":"503cde09c7e5ef80d0db964f6fa2edb8"}]}
\ No newline at end of file
{"uid":"bb93da3bdd9aa61e","name":"查询条码校验规则","fullName":"testcase.9_BarcodeManagement.test_Barcode.TestCreat#test_get_BarcodeVerificationRule","historyId":"16341a65c5369a5f12b811a5dbca02d3","time":{"start":1726105234401,"stop":1726105234497,"duration":96},"description":"查询条码校验规则","descriptionHtml":"<p>查询条码校验规则</p>\n","status":"passed","flaky":false,"newFailed":false,"newBroken":false,"newPassed":false,"retriesCount":0,"retriesStatusChange":false,"beforeStages":[{"name":"clear_extract","time":{"start":1726105234394,"stop":1726105234395,"duration":1},"status":"passed","steps":[],"attachments":[],"parameters":[],"shouldDisplayMessage":false,"attachmentsCount":0,"stepsCount":0,"attachmentStep":false,"hasContent":false}],"testStage":{"description":"查询条码校验规则","status":"passed","steps":[],"attachments":[{"uid":"ac77994a645a6b0d","name":"log","source":"ac77994a645a6b0d.txt","type":"text/plain","size":2134}],"parameters":[],"shouldDisplayMessage":false,"attachmentsCount":1,"stepsCount":0,"attachmentStep":false,"hasContent":true},"afterStages":[],"labels":[{"name":"epic","value":"cms2.0"},{"name":"story","value":"接口名称:查询条码校验规则"},{"name":"feature","value":"工程管理"},{"name":"parentSuite","value":"testcase.9_BarcodeManagement"},{"name":"suite","value":"test_Barcode"},{"name":"subSuite","value":"TestCreat"},{"name":"host","value":"SC-202108181038"},{"name":"thread","value":"30324-MainThread"},{"name":"framework","value":"pytest"},{"name":"language","value":"cpython3"},{"name":"package","value":"testcase.9_BarcodeManagement.test_Barcode"},{"name":"resultFormat","value":"allure2"}],"parameters":[{"name":"caseinfo","value":"{'name': '查询条码校验规则', 'base_url': '${get_base_url(cms_url)}', 'request': {'url': '/api/v1/barcodemanagement/barcodeverification?SkipCount=0&MaxResultCount=50', 'method': 'get', 'params': {'SkipCount': 0, 'MaxResultCount': 50}, 'headers': {'X-Project': '${get_project_Authorization(x_project)}', 'Authorization': '${get_project_Authorization(Authorization)}'}}, 'extract': {'BarcodeVerificationRule1_concurrencyStamp': 'concurrencyStamp'}, 'validate': [{'equals': {'status_code': 200}}]}"}],"links":[],"hidden":false,"retry":false,"extra":{"severity":"normal","retries":[],"categories":[],"tags":[]},"source":"bb93da3bdd9aa61e.json","parameterValues":["{'name': '查询条码校验规则', 'base_url': '${get_base_url(cms_url)}', 'request': {'url': '/api/v1/barcodemanagement/barcodeverification?SkipCount=0&MaxResultCount=50', 'method': 'get', 'params': {'SkipCount': 0, 'MaxResultCount': 50}, 'headers': {'X-Project': '${get_project_Authorization(x_project)}', 'Authorization': '${get_project_Authorization(Authorization)}'}}, 'extract': {'BarcodeVerificationRule1_concurrencyStamp': 'concurrencyStamp'}, 'validate': [{'equals': {'status_code': 200}}]}"]}
\ No newline at end of file
{"uid":"ab17fc5a4eb3bca4b216b548c7f9fcbc","name":"timeline","children":[{"name":"SC-202108181038","children":[{"name":"30324-MainThread","children":[{"name":"查询条码校验规则","uid":"bb93da3bdd9aa61e","parentUid":"c7846ef3186632ec3df2095e0afe2de6","status":"passed","time":{"start":1726105234401,"stop":1726105234497,"duration":96},"flaky":false,"newFailed":false,"newPassed":false,"newBroken":false,"retriesCount":0,"retriesStatusChange":false,"parameters":["{'name': '查询条码校验规则', 'base_url': '${get_base_url(cms_url)}', 'request': {'url': '/api/v1/barcodemanagement/barcodeverification?SkipCount=0&MaxResultCount=50', 'method': 'get', 'params': {'SkipCount': 0, 'MaxResultCount': 50}, 'headers': {'X-Project': '${get_project_Authorization(x_project)}', 'Authorization': '${get_project_Authorization(Authorization)}'}}, 'extract': {'BarcodeVerificationRule1_concurrencyStamp': 'concurrencyStamp'}, 'validate': [{'equals': {'status_code': 200}}]}"],"tags":[]}],"uid":"c7846ef3186632ec3df2095e0afe2de6"}],"uid":"0ba794355cfa5d35e097f411a82d09fa"}]}
\ No newline at end of file
launch_status failed=0 1726105237000000000
launch_status broken=0 1726105237000000000
launch_status passed=1 1726105237000000000
launch_status skipped=0 1726105237000000000
launch_status unknown=0 1726105237000000000
launch_time duration=96 1726105237000000000
launch_time min_duration=96 1726105237000000000
launch_time max_duration=96 1726105237000000000
launch_time sum_duration=96 1726105237000000000
launch_retries retries=0 1726105237000000000
launch_retries run=1 1726105237000000000
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Allure Report summary mail</title>
</head>
<body>
Mail body
</body>
</html>
launch_status_failed 0
launch_status_broken 0
launch_status_passed 1
launch_status_skipped 0
launch_status_unknown 0
launch_time_duration 96
launch_time_min_duration 96
launch_time_max_duration 96
launch_time_sum_duration 96
launch_retries_retries 0
launch_retries_run 1
[{"data":{}}]
\ No newline at end of file
[{"data":{"duration":96}}]
\ No newline at end of file
[{"data":{"failed":0,"broken":0,"skipped":0,"passed":1,"unknown":0,"total":1}}]
\ No newline at end of file
{"16341a65c5369a5f12b811a5dbca02d3":{"statistic":{"failed":0,"broken":0,"skipped":0,"passed":1,"unknown":0,"total":1},"items":[{"uid":"bb93da3bdd9aa61e","status":"passed","time":{"start":1726105234401,"stop":1726105234497,"duration":96}}]}}
\ No newline at end of file
[{"data":{"run":1,"retry":0}}]
\ No newline at end of file
<!DOCTYPE html>
<html dir="ltr" lang="en">
<head>
<meta charset="utf-8">
<title>Allure Report</title>
<link rel="icon" href="favicon.ico">
<link rel="stylesheet" type="text/css" href="styles.css">
<link rel="stylesheet" type="text/css" href="plugin/screen-diff/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="plugin/behaviors/index.js"></script>
<script src="plugin/packages/index.js"></script>
<script src="plugin/screen-diff/index.js"></script>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-FVWC4GKEYS"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-FVWC4GKEYS', {
'allureVersion': 'dev',
'reportUuid': '6a579231-fc59-4d21-8718-0a1736261855',
'single_file': false
});
</script>
</body>
</html>
'use strict';
allure.api.addTranslation('en', {
tab: {
behaviors: {
name: 'Behaviors'
}
},
widget: {
behaviors: {
name: 'Features by stories',
showAll: 'show all'
}
}
});
allure.api.addTranslation('ru', {
tab: {
behaviors: {
name: 'Функциональность'
}
},
widget: {
behaviors: {
name: 'Функциональность',
showAll: 'показать все'
}
}
});
allure.api.addTranslation('zh', {
tab: {
behaviors: {
name: '功能'
}
},
widget: {
behaviors: {
name: '特性场景',
showAll: '显示所有'
}
}
});
allure.api.addTranslation('de', {
tab: {
behaviors: {
name: 'Verhalten'
}
},
widget: {
behaviors: {
name: 'Features nach Stories',
showAll: 'Zeige alle'
}
}
});
allure.api.addTranslation('nl', {
tab: {
behaviors: {
name: 'Functionaliteit'
}
},
widget: {
behaviors: {
name: 'Features en story’s',
showAll: 'Toon alle'
}
}
});
allure.api.addTranslation('he', {
tab: {
behaviors: {
name: 'התנהגויות'
}
},
widget: {
behaviors: {
name: 'תכונות לפי סיפורי משתמש',
showAll: 'הצג הכול'
}
}
});
allure.api.addTranslation('br', {
tab: {
behaviors: {
name: 'Comportamentos'
}
},
widget: {
behaviors: {
name: 'Funcionalidades por história',
showAll: 'Mostrar tudo'
}
}
});
allure.api.addTranslation('ja', {
tab: {
behaviors: {
name: '振る舞い'
}
},
widget: {
behaviors: {
name: 'ストーリー別の機能',
showAll: '全て表示'
}
}
});
allure.api.addTranslation('es', {
tab: {
behaviors: {
name: 'Funcionalidades'
}
},
widget: {
behaviors: {
name: 'Funcionalidades por Historias de Usuario',
showAll: 'mostrar todo'
}
}
});
allure.api.addTranslation('kr', {
tab: {
behaviors: {
name: '동작'
}
},
widget: {
behaviors: {
name: '스토리별 기능',
showAll: '전체 보기'
}
}
});
allure.api.addTranslation('fr', {
tab: {
behaviors: {
name: 'Comportements'
}
},
widget: {
behaviors: {
name: 'Thèmes par histoires',
showAll: 'Montrer tout'
}
}
});
allure.api.addTranslation('pl', {
tab: {
behaviors: {
name: 'Zachowania'
}
},
widget: {
behaviors: {
name: 'Funkcje według historii',
showAll: 'pokaż wszystko'
}
}
});
allure.api.addTranslation('az', {
tab: {
behaviors: {
name: 'Davranışlar'
}
},
widget: {
behaviors: {
name: 'Hekayələr üzrə xüsusiyyətlər',
showAll: 'hamısını göstər'
}
}
});
allure.api.addTab('behaviors', {
title: 'tab.behaviors.name', icon: 'fa fa-list',
route: 'behaviors(/)(:testGroup)(/)(:testResult)(/)(:testResultTab)(/)',
onEnter: (function (testGroup, testResult, testResultTab) {
return new allure.components.TreeLayout({
testGroup: testGroup,
testResult: testResult,
testResultTab: testResultTab,
tabName: 'tab.behaviors.name',
baseUrl: 'behaviors',
url: 'data/behaviors.json',
csvUrl: 'data/behaviors.csv'
});
})
});
allure.api.addWidget('widgets', 'behaviors', allure.components.WidgetStatusView.extend({
rowTag: 'a',
title: 'widget.behaviors.name',
baseUrl: 'behaviors',
showLinks: true
}));
(function () {
var settings = allure.getPluginSettings('screen-diff', { diffType: 'diff' });
function renderImage(src) {
return (
'<div class="screen-diff__container">' +
'<img class="screen-diff__image" src="' +
src +
'">' +
'</div>'
);
}
function findImage(data, name) {
if (data.testStage && data.testStage.attachments) {
var matchedImage = data.testStage.attachments.filter(function (attachment) {
return attachment.name === name;
})[0];
if (matchedImage) {
return 'data/attachments/' + matchedImage.source;
}
}
return null;
}
function renderDiffContent(type, diffImage, actualImage, expectedImage) {
if (type === 'diff') {
if (diffImage) {
return renderImage(diffImage);
}
}
if (type === 'overlay' && expectedImage) {
return (
'<div class="screen-diff__overlay screen-diff__container">' +
'<img class="screen-diff__image" src="' +
expectedImage +
'">' +
'<div class="screen-diff__image-over">' +
'<img class="screen-diff__image" src="' +
actualImage +
'">' +
'</div>' +
'</div>'
);
}
if (actualImage) {
return renderImage(actualImage);
}
return 'No diff data provided';
}
var TestResultView = Backbone.Marionette.View.extend({
regions: {
subView: '.screen-diff-view',
},
template: function () {
return '<div class="screen-diff-view"></div>';
},
onRender: function () {
var data = this.model.toJSON();
var testType = data.labels.filter(function (label) {
return label.name === 'testType';
})[0];
var diffImage = findImage(data, 'diff');
var actualImage = findImage(data, 'actual');
var expectedImage = findImage(data, 'expected');
if (!testType || testType.value !== 'screenshotDiff') {
return;
}
this.showChildView(
'subView',
new ScreenDiffView({
diffImage: diffImage,
actualImage: actualImage,
expectedImage: expectedImage,
}),
);
},
});
var ErrorView = Backbone.Marionette.View.extend({
templateContext: function () {
return this.options;
},
template: function (data) {
return '<pre class="screen-diff-error">' + data.error + '</pre>';
},
});
var AttachmentView = Backbone.Marionette.View.extend({
regions: {
subView: '.screen-diff-view',
},
template: function () {
return '<div class="screen-diff-view"></div>';
},
onRender: function () {
jQuery
.getJSON(this.options.sourceUrl)
.then(this.renderScreenDiffView.bind(this), this.renderErrorView.bind(this));
},
renderErrorView: function (error) {
console.log(error);
this.showChildView(
'subView',
new ErrorView({
error: error.statusText,
}),
);
},
renderScreenDiffView: function (data) {
this.showChildView(
'subView',
new ScreenDiffView({
diffImage: data.diff,
actualImage: data.actual,
expectedImage: data.expected,
}),
);
},
});
var ScreenDiffView = Backbone.Marionette.View.extend({
className: 'pane__section',
events: function () {
return {
['click [name="screen-diff-type-' + this.cid + '"]']: 'onDiffTypeChange',
'mousemove .screen-diff__overlay': 'onOverlayMove',
};
},
initialize: function (options) {
this.diffImage = options.diffImage;
this.actualImage = options.actualImage;
this.expectedImage = options.expectedImage;
this.radioName = 'screen-diff-type-' + this.cid;
},
templateContext: function () {
return {
diffType: settings.get('diffType'),
diffImage: this.diffImage,
actualImage: this.actualImage,
expectedImage: this.expectedImage,
radioName: this.radioName,
};
},
template: function (data) {
if (!data.diffImage && !data.actualImage && !data.expectedImage) {
return '';
}
return (
'<h3 class="pane__section-title">Screen Diff</h3>' +
'<div class="screen-diff__content">' +
'<div class="screen-diff__switchers">' +
'<label><input type="radio" name="' +
data.radioName +
'" value="diff"> Show diff</label>' +
'<label><input type="radio" name="' +
data.radioName +
'" value="overlay"> Show overlay</label>' +
'</div>' +
renderDiffContent(
data.diffType,
data.diffImage,
data.actualImage,
data.expectedImage,
) +
'</div>'
);
},
adjustImageSize: function (event) {
var overImage = this.$(event.target);
overImage.width(overImage.width());
},
onRender: function () {
const diffType = settings.get('diffType');
this.$('[name="' + this.radioName + '"][value="' + diffType + '"]').prop(
'checked',
true,
);
if (diffType === 'overlay') {
this.$('.screen-diff__image-over img').on('load', this.adjustImageSize.bind(this));
}
},
onOverlayMove: function (event) {
var pageX = event.pageX;
var containerScroll = this.$('.screen-diff__container').scrollLeft();
var elementX = event.currentTarget.getBoundingClientRect().left;
var delta = pageX - elementX + containerScroll;
this.$('.screen-diff__image-over').width(delta);
},
onDiffTypeChange: function (event) {
settings.save('diffType', event.target.value);
this.render();
},
});
allure.api.addTestResultBlock(TestResultView, { position: 'before' });
allure.api.addAttachmentViewer('application/vnd.allure.image.diff', {
View: AttachmentView,
icon: 'fa fa-exchange',
});
})();
.screen-diff__switchers {
margin-bottom: 1em;
}
.screen-diff__switchers label + label {
margin-left: 1em;
}
.screen-diff__overlay {
position: relative;
cursor: col-resize;
}
.screen-diff__container {
overflow-x: auto;
}
.screen-diff__image-over {
top: 0;
left: 0;
bottom: 0;
background: #fff;
position: absolute;
overflow: hidden;
box-shadow: 2px 0 1px -1px #aaa;
}
.screen-diff-error {
color: #fd5a3e;
}
This source diff could not be displayed because it is too large. You can view the blob instead.
{"total":1,"items":[{"uid":"f1dd5bbbf65fae4863d5c7e7b3130f8c","name":"cms2.0","statistic":{"failed":0,"broken":0,"skipped":0,"passed":1,"unknown":0,"total":1}}]}
\ No newline at end of file
[{"data":{}}]
\ No newline at end of file
{"total":0,"items":[]}
\ No newline at end of file
[{"data":{"duration":96}}]
\ No newline at end of file
[{"uid":"bb93da3bdd9aa61e","name":"查询条码校验规则","time":{"start":1726105234401,"stop":1726105234497,"duration":96},"status":"passed","severity":"normal"}]
\ No newline at end of file
[]
\ No newline at end of file
[]
\ No newline at end of file
[{"data":{"failed":0,"broken":0,"skipped":0,"passed":1,"unknown":0,"total":1}}]
\ No newline at end of file
[]
\ No newline at end of file
[{"data":{"run":1,"retry":0}}]
\ No newline at end of file
[{"uid":"bb93da3bdd9aa61e","name":"查询条码校验规则","time":{"start":1726105234401,"stop":1726105234497,"duration":96},"status":"passed","severity":"normal"}]
\ No newline at end of file
[{"uid":"bb93da3bdd9aa61e","name":"查询条码校验规则","time":{"start":1726105234401,"stop":1726105234497,"duration":96},"status":"passed","severity":"normal"}]
\ No newline at end of file
{"total":1,"items":[{"uid":"503cde09c7e5ef80d0db964f6fa2edb8","name":"testcase.9_BarcodeManagement","statistic":{"failed":0,"broken":0,"skipped":0,"passed":1,"unknown":0,"total":1}}]}
\ No newline at end of file
{"reportName":"Allure Report","testRuns":[],"statistic":{"failed":0,"broken":0,"skipped":0,"passed":1,"unknown":0,"total":1},"time":{"start":1726105234401,"stop":1726105234497,"duration":96,"minDuration":96,"maxDuration":96,"sumDuration":96}}
\ No newline at end of file
pytest
pytest-html
pytest-xdist
pytest-ordering
pytest-rerunfailures
allure-pytest
PyYAML
PyMySQL
pyodbc
requests
{"uuid": "4db02670-4a55-410c-a082-93cabb2a7b9a", "befores": [{"name": "caseinfo", "status": "passed", "start": 1726105234395, "stop": 1726105234395}], "start": 1726105234395, "stop": 1726105234498}
\ No newline at end of file
{"name": "查询条码校验规则", "status": "passed", "description": "查询条码校验规则", "attachments": [{"name": "log", "source": "d9e1c0dd-e2f4-4afc-9130-7f713b528968-attachment.txt", "type": "text/plain"}], "parameters": [{"name": "caseinfo", "value": "{'name': '查询条码校验规则', 'base_url': '${get_base_url(cms_url)}', 'request': {'url': '/api/v1/barcodemanagement/barcodeverification?SkipCount=0&MaxResultCount=50', 'method': 'get', 'params': {'SkipCount': 0, 'MaxResultCount': 50}, 'headers': {'X-Project': '${get_project_Authorization(x_project)}', 'Authorization': '${get_project_Authorization(Authorization)}'}}, 'extract': {'BarcodeVerificationRule1_concurrencyStamp': 'concurrencyStamp'}, 'validate': [{'equals': {'status_code': 200}}]}"}], "start": 1726105234401, "stop": 1726105234497, "uuid": "ccec9f7f-a65a-4b33-ba84-9362ee156a2c", "historyId": "16341a65c5369a5f12b811a5dbca02d3", "testCaseId": "4006fc3a2ba8660d932db3d24dfcf009", "fullName": "testcase.9_BarcodeManagement.test_Barcode.TestCreat#test_get_BarcodeVerificationRule", "labels": [{"name": "epic", "value": "cms2.0"}, {"name": "story", "value": "接口名称:查询条码校验规则"}, {"name": "feature", "value": "工程管理"}, {"name": "parentSuite", "value": "testcase.9_BarcodeManagement"}, {"name": "suite", "value": "test_Barcode"}, {"name": "subSuite", "value": "TestCreat"}, {"name": "host", "value": "SC-202108181038"}, {"name": "thread", "value": "30324-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcase.9_BarcodeManagement.test_Barcode"}]}
\ No newline at end of file
{"uuid": "249bb581-19d5-4619-b068-9b78981d63ad", "children": ["ccec9f7f-a65a-4b33-ba84-9362ee156a2c"], "befores": [{"name": "clear_extract", "status": "passed", "start": 1726105234394, "stop": 1726105234395}], "start": 1726105234394, "stop": 1726105234499}
\ No newline at end of file
INFO log:logger_util.py:61
-------------接口请求开始-----------
INFO log:logger_util.py:61 接口名称:查询条码校验规则
INFO log:logger_util.py:61 接口方式:get
INFO log:logger_util.py:61 接口路径:http://127.0.0.1:18000/api/v1/barcodemanagement/barcodeverification?SkipCount=0&MaxResultCount=50
INFO log:logger_util.py:61 请求头:{'X-Project': '${get_project_Authorization(x_project)}', 'Authorization': '${get_project_Authorization(Authorization)}'}
INFO log:logger_util.py:61 请求参数:{'SkipCount': 0, 'MaxResultCount': 50}
INFO log:logger_util.py:61 文件上传:None
INFO log:logger_util.py:61 预期结果:[{'equals': {'status_code': 200}}]
INFO log:logger_util.py:61 实际结果:{'totalCount': 1, 'items': [{'name': '条码校验规则-解析条码段', 'isUsed': True, 'verificationRule': 1, 'verificationRuleDisplay': '条码规则-分隔符号-自定义名称1;自定义名称2', 'verificationType': None, 'verificationTypeDisplay': '物料编号校验、长度检验', 'barcodeLength': None, 'barcodeAnalysisId': '989a6e21-a818-53e9-7e4a-3a148acc6b60', 'barcodeAnalysisName': '条码规则-分隔符号', 'barcodeAnalysisDetails': [{'sort': 0, 'name': '自定义名称1', 'content': 'AAA', 'digit': 3, 'verificationType': 1, 'verificationTypeDisplay': '物料编号校验'}, {'sort': 1, 'name': '自定义名称2', 'content': 'BBB', 'digit': 3, 'verificationType': 0, 'verificationTypeDisplay': '长度检验'}], 'lastModificationTime': '2024-08-22T13:46:49.885366', 'remark': '备注略略略-编辑', 'concurrencyStamp': 'f0447c6f41df4242b4b504b973761798', 'id': 'db94b2d3-8894-05f3-4606-3a148acc6bf0', 'extraProperties': {}}]}
INFO log:logger_util.py:61 接口请求成功!
INFO log:logger_util.py:61
-------------接口请求结束-----------
\ 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","formula"]
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: false
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 查用户管理信息(清数据后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/authority/user?keyword=
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- equals: {name: SuperAdmin}
- not_equals: {userName: A}
- name: 查角色信息(清数据后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/authority/role
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- equals: {name: Tourist}
- not_equals: {name: 角色A}
- name: 查配方集(清数据后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/projectformulaset/get-all
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
extract:
formula_0: id.0
validate:
- equals: {status_code: 200}
- equals: {name: 配方集1}
- name: 查配方集(还原后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/projectformulaset/get-all
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
extract:
formula_collection_0: id.0
validate:
- equals: {status_code: 200}
- equals: {name: 配方集1}
- name: 查配方(清数据后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/runtimeformula/name/get-all?formulaSetId=${get_extract_data(formula_collection_0)}
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- not_contain: name
- name: 查成分(清数据后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/runtimeformula/1/ingredient/get
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 500}
- not_contain: name
- name: 查模块日志(清数据后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/log/modulelog?moduleKey=Unlimited&startTime=2024-06-24+00:00:00&stopTime=2024-06-24+23:59:59&keyWord=&first=true
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- not_contain: name
- name: 查设备日志(清数据后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/log/devicelog?deviceKey=Unlimited&startTime=2024-06-24+00:00:00&stopTime=2024-06-24+23:59:59&keyWord=&first=true
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- not_contain: name
- name: 查登录日志(清数据后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/log/loginlog?startTime=2024-06-24+00:00:00&stopTime=2024-06-24+23:59:59&keyWord=&first=true
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- not_contain: name
- name: 查曲线组(清数据后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/trend/curvegroup?keyword=
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- not_contain: name
- name: 查询历史数据(清数据后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/data/aggregate
method: post
json: {"dataSetId":"history","dimensions":[{"aliasName":"","fieldName":"0","sort":0,"timeFormat":"yyyy-MM-dd HH:mm:ss"}],"measures":[{"aliasName":"","fieldName":"23","mode":4,"dataFormat":0,"sort":0,"mergeType":0}],"filters":[],"total":true,"pageSize":10,"pageIndex":1,"limit":10000,"noAggregation":false,"noDimensions":false,"whereJson":"","historyRawData":false,"historyUseWindow":true,"windowUnit":0,"windowMethod":1,"windowValue":1}
headers:
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- not_contain: 记录时间
- name: 查询实时报警数据(清数据后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/data/original
method: post
json: {"dataSetId":"a9b66e92-6f83-44e3-ba02-ccbdb0f149c1","tableName":"报警管理-实时表","limit":500}
headers:
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- not_contain: _id
- name: 查询历史报警数据(清数据后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/data/original
method: post
json: {"dataSetId":"e342f0fa-977d-459a-97b2-f4fc4b36c7e4","tableName":"报警管理-历史表","limit":500}
headers:
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- not_contain: _id
- name: 查询数据(归档表-定时触发)(清数据后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/data/original
method: post
json:
{
"dataSetId": "134ea944-520d-4a18-b378-1b9f1d478f19",
"tableName": "归档表_定时触发",
"limit": 500
}
headers:
Content-Type: application/json;charset=UTF-8
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: { status_code: 200 }
- not_contain: A1
- name: 查询数据(实时聚合表)(清数据后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/data/original
method: post
json:
{
"dataSetId": "796d7b93-032a-440c-b0da-877c4fee1511",
"tableName": "实时聚合表",
"limit": 500
}
headers:
Content-Type: application/json;charset=UTF-8
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- not_contain: A1
\ No newline at end of file
- name: 查用户管理信息(还原后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/authority/user?keyword=
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- equals: {userName: A}
- name: 查角色信息(还原后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/authority/role
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- equals: {name: 角色A}
- name: 查配方(还原后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/runtimeformula/name/get-all?formulaSetId=${get_extract_data(formula_collection_0)}
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
extract:
formula_0: id.0
validate:
- equals: {status_code: 200}
- equals: {name: 配方11}
- name: 查成分(还原后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/runtimeformula/1/ingredient/get
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- equals: {name: 成分1}
- name: 查模块日志(还原后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/log/modulelog?moduleKey=Unlimited&startTime=2024-06-24+00:00:00&stopTime=2024-06-24+23:59:59&keyWord=&first=true
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- equals: {target: 角色B}
- name: 查设备日志(还原后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/log/devicelog?deviceKey=Unlimited&startTime=2024-06-24+00:00:00&stopTime=2024-06-24+23:59:59&keyWord=&first=true
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- equals: {tagName: A1}
- name: 查登录日志(还原后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/log/loginlog?startTime=2024-06-24+00:00:00&stopTime=2024-06-24+23:59:59&keyWord=&first=true
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- equals: {operator: B}
- name: 查曲线组(还原后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/trend/curvegroup?keyword=
method: get
headers:
Authorization: ${get_project_Authorization(Authorization)}
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- equals: {name: 曲线1}
- name: 查询历史数据(还原后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/data/aggregate
method: post
json: {"dataSetId":"history","dimensions":[{"aliasName":"","fieldName":"0","sort":0,"timeFormat":"yyyy-MM-dd HH:mm:ss"}],"measures":[{"aliasName":"","fieldName":"23","mode":4,"dataFormat":0,"sort":0,"mergeType":0}],"filters":[],"total":true,"pageSize":10,"pageIndex":1,"limit":10000,"noAggregation":false,"noDimensions":false,"whereJson":"","historyRawData":false,"historyUseWindow":true,"windowUnit":0,"windowMethod":1,"windowValue":1}
headers:
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- equals: { A2(4): '11' }
- name: 查询实时报警数据(还原后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/data/original
method: post
json: {"dataSetId":"a9b66e92-6f83-44e3-ba02-ccbdb0f149c1","tableName":"报警管理-实时表","limit":500}
headers:
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- equals: { _id: 1 }
- name: 查询历史报警数据(还原后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/data/original
method: post
json: {"dataSetId":"e342f0fa-977d-459a-97b2-f4fc4b36c7e4","tableName":"报警管理-历史表","limit":500}
headers:
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- equals: { _id: 2 }
- name: 查询数据(归档表-定时触发)(还原后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/data/original
method: post
json:
{
"dataSetId": "134ea944-520d-4a18-b378-1b9f1d478f19",
"tableName": "归档表_定时触发",
"limit": 500
}
headers:
Content-Type: application/json;charset=UTF-8
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: { status_code: 200 }
- equals: { A1: 11 }
- equals: { B1: 77.456 }
- equals: { G1: 1 }
- equals: { 绝对值B1: 77.456 }
- equals: { ROUND1: 77.5 }
- equals: { ROUNDDOWN1: 77.4 }
- equals: { ROUNDUP1: 77.5 }
- equals: { SUM1: 88.456 }
- equals: { AVERAGE1: 44.228 }
- equals: { COUNT1: 2 }
- equals: { COUNTA1: 2 }
- equals: { MAX1: 77.456 }
- equals: { MEDIAN1: 44.228 }
- equals: { MIN1: 11 }
- equals: { CHAR2: "\\" }
- equals: { CONCATENATE2: "Abcf123" }
- equals: { LEFT2: "Ab" }
- equals: { LEN2: "4" }
- equals: { LOWER2: "abcf" }
- equals: { UPPER2: "ABCF" }
- equals: { MID2: "Ab" }
- equals: { REPLACE2: "替换cf" }
- equals: { RIGHT2: "cf" }
- equals: { TEXT月日: "10月20日" }
- equals: { TODATE2: "2023-06-19 00:00:00" }
- equals: { TRIM2: "Abcf" }
- equals: { DATE3: "2023-06-19 00:00:00" }
- equals: { 差值3年: 3 }
- equals: { 差值5月: 5 }
- equals: { 差值177日: 177 }
- equals: { 差值4249时: 4249 }
- equals: { 差值254955分: 254955 }
- equals: { 差值15297325秒: 15297325 }
- equals: { DAYS18天: "18" }
- equals: { AND4: "False" }
- equals: { FALSE4: "False" }
- equals: { TRUE4: "True" }
- equals: { IF4: "及格" }
- equals: { NOT_true4: "False" }
- equals: { NOT_false4: "True" }
- equals: { OR4: "False" }
- equals: { Change4: 0 }
- greater_than: {随机数0_1: 0}
- greater_than: {随机数1_100: 0}
- length_greater_than: { NOW3: 0 }
- length_greater_than: { YEAR3: 0 }
- length_greater_than: { MONTH3: 0 }
- length_greater_than: { DAY3: 0 }
- length_greater_than: { HOUR3: 0 }
- length_greater_than: { MINUTE3: 0 }
- length_greater_than: { SECOND3: 0 }
- length_greater_than: { TODAY3: 0 }
- length_greater_than: { WEEKDAY3: 0 }
- length_greater_than: { WEEKNUM3: 0 }
- length_greater_than: { 班次: 0 }
- name: 查询数据(实时聚合表)(还原后)
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/data/original
method: post
json:
{
"dataSetId": "796d7b93-032a-440c-b0da-877c4fee1511",
"tableName": "实时聚合表",
"limit": 500
}
headers:
Content-Type: application/json;charset=UTF-8
X-Project: ${get_extract_data(x_import_project)}
validate:
- equals: {status_code: 200}
- equals: { COUNT1: 2 }
- equals: { COUNTA1: 2 }
- equals: { 差值3年: 3 }
- equals: { 差值5月: 5 }
- equals: { 差值177天: 177 }
- equals: { 差值4249时: 4249 }
- equals: { 差值254955分: 254955 }
- equals: { 差值15297325秒: 15297325 }
- equals: { DATE1: "2023-06-19 00:00:00" }
- equals: { DAYS1: "18" }
- equals: { H1: "Abcf" }
- equals: { CHAR1: "\\" }
- equals: { CONCATENATE1: "Abcf123" }
- equals: { LEFT2: "Ab" }
- equals: { LEN1: "4" }
- equals: { LOWER1: "abcf" }
- equals: { MID12: "Ab" }
- equals: { REPLACE1: "替换cf" }
- equals: { RIGHT1: "cf" }
- equals: { TODATE1: "2023-06-19 00:00:00" }
- equals: { TRIM1: "Abcf" }
- equals: { UPPER1: "ABCF" }
- equals: { 去空格后长度: "4" }
- equals: { AND1: "False" }
- equals: { FALSE1: "False" }
- equals: { TRUE1: "True" }
- equals: { IF1: "及格" }
- equals: { NOT_true1: "False" }
- equals: { NOT_false1: "True" }
- equals: { OR1: "False" }
- greater_than: {A1: 10}
- greater_than: {B1: 10}
- greater_than: {G1: 1}
- greater_than: {ROUND1: 10}
- greater_than: {ROUNDUP1: 10}
- greater_than: {ROUNDDOWN1: 10}
- greater_than: {SUM1: 10}
- greater_than: {AVERAGE1: 10}
- greater_than: {MAX1: 10}
- greater_than: {MEDIAN1: 10}
- greater_than: {MIN1: 10}
- greater_than: {ABS1: 10}
- greater_than: {max_B1: 10}
- greater_than: {min_B1: 10}
- length_greater_than: {HOUR1: 0}
- length_greater_than: {MINUTE1: 0}
- length_greater_than: {MONTH1: 0}
- length_greater_than: {NOW1: 0}
- length_greater_than: {SECOND1: 0}
- length_greater_than: {YEAR1: 0}
- length_greater_than: {系统时间: 0}
- length_greater_than: {DATE1: 0}
- length_greater_than: {TODAY1: 0}
\ No newline at end of file
- name: 数据清除
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/data/clean/${get_extract_data(import_remoteproject_id)}?all=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","formula"]
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(import_remoteproject_id)}/import
method: post
files:
formFile: ${get_project_path()}\data\EngineeringManagement\验证备份还原备份数据.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/updateprojectfile
method: put
data:
id: ${get_extract_data(import_remoteproject_id)}
isKeepOldFile: false
validate:
- equals: {status_code: 200}
- name: 获取导入的工程信息
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/project/${get_extract_data(import_remoteproject_id)}/info
method: get
extract:
x_import_project: identifier
import_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?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/importlocalproject
method: post
data:
localFilePath: ${get_project_path2()}\data\EngineeringManagement\验证数据备份还原(13版本).cmsproj
importConflictHandleType: 1
extract:
import_remoteproject_id: id
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/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/import_remote_project2.yml'))
def test_import_remote_project2(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/enter_project.yml'))
def test_enter_project(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_clear.yml'))
def test_data_clear(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_check(data_clear).yml.yml'))
def test_check_data(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)
@allure.story("接口名称:校验数据(数据还原后)")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/1_EngineeringManagement/data_check(data_recovery).yml'))
def test_check_data2(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_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
import allure
import pytest
import time
from common.parameters_util import read_testcase_file
from common.requests_util import RequestUtil
from debug_talk import DubugTalk
import requests
from urllib.parse import urlencode
@allure.epic("CMS2.0")
@allure.feature("产品管理")
class TestCreat():
@allure.story("接口名称:获取鉴权码")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/2_ProductManagement/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)
@allure.story("接口名称:创建产品")
@pytest.mark.parametrize('caseinfo',read_testcase_file('/testcase/2_ProductManagement/creat_product.yml'))
def test_creat_product(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_ProductManagement/edit_product.yml'))
def test_edit_product(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/2_ProductManagement/get_worksection.yml'))
def test_get_worksection(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
# @allure.story("接口名称:添加SOP")
# def test_variable_write(self):
# url = DubugTalk().get_config("base",
# "base_url") +r"/api/v1/productmanagement/product/"+DubugTalk().get_extract_data("product_id")+"/step"
# header = {"X-Project": "${get_project_Authorization(x_project)}",
# "Authorization": "Bearer" +"DubugTalk().get_extract_data('Authorization')"}
# header = {"X-Project": DubugTalk().get_extract_data("X-Project"),"Authorization": DubugTalk().get_extract_data("X-Authorization")} # 使用引用方式动态获取X-Project、Authorization
#
# data = {
# 'dtojsons': "{processId:"+"DubugTalk().get_extract_data('worksection_id')"+ ",'sopSteps':[{sort:0,name:'SOP名称',description:'test'}]"
# }不会填
# query_string = urlencode(data, doseq=True)
# re = requests.put(url=url, headers=header, data=query_string)
# assert re.status_code == 200
# print(data)
# @allure.story("接口名称:添加SOP")
# @pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/2_ProductManagement/addSOP_product.yml'))
# def test_addSOP_product(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_ProductManagement/delete_product.yml'))
# def test_delete_product(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_ProductManagement/export_product.yml'))
# def test_export_product(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_ProductManagement/search_product.yml'))
# def test_search_product(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_ProductManagement/import_product.yml'))
# def test_import_product(self, caseinfo):
# allure.dynamic.title(caseinfo['name'])
# allure.dynamic.description(caseinfo['name'])
# RequestUtil().analysis_yaml(caseinfo)
\ No newline at end of file
- name: 添加sop
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/productmanagement/product/${get_extract_data(product_id)}/step
method: put
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 创建产品
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/productmanagement/product
method: post
json:
{
"name": "产品名称${get_random_number(1000,9999)}",
"model": "CPXH${get_random_number(1000,9999)}",
"shortNumber": "产品简号",
"remark": "备注"
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
product_id: id
product_name: name
product_model: model
product_shortNumber: shortNumber
product_remark: remark
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 创建产品
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/productmanagement/product
method: post
json:
{
"name": "产品名称${get_random_number(1000,9999)}",
"model": "CPXH${get_random_number(1000,9999)}",
"shortNumber": "产品简号",
"remark": "备注"
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
product_id: id
validate:
- equals: {status_code: 200}
- name: 删除产品
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/productmanagement/product
method: delete
json:
- ${get_extract_data(product_id)}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 编辑产品
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/productmanagement/product/${get_extract_data(product_id)}
method: put
json:
{
"sort": 1,
"formulaName": "",
"pocessRoutes": [ ],
"id": "${get_extract_data(product_id)}",
"name": "编辑${get_extract_data(product_name)}",
"model": "编辑${get_extract_data(product_model)}",
"shortNumber": "编辑${get_extract_data(product_shortNumber)}",
"remark": "编辑${get_extract_data(product_remark)}",
"extraProperties": { }
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 导出产品
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/productmanagement/product/export?filter=
method: get
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
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_project_Authorization(x_project)}
extract:
Authorization: content
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 获取工序id
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/messuite/query/worksection?SkipCount=0&MaxResultCount=999
method: get
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
worksection_id: id.2
validate:
- equals: { status_code: 200 }
\ No newline at end of file
- name: 导入产品
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/productmanagement/product/import
method: put
files:
file: "C:\\Users\\Administrator\\Desktop\\Lmes_API_AUTOMATION_TEST\\importfiles\\products\\产品管理.xlsx"
# 路径参数化
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 查询产品
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/productmanagement/product?SkipCount=0&MaxResultCount=50&Filter=编辑
method: get
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
- equals: {"remark": "编辑备注"}
\ No newline at end of file
{"uuid": "ea2b9d13-0c0c-482d-b7a1-172500d0e58a", "children": ["cb76e758-8b60-47c1-b846-1fef1e30a318"], "befores": [{"name": "clear_extract", "status": "passed", "start": 1724290996040, "stop": 1724290996041}], "start": 1724290996040, "stop": 1724290996649}
\ No newline at end of file
{"name": "test_variable_write", "status": "broken", "statusDetails": {"message": "TypeError: 'NoneType' object is not subscriptable", "trace": "self = <test_product_run.TestCreat object at 0x000001BFD5146B70>\n\n @allure.story(\"接口名称:lmes\")\n def test_variable_write(self):\n url = DubugTalk().get_config(\"base\",\n \"base_url\") + r\"/api/v1/productmanagement/product/DubugTalk().get_extract_data('product_id')/step\"\n header = {\"X-Project\": \"${get_project_Authorization(x_project)}\",\n> \"Authorization\": DubugTalk().get_extract_data(\"Authorization\")}\n\ntest_product_run.py:47: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n..\\..\\debug_talk.py:31: in get_extract_data\n return read_extract_file(node_name)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _\n\none_node = 'Authorization'\n\n def read_extract_file(one_node):\n with open(get_object_path()+\"\\\\extract.yml\",encoding='utf-8') as f:\n value = yaml.load(stream=f, Loader=yaml.FullLoader)\n> return value[one_node]\nE TypeError: 'NoneType' object is not subscriptable\n\n..\\..\\common\\yaml_util.py:26: TypeError"}, "start": 1724290996041, "stop": 1724290996044, "uuid": "cb76e758-8b60-47c1-b846-1fef1e30a318", "historyId": "22228e8524952761d379662433731f43", "testCaseId": "22228e8524952761d379662433731f43", "fullName": "testcase.2_ProductManagement.test_product_run.TestCreat#test_variable_write", "labels": [{"name": "feature", "value": "产品管理"}, {"name": "story", "value": "接口名称:lmes"}, {"name": "epic", "value": "CMS2.0"}, {"name": "parentSuite", "value": "testcase.2_ProductManagement"}, {"name": "suite", "value": "test_product_run"}, {"name": "subSuite", "value": "TestCreat"}, {"name": "host", "value": "SC-202012202145"}, {"name": "thread", "value": "9596-MainThread"}, {"name": "framework", "value": "pytest"}, {"name": "language", "value": "cpython3"}, {"name": "package", "value": "testcase.2_ProductManagement.test_product_run"}]}
\ 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/8_BusinessFieldSettings/set_BusinessFields.yaml'))
def test_set_BusinessFields(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/8_BusinessFieldSettings/get_BusinessFields.yaml'))
def test_get_BusinessFields(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
\ No newline at end of file
- name: 场景1:工单下发成功,业务字段值正确下发
base_url: ${get_base_url(cms_url)}
request:
url: /
method:
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 获取系统字段配置
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/productionmanagement/businessfield
method: get
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 配置系统字段
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/productionmanagement/businessfield
method: post
json:
[ {
"parentId": "00000000-0000-0000-0000-000000000000",
"fieldCode": "CurrentShiftOnlineNumber",
"fieldName": "当前班次上线数",
"variable": "当前班次上线数",
"remark": "当前班次首工序上线产品的数量"
}, {
"parentId": "00000000-0000-0000-0000-000000000000",
"fieldCode": "CurrentShiftOfflineNumber",
"fieldName": "当前班次下线数",
"variable": "当前班次下线数",
"remark": "当前班次末工序下线和中间NG下线产品数量之和"
}, {
"parentId": "00000000-0000-0000-0000-000000000000",
"fieldCode": "CurrentShiftQualifiedNumber",
"fieldName": "当前班次合格数量",
"variable": "当前班次合格数量",
"remark": "当前班次的末工序加工合格数"
}, {
"parentId": "00000000-0000-0000-0000-000000000000",
"fieldCode": "CurrentShiftUnqualifiedNumber",
"fieldName": "当前班次不合格数量",
"variable": "当前班次不合格数量",
"remark": "当前班次的末工序加工不合格数"
}, {
"parentId": "00000000-0000-0000-0000-000000000000",
"fieldCode": "CurrentShiftProcessingNumber",
"fieldName": "当前班次加工数量",
"variable": "当前班次加工数量",
"remark": "当前班次的末工序加工总数"
}, {
"parentId": "00000000-0000-0000-0000-000000000000",
"fieldCode": "CurrentShiftQualifiedRate",
"fieldName": "当前班次合格率",
"variable": "当前班次合格率",
"remark": "当前班次合格数量/当前班次加工数量"
}, {
"parentId": "00000000-0000-0000-0000-000000000000",
"fieldCode": "TodayOnlineNumber",
"fieldName": "当日上线数",
"variable": "当日上线数",
"remark": "当日首工序上线产品的数量"
}, {
"parentId": "00000000-0000-0000-0000-000000000000",
"fieldCode": "TodayOfflineNumber",
"fieldName": "当日下线数",
"variable": "当日下线数",
"remark": "当日末工序下线和中间NG下线产品数量之和"
}, {
"parentId": "00000000-0000-0000-0000-000000000000",
"fieldCode": "TodayQualifiedNumber",
"fieldName": "当日合格数量",
"variable": null,
"remark": "当日的末工序加工合格数"
}, {
"parentId": "00000000-0000-0000-0000-000000000000",
"fieldCode": "TodayUnqualifiedNumber",
"fieldName": "当日不合格数量",
"variable": "当日不合格数量",
"remark": "当日的末工序加工不合格数"
}, {
"parentId": "00000000-0000-0000-0000-000000000000",
"fieldCode": "TodayProcessingNumber",
"fieldName": "当日加工数量",
"variable": "当日加工数量",
"remark": "当日的末工序加工总数"
}, {
"parentId": "00000000-0000-0000-0000-000000000000",
"fieldCode": "TodayQualifiedRate",
"fieldName": "当日合格率",
"variable": "当日合格率",
"remark": "当日合格数量/当日加工数量"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentProductName",
"fieldName": "当前工单生产产品名称",
"variable": null,
"remark": "当前产线段生产中工单的产品名称"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentProductModel",
"fieldName": "当前工单生产产品型号",
"variable": null,
"remark": "当前产线段生产中工单的产品型号"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentWorkOrderCode",
"fieldName": "当前工单号",
"variable": null,
"remark": "当前产线段生产中的工单号"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentWorkOrderOnlineNumber",
"fieldName": "当前工单上线数",
"variable": null,
"remark": "生产中工单在当前产线段首工序上线产品的数量"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentWorkOrderOfflineNumber",
"fieldName": "当前工单下线数",
"variable": null,
"remark": "生产中工单在当前产线段末工序下线和中间NG下线产品数量之和"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentWorkOrderTargetOutput",
"fieldName": "当前工单目标产量",
"variable": null,
"remark": "当前产线段生产中工单的计划数量"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentWorkOrderQualifiedNumber",
"fieldName": "当前工单合格数",
"variable": null,
"remark": "当前产线段生产中工单的末工序合格数"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentWorkOrderUnqualifiedNumber",
"fieldName": "当前工单不合格数",
"variable": null,
"remark": "当前产线段生产中工单的末工序不合格数"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentWorkOrderProcessingNumber",
"fieldName": "当前工单加工数量",
"variable": null,
"remark": "当前产线段生产中工单的末工序加工数"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentWorkOrderQualifiedRate",
"fieldName": "当前工单合格率",
"variable": null,
"remark": "当前工单合格数/当前工单加工数量"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentWorkOrderAchievementRate",
"fieldName": "当前工单达成率",
"variable": null,
"remark": "当前工单合格数/当前工单目标产量"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentWorkOrderPlannedStartTime",
"fieldName": "当前工单计划开始时间",
"variable": null,
"remark": "当前产线段生产中工单计划开始时间"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentWorkOrderPlannedEndTime",
"fieldName": "当前工单计划结束时间",
"variable": null,
"remark": "当前产线段生产中工单计划结束时间"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "ProductShortNumber",
"fieldName": "产品简号",
"variable": null,
"remark": "当前产线段生产中工单生产产品的产品简号"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "FormulaCode",
"fieldName": "配方编号",
"variable": null,
"remark": "当前产线段生产中工单生产产品的配方编号"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentShiftOnlineNumber",
"fieldName": "当前班次上线数",
"variable": null,
"remark": "当前产线段在当前班次首工序上线产品的数量"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentShiftOfflineNumber",
"fieldName": "当前班次下线数",
"variable": null,
"remark": "当前产线段在当前班次末工序下线和中间NG下线产品数量之和"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentShiftQualifiedNumber",
"fieldName": "当前班次合格数量",
"variable": null,
"remark": "当前产线段在当前班次的末工序加工合格数"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentShiftUnqualifiedNumber",
"fieldName": "当前班次不合格数量",
"variable": null,
"remark": "当前产线段在当前班次的末工序加工不合格数"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentShiftProcessingNumber",
"fieldName": "当前班次加工数量",
"variable": null,
"remark": "当前产线段在当前班次的末工序加工总数"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "CurrentShiftQualifiedRate",
"fieldName": "当前班次合格率",
"variable": null,
"remark": "当前班次合格数量/当前班次加工数量"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "TodayOnlineNumber",
"fieldName": "当日上线数",
"variable": null,
"remark": "当前产线段在当日首工序上线产品的数量"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "TodayOfflineNumber",
"fieldName": "当日下线数",
"variable": null,
"remark": "当前产线段在当日末工序下线和中间NG下线产品数量之和"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "TodayQualifiedNumber",
"fieldName": "当日合格数量",
"variable": null,
"remark": "当前产线段在当日的末工序加工合格数"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "TodayUnqualifiedNumber",
"fieldName": "当日不合格数量",
"variable": null,
"remark": "当前产线段在当日的末工序加工不合格数"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "TodayProcessingNumber",
"fieldName": "当日加工数量",
"variable": null,
"remark": "当前产线段在当日的末工序加工总数"
}, {
"parentId": "8968a1c6-ddbd-4c4a-9f18-2b26204d9456",
"fieldCode": "TodayQualifiedRate",
"fieldName": "当日合格率",
"variable": null,
"remark": "当日合格数量/当日加工数量"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentProductName",
"fieldName": "当前工单生产产品名称",
"variable": null,
"remark": "当前产线段生产中工单的产品名称"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentProductModel",
"fieldName": "当前工单生产产品型号",
"variable": null,
"remark": "当前产线段生产中工单的产品型号"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentWorkOrderCode",
"fieldName": "当前工单号",
"variable": null,
"remark": "当前产线段生产中的工单号"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentWorkOrderOnlineNumber",
"fieldName": "当前工单上线数",
"variable": null,
"remark": "生产中工单在当前产线段首工序上线产品的数量"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentWorkOrderOfflineNumber",
"fieldName": "当前工单下线数",
"variable": null,
"remark": "生产中工单在当前产线段末工序下线和中间NG下线产品数量之和"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentWorkOrderTargetOutput",
"fieldName": "当前工单目标产量",
"variable": null,
"remark": "当前产线段生产中工单的计划数量"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentWorkOrderQualifiedNumber",
"fieldName": "当前工单合格数",
"variable": null,
"remark": "当前产线段生产中工单的末工序合格数"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentWorkOrderUnqualifiedNumber",
"fieldName": "当前工单不合格数",
"variable": null,
"remark": "当前产线段生产中工单的末工序不合格数"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentWorkOrderProcessingNumber",
"fieldName": "当前工单加工数量",
"variable": null,
"remark": "当前产线段生产中工单的末工序加工数"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentWorkOrderQualifiedRate",
"fieldName": "当前工单合格率",
"variable": null,
"remark": "当前工单合格数/当前工单加工数量"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentWorkOrderAchievementRate",
"fieldName": "当前工单达成率",
"variable": null,
"remark": "当前工单合格数/当前工单目标产量"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentWorkOrderPlannedStartTime",
"fieldName": "当前工单计划开始时间",
"variable": null,
"remark": "当前产线段生产中工单计划开始时间"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentWorkOrderPlannedEndTime",
"fieldName": "当前工单计划结束时间",
"variable": null,
"remark": "当前产线段生产中工单计划结束时间"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "ProductShortNumber",
"fieldName": "产品简号",
"variable": null,
"remark": "当前产线段生产中工单生产产品的产品简号"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "FormulaCode",
"fieldName": "配方编号",
"variable": null,
"remark": "当前产线段生产中工单生产产品的配方编号"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentShiftOnlineNumber",
"fieldName": "当前班次上线数",
"variable": null,
"remark": "当前产线段在当前班次首工序上线产品的数量"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentShiftOfflineNumber",
"fieldName": "当前班次下线数",
"variable": null,
"remark": "当前产线段在当前班次末工序下线和中间NG下线产品数量之和"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentShiftQualifiedNumber",
"fieldName": "当前班次合格数量",
"variable": null,
"remark": "当前产线段在当前班次的末工序加工合格数"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentShiftUnqualifiedNumber",
"fieldName": "当前班次不合格数量",
"variable": null,
"remark": "当前产线段在当前班次的末工序加工不合格数"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentShiftProcessingNumber",
"fieldName": "当前班次加工数量",
"variable": null,
"remark": "当前产线段在当前班次的末工序加工总数"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "CurrentShiftQualifiedRate",
"fieldName": "当前班次合格率",
"variable": null,
"remark": "当前班次合格数量/当前班次加工数量"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "TodayOnlineNumber",
"fieldName": "当日上线数",
"variable": null,
"remark": "当前产线段在当日首工序上线产品的数量"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "TodayOfflineNumber",
"fieldName": "当日下线数",
"variable": null,
"remark": "当前产线段在当日末工序下线和中间NG下线产品数量之和"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "TodayQualifiedNumber",
"fieldName": "当日合格数量",
"variable": null,
"remark": "当前产线段在当日的末工序加工合格数"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "TodayUnqualifiedNumber",
"fieldName": "当日不合格数量",
"variable": null,
"remark": "当前产线段在当日的末工序加工不合格数"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "TodayProcessingNumber",
"fieldName": "当日加工数量",
"variable": null,
"remark": "当前产线段在当日的末工序加工总数"
}, {
"parentId": "ef446a77-4aa0-4b3e-b77a-e61afb47ec7f",
"fieldCode": "TodayQualifiedRate",
"fieldName": "当日合格率",
"variable": null,
"remark": "当日合格数量/当日加工数量"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "CurrentProductName",
"fieldName": "当前工位生产产品名称",
"variable": "当前工位生产产品名称",
"remark": "当前工位生产中的产品名称"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "CurrentProductModel",
"fieldName": "当前工位生产产品型号",
"variable": "当前工位生产产品型号",
"remark": "当前工位生产中的产品型号"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "CurrentWorkOrderCode",
"fieldName": "当前工位生产工单号",
"variable": "当前工位生产工单号",
"remark": "当前工位生产中的工单号"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "CurrentWorkOrderTargetOutput",
"fieldName": "当前工位生产工单目标产量",
"variable": "当前工位生产工单目标产量",
"remark": "当前工位生产中工单的计划数量"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "CurrentWorkOrderQualifiedNumber",
"fieldName": "当前工单合格数量",
"variable": "当前工单合格数量",
"remark": "生产中工单在当前工位的合格数"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "CurrentWorkOrderUnqualifiedNumber",
"fieldName": "当前工单不合格数量",
"variable": "当前工单不合格数量",
"remark": "生产中工单在当前工位的不合格数"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "CurrentWorkOrderProcessingNumber",
"fieldName": "当前工单加工数量",
"variable": null,
"remark": "生产中工单在当前工位的加工数"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "CurrentWorkOrderQualifiedRate",
"fieldName": "当前工单合格率",
"variable": null,
"remark": "当前工单合格数量/当前工单加工数量"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "CurrentWorkOrderAchievementRate",
"fieldName": "当前工位生产工单的工位达成率",
"variable": null,
"remark": "当前工单合格数量/当前工位生产工单目标产量"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "CurrentWorkOrderPlannedStartTime",
"fieldName": "当前工位生产工单计划开始时间",
"variable": null,
"remark": "当前工位生产中工单计划开始时间"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "CurrentWorkOrderPlannedEndTime",
"fieldName": "当前工位生产工单计划结束时间",
"variable": null,
"remark": "当前工位生产中工单计划结束时间"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "ProductShortNumber",
"fieldName": "产品简号",
"variable": null,
"remark": "当前工位生产中的产品简号"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "FormulaCode",
"fieldName": "配方编号",
"variable": null,
"remark": "当前工位使用的配方编号"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "CurrentShiftQualifiedNumber",
"fieldName": "当前班次合格数量",
"variable": null,
"remark": "当前工位在当前班次的加工合格数"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "CurrentShiftUnqualifiedNumber",
"fieldName": "当前班次不合格数量",
"variable": null,
"remark": "当前工位在当前班次的加工不合格数"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "CurrentShiftProcessingNumber",
"fieldName": "当前班次加工数量",
"variable": null,
"remark": "当前工位在当前班次的加工总数"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "CurrentShiftQualifiedRate",
"fieldName": "当前班次合格率",
"variable": null,
"remark": "当前班次合格数量/当前班次加工数量"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "TodayQualifiedNumber",
"fieldName": "当日合格数量",
"variable": null,
"remark": "当前工位在当日的加工合格数"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "TodayUnqualifiedNumber",
"fieldName": "当日不合格数量",
"variable": null,
"remark": "当前工位在当日的加工不合格数"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "TodayProcessingNumber",
"fieldName": "当日加工数量",
"variable": null,
"remark": "当前工位在当日的加工总数"
}, {
"parentId": "d9c19494-ab36-f125-4959-3a12fa22637d",
"fieldCode": "TodayQualifiedRate",
"fieldName": "当日合格率",
"variable": null,
"remark": "当日合格数量/当日加工数量"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "CurrentProductName",
"fieldName": "当前工位生产产品名称",
"variable": null,
"remark": "当前工位生产中的产品名称"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "CurrentProductModel",
"fieldName": "当前工位生产产品型号",
"variable": "工序2_产品型号",
"remark": "当前工位生产中的产品型号"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "CurrentWorkOrderCode",
"fieldName": "当前工位生产工单号",
"variable": null,
"remark": "当前工位生产中的工单号"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "CurrentWorkOrderTargetOutput",
"fieldName": "当前工位生产工单目标产量",
"variable": null,
"remark": "当前工位生产中工单的计划数量"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "CurrentWorkOrderQualifiedNumber",
"fieldName": "当前工单合格数量",
"variable": null,
"remark": "生产中工单在当前工位的合格数"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "CurrentWorkOrderUnqualifiedNumber",
"fieldName": "当前工单不合格数量",
"variable": null,
"remark": "生产中工单在当前工位的不合格数"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "CurrentWorkOrderProcessingNumber",
"fieldName": "当前工单加工数量",
"variable": null,
"remark": "生产中工单在当前工位的加工数"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "CurrentWorkOrderQualifiedRate",
"fieldName": "当前工单合格率",
"variable": null,
"remark": "当前工单合格数量/当前工单加工数量"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "CurrentWorkOrderAchievementRate",
"fieldName": "当前工位生产工单的工位达成率",
"variable": null,
"remark": "当前工单合格数量/当前工位生产工单目标产量"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "CurrentWorkOrderPlannedStartTime",
"fieldName": "当前工位生产工单计划开始时间",
"variable": null,
"remark": "当前工位生产中工单计划开始时间"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "CurrentWorkOrderPlannedEndTime",
"fieldName": "当前工位生产工单计划结束时间",
"variable": null,
"remark": "当前工位生产中工单计划结束时间"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "ProductShortNumber",
"fieldName": "产品简号",
"variable": null,
"remark": "当前工位生产中的产品简号"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "FormulaCode",
"fieldName": "配方编号",
"variable": null,
"remark": "当前工位使用的配方编号"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "CurrentShiftQualifiedNumber",
"fieldName": "当前班次合格数量",
"variable": null,
"remark": "当前工位在当前班次的加工合格数"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "CurrentShiftUnqualifiedNumber",
"fieldName": "当前班次不合格数量",
"variable": null,
"remark": "当前工位在当前班次的加工不合格数"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "CurrentShiftProcessingNumber",
"fieldName": "当前班次加工数量",
"variable": null,
"remark": "当前工位在当前班次的加工总数"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "CurrentShiftQualifiedRate",
"fieldName": "当前班次合格率",
"variable": null,
"remark": "当前班次合格数量/当前班次加工数量"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "TodayQualifiedNumber",
"fieldName": "当日合格数量",
"variable": null,
"remark": "当前工位在当日的加工合格数"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "TodayUnqualifiedNumber",
"fieldName": "当日不合格数量",
"variable": null,
"remark": "当前工位在当日的加工不合格数"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "TodayProcessingNumber",
"fieldName": "当日加工数量",
"variable": null,
"remark": "当前工位在当日的加工总数"
}, {
"parentId": "6b79b8df-0dec-fb68-23eb-3a12fa26e7ce",
"fieldCode": "TodayQualifiedRate",
"fieldName": "当日合格率",
"variable": null,
"remark": "当日合格数量/当日加工数量"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "CurrentProductName",
"fieldName": "当前工位生产产品名称",
"variable": null,
"remark": "当前工位生产中的产品名称"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "CurrentProductModel",
"fieldName": "当前工位生产产品型号",
"variable": "工序3_产品型号",
"remark": "当前工位生产中的产品型号"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "CurrentWorkOrderCode",
"fieldName": "当前工位生产工单号",
"variable": null,
"remark": "当前工位生产中的工单号"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "CurrentWorkOrderTargetOutput",
"fieldName": "当前工位生产工单目标产量",
"variable": null,
"remark": "当前工位生产中工单的计划数量"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "CurrentWorkOrderQualifiedNumber",
"fieldName": "当前工单合格数量",
"variable": null,
"remark": "生产中工单在当前工位的合格数"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "CurrentWorkOrderUnqualifiedNumber",
"fieldName": "当前工单不合格数量",
"variable": null,
"remark": "生产中工单在当前工位的不合格数"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "CurrentWorkOrderProcessingNumber",
"fieldName": "当前工单加工数量",
"variable": null,
"remark": "生产中工单在当前工位的加工数"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "CurrentWorkOrderQualifiedRate",
"fieldName": "当前工单合格率",
"variable": null,
"remark": "当前工单合格数量/当前工单加工数量"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "CurrentWorkOrderAchievementRate",
"fieldName": "当前工位生产工单的工位达成率",
"variable": null,
"remark": "当前工单合格数量/当前工位生产工单目标产量"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "CurrentWorkOrderPlannedStartTime",
"fieldName": "当前工位生产工单计划开始时间",
"variable": null,
"remark": "当前工位生产中工单计划开始时间"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "CurrentWorkOrderPlannedEndTime",
"fieldName": "当前工位生产工单计划结束时间",
"variable": null,
"remark": "当前工位生产中工单计划结束时间"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "ProductShortNumber",
"fieldName": "产品简号",
"variable": null,
"remark": "当前工位生产中的产品简号"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "FormulaCode",
"fieldName": "配方编号",
"variable": null,
"remark": "当前工位使用的配方编号"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "CurrentShiftQualifiedNumber",
"fieldName": "当前班次合格数量",
"variable": null,
"remark": "当前工位在当前班次的加工合格数"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "CurrentShiftUnqualifiedNumber",
"fieldName": "当前班次不合格数量",
"variable": null,
"remark": "当前工位在当前班次的加工不合格数"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "CurrentShiftProcessingNumber",
"fieldName": "当前班次加工数量",
"variable": null,
"remark": "当前工位在当前班次的加工总数"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "CurrentShiftQualifiedRate",
"fieldName": "当前班次合格率",
"variable": null,
"remark": "当前班次合格数量/当前班次加工数量"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "TodayQualifiedNumber",
"fieldName": "当日合格数量",
"variable": null,
"remark": "当前工位在当日的加工合格数"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "TodayUnqualifiedNumber",
"fieldName": "当日不合格数量",
"variable": null,
"remark": "当前工位在当日的加工不合格数"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "TodayProcessingNumber",
"fieldName": "当日加工数量",
"variable": null,
"remark": "当前工位在当日的加工总数"
}, {
"parentId": "d4cb82f1-3b17-21c7-3a3e-3a12fa26e7d2",
"fieldCode": "TodayQualifiedRate",
"fieldName": "当日合格率",
"variable": null,
"remark": "当日合格数量/当日加工数量"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "CurrentProductName",
"fieldName": "当前工位生产产品名称",
"variable": null,
"remark": "当前工位生产中的产品名称"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "CurrentProductModel",
"fieldName": "当前工位生产产品型号",
"variable": "工序4_产品型号",
"remark": "当前工位生产中的产品型号"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "CurrentWorkOrderCode",
"fieldName": "当前工位生产工单号",
"variable": null,
"remark": "当前工位生产中的工单号"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "CurrentWorkOrderTargetOutput",
"fieldName": "当前工位生产工单目标产量",
"variable": null,
"remark": "当前工位生产中工单的计划数量"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "CurrentWorkOrderQualifiedNumber",
"fieldName": "当前工单合格数量",
"variable": null,
"remark": "生产中工单在当前工位的合格数"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "CurrentWorkOrderUnqualifiedNumber",
"fieldName": "当前工单不合格数量",
"variable": null,
"remark": "生产中工单在当前工位的不合格数"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "CurrentWorkOrderProcessingNumber",
"fieldName": "当前工单加工数量",
"variable": null,
"remark": "生产中工单在当前工位的加工数"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "CurrentWorkOrderQualifiedRate",
"fieldName": "当前工单合格率",
"variable": null,
"remark": "当前工单合格数量/当前工单加工数量"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "CurrentWorkOrderAchievementRate",
"fieldName": "当前工位生产工单的工位达成率",
"variable": null,
"remark": "当前工单合格数量/当前工位生产工单目标产量"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "CurrentWorkOrderPlannedStartTime",
"fieldName": "当前工位生产工单计划开始时间",
"variable": null,
"remark": "当前工位生产中工单计划开始时间"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "CurrentWorkOrderPlannedEndTime",
"fieldName": "当前工位生产工单计划结束时间",
"variable": null,
"remark": "当前工位生产中工单计划结束时间"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "ProductShortNumber",
"fieldName": "产品简号",
"variable": null,
"remark": "当前工位生产中的产品简号"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "FormulaCode",
"fieldName": "配方编号",
"variable": null,
"remark": "当前工位使用的配方编号"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "CurrentShiftQualifiedNumber",
"fieldName": "当前班次合格数量",
"variable": null,
"remark": "当前工位在当前班次的加工合格数"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "CurrentShiftUnqualifiedNumber",
"fieldName": "当前班次不合格数量",
"variable": null,
"remark": "当前工位在当前班次的加工不合格数"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "CurrentShiftProcessingNumber",
"fieldName": "当前班次加工数量",
"variable": null,
"remark": "当前工位在当前班次的加工总数"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "CurrentShiftQualifiedRate",
"fieldName": "当前班次合格率",
"variable": null,
"remark": "当前班次合格数量/当前班次加工数量"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "TodayQualifiedNumber",
"fieldName": "当日合格数量",
"variable": null,
"remark": "当前工位在当日的加工合格数"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "TodayUnqualifiedNumber",
"fieldName": "当日不合格数量",
"variable": null,
"remark": "当前工位在当日的加工不合格数"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "TodayProcessingNumber",
"fieldName": "当日加工数量",
"variable": null,
"remark": "当前工位在当日的加工总数"
}, {
"parentId": "64b38d13-f39b-19c9-05ee-3a12fa26e7e4",
"fieldCode": "TodayQualifiedRate",
"fieldName": "当日合格率",
"variable": null,
"remark": "当日合格数量/当日加工数量"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "CurrentProductName",
"fieldName": "当前工位生产产品名称",
"variable": null,
"remark": "当前工位生产中的产品名称"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "CurrentProductModel",
"fieldName": "当前工位生产产品型号",
"variable": "工序5_产品型号",
"remark": "当前工位生产中的产品型号"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "CurrentWorkOrderCode",
"fieldName": "当前工位生产工单号",
"variable": null,
"remark": "当前工位生产中的工单号"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "CurrentWorkOrderTargetOutput",
"fieldName": "当前工位生产工单目标产量",
"variable": null,
"remark": "当前工位生产中工单的计划数量"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "CurrentWorkOrderQualifiedNumber",
"fieldName": "当前工单合格数量",
"variable": null,
"remark": "生产中工单在当前工位的合格数"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "CurrentWorkOrderUnqualifiedNumber",
"fieldName": "当前工单不合格数量",
"variable": null,
"remark": "生产中工单在当前工位的不合格数"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "CurrentWorkOrderProcessingNumber",
"fieldName": "当前工单加工数量",
"variable": null,
"remark": "生产中工单在当前工位的加工数"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "CurrentWorkOrderQualifiedRate",
"fieldName": "当前工单合格率",
"variable": null,
"remark": "当前工单合格数量/当前工单加工数量"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "CurrentWorkOrderAchievementRate",
"fieldName": "当前工位生产工单的工位达成率",
"variable": null,
"remark": "当前工单合格数量/当前工位生产工单目标产量"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "CurrentWorkOrderPlannedStartTime",
"fieldName": "当前工位生产工单计划开始时间",
"variable": null,
"remark": "当前工位生产中工单计划开始时间"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "CurrentWorkOrderPlannedEndTime",
"fieldName": "当前工位生产工单计划结束时间",
"variable": null,
"remark": "当前工位生产中工单计划结束时间"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "ProductShortNumber",
"fieldName": "产品简号",
"variable": null,
"remark": "当前工位生产中的产品简号"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "FormulaCode",
"fieldName": "配方编号",
"variable": null,
"remark": "当前工位使用的配方编号"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "CurrentShiftQualifiedNumber",
"fieldName": "当前班次合格数量",
"variable": null,
"remark": "当前工位在当前班次的加工合格数"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "CurrentShiftUnqualifiedNumber",
"fieldName": "当前班次不合格数量",
"variable": null,
"remark": "当前工位在当前班次的加工不合格数"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "CurrentShiftProcessingNumber",
"fieldName": "当前班次加工数量",
"variable": null,
"remark": "当前工位在当前班次的加工总数"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "CurrentShiftQualifiedRate",
"fieldName": "当前班次合格率",
"variable": null,
"remark": "当前班次合格数量/当前班次加工数量"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "TodayQualifiedNumber",
"fieldName": "当日合格数量",
"variable": null,
"remark": "当前工位在当日的加工合格数"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "TodayUnqualifiedNumber",
"fieldName": "当日不合格数量",
"variable": null,
"remark": "当前工位在当日的加工不合格数"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "TodayProcessingNumber",
"fieldName": "当日加工数量",
"variable": null,
"remark": "当前工位在当日的加工总数"
}, {
"parentId": "a3b52a63-64ed-6e20-46a9-3a12fa26e7e9",
"fieldCode": "TodayQualifiedRate",
"fieldName": "当日合格率",
"variable": null,
"remark": "当日合格数量/当日加工数量"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "CurrentProductName",
"fieldName": "当前工位生产产品名称",
"variable": null,
"remark": "当前工位生产中的产品名称"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "CurrentProductModel",
"fieldName": "当前工位生产产品型号",
"variable": "工序6_产品型号",
"remark": "当前工位生产中的产品型号"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "CurrentWorkOrderCode",
"fieldName": "当前工位生产工单号",
"variable": null,
"remark": "当前工位生产中的工单号"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "CurrentWorkOrderTargetOutput",
"fieldName": "当前工位生产工单目标产量",
"variable": null,
"remark": "当前工位生产中工单的计划数量"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "CurrentWorkOrderQualifiedNumber",
"fieldName": "当前工单合格数量",
"variable": null,
"remark": "生产中工单在当前工位的合格数"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "CurrentWorkOrderUnqualifiedNumber",
"fieldName": "当前工单不合格数量",
"variable": null,
"remark": "生产中工单在当前工位的不合格数"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "CurrentWorkOrderProcessingNumber",
"fieldName": "当前工单加工数量",
"variable": null,
"remark": "生产中工单在当前工位的加工数"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "CurrentWorkOrderQualifiedRate",
"fieldName": "当前工单合格率",
"variable": null,
"remark": "当前工单合格数量/当前工单加工数量"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "CurrentWorkOrderAchievementRate",
"fieldName": "当前工位生产工单的工位达成率",
"variable": null,
"remark": "当前工单合格数量/当前工位生产工单目标产量"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "CurrentWorkOrderPlannedStartTime",
"fieldName": "当前工位生产工单计划开始时间",
"variable": null,
"remark": "当前工位生产中工单计划开始时间"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "CurrentWorkOrderPlannedEndTime",
"fieldName": "当前工位生产工单计划结束时间",
"variable": null,
"remark": "当前工位生产中工单计划结束时间"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "ProductShortNumber",
"fieldName": "产品简号",
"variable": null,
"remark": "当前工位生产中的产品简号"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "FormulaCode",
"fieldName": "配方编号",
"variable": null,
"remark": "当前工位使用的配方编号"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "CurrentShiftQualifiedNumber",
"fieldName": "当前班次合格数量",
"variable": null,
"remark": "当前工位在当前班次的加工合格数"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "CurrentShiftUnqualifiedNumber",
"fieldName": "当前班次不合格数量",
"variable": null,
"remark": "当前工位在当前班次的加工不合格数"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "CurrentShiftProcessingNumber",
"fieldName": "当前班次加工数量",
"variable": null,
"remark": "当前工位在当前班次的加工总数"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "CurrentShiftQualifiedRate",
"fieldName": "当前班次合格率",
"variable": null,
"remark": "当前班次合格数量/当前班次加工数量"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "TodayQualifiedNumber",
"fieldName": "当日合格数量",
"variable": null,
"remark": "当前工位在当日的加工合格数"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "TodayUnqualifiedNumber",
"fieldName": "当日不合格数量",
"variable": null,
"remark": "当前工位在当日的加工不合格数"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "TodayProcessingNumber",
"fieldName": "当日加工数量",
"variable": null,
"remark": "当前工位在当日的加工总数"
}, {
"parentId": "0ad79d9b-0f0c-333a-b57a-3a12fa954ef0",
"fieldCode": "TodayQualifiedRate",
"fieldName": "当日合格率",
"variable": null,
"remark": "当日合格数量/当日加工数量"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "CurrentProductName",
"fieldName": "当前工位生产产品名称",
"variable": null,
"remark": "当前工位生产中的产品名称"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "CurrentProductModel",
"fieldName": "当前工位生产产品型号",
"variable": "工序6_产品型号",
"remark": "当前工位生产中的产品型号"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "CurrentWorkOrderCode",
"fieldName": "当前工位生产工单号",
"variable": null,
"remark": "当前工位生产中的工单号"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "CurrentWorkOrderTargetOutput",
"fieldName": "当前工位生产工单目标产量",
"variable": null,
"remark": "当前工位生产中工单的计划数量"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "CurrentWorkOrderQualifiedNumber",
"fieldName": "当前工单合格数量",
"variable": null,
"remark": "生产中工单在当前工位的合格数"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "CurrentWorkOrderUnqualifiedNumber",
"fieldName": "当前工单不合格数量",
"variable": null,
"remark": "生产中工单在当前工位的不合格数"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "CurrentWorkOrderProcessingNumber",
"fieldName": "当前工单加工数量",
"variable": null,
"remark": "生产中工单在当前工位的加工数"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "CurrentWorkOrderQualifiedRate",
"fieldName": "当前工单合格率",
"variable": null,
"remark": "当前工单合格数量/当前工单加工数量"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "CurrentWorkOrderAchievementRate",
"fieldName": "当前工位生产工单的工位达成率",
"variable": null,
"remark": "当前工单合格数量/当前工位生产工单目标产量"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "CurrentWorkOrderPlannedStartTime",
"fieldName": "当前工位生产工单计划开始时间",
"variable": null,
"remark": "当前工位生产中工单计划开始时间"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "CurrentWorkOrderPlannedEndTime",
"fieldName": "当前工位生产工单计划结束时间",
"variable": null,
"remark": "当前工位生产中工单计划结束时间"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "ProductShortNumber",
"fieldName": "产品简号",
"variable": null,
"remark": "当前工位生产中的产品简号"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "FormulaCode",
"fieldName": "配方编号",
"variable": null,
"remark": "当前工位使用的配方编号"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "CurrentShiftQualifiedNumber",
"fieldName": "当前班次合格数量",
"variable": null,
"remark": "当前工位在当前班次的加工合格数"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "CurrentShiftUnqualifiedNumber",
"fieldName": "当前班次不合格数量",
"variable": null,
"remark": "当前工位在当前班次的加工不合格数"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "CurrentShiftProcessingNumber",
"fieldName": "当前班次加工数量",
"variable": null,
"remark": "当前工位在当前班次的加工总数"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "CurrentShiftQualifiedRate",
"fieldName": "当前班次合格率",
"variable": null,
"remark": "当前班次合格数量/当前班次加工数量"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "TodayQualifiedNumber",
"fieldName": "当日合格数量",
"variable": null,
"remark": "当前工位在当日的加工合格数"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "TodayUnqualifiedNumber",
"fieldName": "当日不合格数量",
"variable": null,
"remark": "当前工位在当日的加工不合格数"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "TodayProcessingNumber",
"fieldName": "当日加工数量",
"variable": null,
"remark": "当前工位在当日的加工总数"
}, {
"parentId": "b19bb7d0-26da-a4b0-3eb6-3a12fa970bfc",
"fieldCode": "TodayQualifiedRate",
"fieldName": "当日合格率",
"variable": null,
"remark": "当日合格数量/当日加工数量"
} ]
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 条码解析-分隔符号
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodeanalysis/analysis
method: get
params:
{"CodeDemo":"AAA-BBB","Type":"0","Symbol":"-"}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
- name: 条码解析-起止符号
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodeanalysis/analysis
method: get
params:
{"CodeDemo":"AAA-BBBCCCDDD","Type":"1","StartSymbol":"B","EndSymbol":"D"}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
- name: 条码解析-固定长度
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodeanalysis/analysis
method: get
params:
{"CodeDemo":"AAABBBCCC","Type":"2","FixedLength":"3,3,3"}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
- name: 创建条码生成规则
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodegeneration
method: post
json:
{
"barcodeGenerationDetails": [ {
"generationType": 0,
"demo": "SL",
"name": "条码段1-固定字符",
"sort": 1
}, {
"generationType": 1,
"autoIncrementType": 3,
"carrySystemType": 0,
"demo": "XH001",
"name": "条码段2-按型号自增",
"sort": 2
}, {
"variableId": 272,
"variableName": "条码生成规则变量",
"generationType": 2,
"demo": "ABC",
"name": "条码段3",
"sort": 3
}, {
"generationType": 4,
"businessFieldCode": "CurrentWorkOrderCode",
"demo": "GD001",
"name": "当前工单号",
"sort": 4
} ],
"codeDemo": "SLXH001ABCGD001",
"name": "条码生成规则1"
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
BarcodeGenerationRule1_ID: id.0
BarcodeSection1_ID: id.1
BarcodeSection2_ID: id.2
BarcodeSection3_ID: id.3
BarcodeSection4_ID: id.4
validate:
- equals: {status_code: 200}
- name: 创建条码生成规则-用于删除
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodegeneration
method: post
json:
{
"barcodeGenerationDetails": [ {
"generationType": 0,
"demo": "SL",
"name": "条码段1-固定字符",
"sort": 1
}, {
"generationType": 1,
"autoIncrementType": 3,
"carrySystemType": 0,
"demo": "XH001",
"name": "条码段2-按型号自增",
"sort": 2
}, {
"variableId": 272,
"variableName": "条码生成规则变量",
"generationType": 2,
"demo": "ABC",
"name": "条码段3",
"sort": 3
}, {
"generationType": 4,
"businessFieldCode": "CurrentWorkOrderCode",
"demo": "GD001",
"name": "当前工单号",
"sort": 4
} ],
"codeDemo": "SLXH001ABCGD001",
"name": "条码生成规则2"
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
BarcodeGenerationRule2_ID: id.0
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 创建条码解析规则-分隔符号
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodeanalysis
method: post
json:
{
"type": 0,
"name": "条码规则-分隔符号",
"codeDemo": "AAA-BBB",
"symbol": "-",
"barcodeAnalysisDetails": [ {
"name": "自定义名称1",
"content": "AAA",
"digit": 3,
"sort": 0,
"format": "",
"buildType": 0,
"bussinessObj": 0,
"bussinessID": 0,
"varName": "",
"extraProperties": { },
"creationTime": "2024-08-16T13:53:50.8999729+08:00",
"id_key": "row_42"
}, {
"name": "自定义名称2",
"content": "BBB",
"digit": 3,
"sort": 1,
"format": "",
"buildType": 0,
"bussinessObj": 0,
"bussinessID": 0,
"varName": "",
"extraProperties": { },
"creationTime": "2024-08-16T13:53:50.8999737+08:00",
"id_key": "row_43"
} ]
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
BarcodeRule_ID: id
BarcodeRule_Name: name
validate:
- equals: {status_code: 200}
- name: 创建条码解析规则-起止符号
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodeanalysis
method: post
json:
{
"type": 1,
"codeDemo": "AAA-BBBCCCDDD",
"startSymbol": "B",
"endSymbol": "D",
"name": "条码规则-起止符号",
"barcodeAnalysisDetails": [ {
"name": "自定义名称1",
"content": "AAA-",
"digit": 4,
"sort": 0,
"format": "",
"buildType": 0,
"bussinessObj": 0,
"bussinessID": 0,
"varName": "",
"extraProperties": { },
"creationTime": "2024-08-16T13:57:07.4225283+08:00",
"id_key": "row_44"
}, {
"name": "自定义名称2",
"content": "BBCCC",
"digit": 5,
"sort": 1,
"format": "",
"buildType": 0,
"bussinessObj": 0,
"bussinessID": 0,
"varName": "",
"extraProperties": { },
"creationTime": "2024-08-16T13:57:07.4225295+08:00",
"id_key": "row_45"
}, {
"name": "自定义名称3",
"content": "DD",
"digit": 2,
"sort": 2,
"format": "",
"buildType": 0,
"bussinessObj": 0,
"bussinessID": 0,
"varName": "",
"extraProperties": { },
"creationTime": "2024-08-16T13:57:07.4225301+08:00",
"id_key": "row_46"
} ]
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
- name: 创建条码解析规则-固定长度
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodeanalysis
method: post
json:
{
"type": 2,
"name": "条码规则-固定长度",
"codeDemo": "AAABBBCCC",
"fixedLength": "3,3,3",
"barcodeAnalysisDetails": [ {
"name": "自定义名称1",
"content": "AAA",
"digit": 3,
"sort": 0,
"format": "",
"buildType": 0,
"bussinessObj": 0,
"bussinessID": 0,
"varName": "",
"extraProperties": { },
"creationTime": "2024-08-16T13:58:20.5264578+08:00",
"id_key": "row_47"
}, {
"name": "自定义名称2",
"content": "BBB",
"digit": 3,
"sort": 1,
"format": "",
"buildType": 0,
"bussinessObj": 0,
"bussinessID": 0,
"varName": "",
"extraProperties": { },
"creationTime": "2024-08-16T13:58:20.5264601+08:00",
"id_key": "row_48"
}, {
"name": "自定义名称3",
"content": "CCC",
"digit": 3,
"sort": 2,
"format": "",
"buildType": 0,
"bussinessObj": 0,
"bussinessID": 0,
"varName": "",
"extraProperties": { },
"creationTime": "2024-08-16T13:58:20.5264608+08:00",
"id_key": "row_49"
} ]
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
- name: 创建条码校验规则-解析条码段
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodeverification
method: post
json:
{
"verificationRule": 1,
"verificationType": 1,
"barcodeAnalysisId": "${get_extract_data(BarcodeRule_ID)}",
"barcodeAnalysisName": "${get_extract_data(BarcodeRule_Name)}",
"name": "条码校验规则-解析条码段",
"remark": "备注略略略",
"barcodeAnalysisDetails": [ {
"sort": 0,
"name": "自定义名称1",
"content": "AAA",
"digit": 3,
"verificationType": 2
}, {
"sort": 1,
"name": "自定义名称2",
"content": "BBB",
"digit": 3,
"verificationType": 0
} ]
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
BarcodeVerificationRule1_ID: id
validate:
- equals: {status_code: 200}
- name: 创建条码校验规则-长度校验
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodeverification
method: post
json:
{
"verificationRule": 0,
"verificationType": 0,
"name": "条码校验规则-长度校验",
"barcodeLength": "5"
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
BarcodeVerificationRule2_ID: id
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 删除条码解析规则
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodeanalysis
method: delete
json:
["${get_extract_data(BarcodeGenerationRule2_ID)}"]
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 删除条码解析规则
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodeanalysis
method: delete
json:
["${get_extract_data(BarcodeRule_ID)}"]
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 删除条码校验规则
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodeverification
method: delete
json:
["${get_extract_data(BarcodeVerificationRule2_ID)}"]
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 查询条码生成规则
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodegeneration?SkipCount=0&MaxResultCount=50
method: get
params:
SkipCount: 0
MaxResultCount: 50
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
concurrencyStamp: concurrencyStamp
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 查询条码解析规则
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodeanalysis?SkipCount=0&MaxResultCount=50
method: get
params:
SkipCount: 0
MaxResultCount: 50
Filter: 起止
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 查询条码校验规则
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodeverification?SkipCount=0&MaxResultCount=50
method: get
params:
SkipCount: 0
MaxResultCount: 50
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
BarcodeVerificationRule1_concurrencyStamp: concurrencyStamp
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 修改条码生成规则
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodegeneration/${get_extract_data(BarcodeGenerationRule1_ID)}
method: put
json:
{
"name": "条码生成规则1",
"isUsed": false,
"barcodeGenerationDetails": [ {
"id": "${get_extract_data(BarcodeSection1_ID)}",
"generationType": 0,
"businessFieldCode": null,
"demo": "SL1",
"name": "条码段1-固定字符",
"sort": 1
}, {
"id": "${get_extract_data(BarcodeSection2_ID)}",
"generationType": 1,
"businessFieldCode": null,
"autoIncrementType": 3,
"carrySystemType": 0,
"demo": "XH001",
"name": "条码段2-按型号自增",
"sort": 2
}, {
"id": "${get_extract_data(BarcodeSection3_ID)}",
"variableId": 272,
"variableName": "条码生成规则变量",
"generationType": 2,
"businessFieldCode": null,
"demo": "ABC",
"name": "条码段3",
"sort": 3
}, {
"id": "${get_extract_data(BarcodeSection4_ID)}",
"generationType": 4,
"businessFieldCode": "CurrentWorkOrderCode",
"demo": "GD001",
"name": "当前工单号",
"sort": 4
} ],
"barcodeGenerationDetailsDisplay": "条码段1-固定字符/条码段2-按型号自增/条码段3/当前工单号",
"codeDemo": "SL1XH001ABCGD001",
"lastModificationTime": "2024-08-19T16:24:54.34273",
"remark": null,
"concurrencyStamp": "${get_extract_data(concurrencyStamp)}",
"id": "${get_extract_data(BarcodeGenerationRule1_ID)}",
"extraProperties": { }
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 修改条码校验规则
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/barcodemanagement/barcodeverification/${get_extract_data(BarcodeVerificationRule1_ID)}
method: put
json:
{
"verificationRule": 1,
"verificationType": null,
"name": "条码校验规则-解析条码段",
"isUsed": false,
"verificationRuleDisplay": "条码规则-分隔符号-自定义名称1;自定义名称2",
"verificationTypeDisplay": "产品型号校验、长度检验",
"barcodeLength": null,
"barcodeAnalysisId": "${get_extract_data(BarcodeRule_ID)}",
"barcodeAnalysisName": "${get_extract_data(BarcodeRule_Name)}",
"barcodeAnalysisDetails": [ {
"sort": 0,
"name": "自定义名称1",
"content": "AAA",
"digit": 3,
"verificationType": 1
}, {
"sort": 1,
"name": "自定义名称2",
"content": "BBB",
"digit": 3,
"verificationType": 0
} ],
"lastModificationTime": "2024-08-22T11:47:02.192955",
"remark": "备注略略略-编辑",
"concurrencyStamp": "${get_extract_data(BarcodeVerificationRule1_concurrencyStamp)}",
"id": "${get_extract_data(BarcodeVerificationRule1_ID)}",
"extraProperties": { }
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- 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/9_BarcodeManagement/analyze_Barcode.yaml'))
# def test_analyze_Barcode(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/9_BarcodeManagement/create_BarcodeRule.yaml'))
# def test_create_BarcodeRule(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/9_BarcodeManagement/delete_BarcodeRule.yaml'))
# def test_delete_BarcodeRule(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/9_BarcodeManagement/get_BarcodeRule.yaml'))
# def test_get_BarcodeRule(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/9_BarcodeManagement/create_BarcodeGenerationRule.yaml'))
# def test_create_BarcodeGenerationRule(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/9_BarcodeManagement/get_BarcodeGenerationRule.yaml'))
# def test_get_BarcodeGenerationRule(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/9_BarcodeManagement/put_BarcodeGenerationRule.yaml'))
# def test_put_BarcodeGenerationRule(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/9_BarcodeManagement/delete_BarcodeGenerationRule.yaml'))
# def test_delete_BarcodeGenerationRule(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/9_BarcodeManagement/create_BarcodeVerificationRule.yaml'))
# def test_create_BarcodeVerificationRule(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/9_BarcodeManagement/get_BarcodeVerificationRule.yaml'))
def test_get_BarcodeVerificationRule(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/9_BarcodeManagement/put_BarcodeVerificationRule.yaml'))
# def test_put_BarcodeVerificationRule(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/9_BarcodeManagement/delete_BarcodeVerificationRule.yaml'))
# def test_delete_BarcodeVerificationRule(self, caseinfo):
# allure.dynamic.title(caseinfo['name'])
# allure.dynamic.description(caseinfo['name'])
# RequestUtil().analysis_yaml(caseinfo)
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/A1_MaterialManagement/create_Materials.yaml'))
def test_create_Materials(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/A1_MaterialManagement/create_MaterialNumbers.yaml'))
def test_create_MaterialNumbers(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/A1_MaterialManagement/get_MaterialInformations.yaml'))
def test_get_MaterialInformations(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/A1_MaterialManagement/put_Material.yaml'))
def test_put_Material(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/A1_MaterialManagement/put_MaterialNumber.yaml'))
def test_put_MaterialNumber(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/A1_MaterialManagement/delete_MaterialNumbers.yaml'))
def test_delete_MaterialNumbers(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/A1_MaterialManagement/delete_Materials.yaml'))
def test_delete_Materials(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
- name: 查询条码校验规则
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/messuite/query/barcodeverification?SkipCount=0&MaxResultCount=50
method: get
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
BarcodeVerificationRule_ID: id
validate:
- equals: {status_code: 200}
- name: 创建批次物料编号
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/material/${get_extract_data(Material1_ID)}
method: post
json:
{
"name": "批次料1",
"materialType": 0,
"code": "WL1-001",
"verificationBarcodeId": "${get_extract_data(BarcodeVerificationRule_ID)}"
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
MaterialNumber1_ID: id
verificationBarcode: verificationBarcode
verificationBarcodeId: verificationBarcodeId
validate:
- equals: {status_code: 200}
- name: 创建唯一物料编号
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/material/${get_extract_data(Material2_ID)}
method: post
json:
{
"name": "唯一料1",
"materialType": 1,
"code": "WL2-001",
"verificationBarcodeId": "${get_extract_data(BarcodeVerificationRule_ID)}"
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
MaterialNumber2_ID: id
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 创建物料-批次料
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/material
method: post
json:
{
"name": "批次料1",
"materialType": 0,
"unit": "个",
"remark": "批次料1备注"
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
Material1_ID: id
validate:
- equals: {status_code: 200}
- name: 创建物料-唯一料
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/material
method: post
json:
{
"name": "唯一料1",
"materialType": 1,
"unit": "个",
"remark": "唯一料1备注"
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
Material2_ID: id
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 创建唯一物料编号-用于删除
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/material/${get_extract_data(Material2_ID)}
method: post
json:
{
"name": "唯一料1",
"materialType": 1,
"code": "WL3-001",
"verificationBarcodeId": "${get_extract_data(BarcodeVerificationRule_ID)}"
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
MaterialNumber_delete_ID: id
validate:
- equals: {status_code: 200}
- name: 删除物料编号
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/material/${get_extract_data(Material2_ID)}
method: delete
json:
["${get_extract_data(MaterialNumber_delete_ID)}"]
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
- name: 创建物料-用于删除
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/material
method: post
json:
{
"name": "唯一料2",
"materialType": 1,
"unit": "个",
"remark": "唯一料1备注"
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
Material3_ID: id
validate:
- equals: {status_code: 200}
- name: 删除物料
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/material
method: delete
json:
["${get_extract_data(Material3_ID)}"]
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 创建物料-批次料
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/material?SkipCount=0&MaxResultCount=50
method: get
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
Material1_concurrencyStamp: concurrencyStamp.1
validate:
- equals: {status_code: 200}
- name: 修改物料
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/material/${get_extract_data(Material1_ID)}
method: put
json:
{
"name": "批次料1-修改为唯一料",
"materialType": 1,
"materialTypeDisplay": "批次料",
"unit": "个",
"order": 0,
"remark": "批次料1备注-修改",
"materialDetails": [ {
"id": "${get_extract_data(MaterialNumber1_ID)}",
"code": "WL1-002",
"order": 1,
"verificationBarcode": "${get_extract_data(verificationBarcode)}",
"verificationBarcodeId": "${get_extract_data(verificationBarcodeId)}",
"extraProperties": { }
} ],
"concurrencyStamp": "${get_extract_data(Material1_concurrencyStamp)}",
"id": "${get_extract_data(Material1_ID)}",
"extraProperties": { }
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
- name: 修改物料
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/material/${get_extract_data(Material1_ID)}/${get_extract_data(MaterialNumber1_ID)}
method: put
json:
{
"name": "批次料1",
"materialType": 0,
"id": "${get_extract_data(MaterialNumber1_ID)}",
"code": "WL1-002",
"order": 1,
"verificationBarcode": "${get_extract_data(verificationBarcode)}",
"verificationBarcodeId": "${get_extract_data(verificationBarcodeId)}",
"extraProperties": { }
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
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/A2_BomManagement/import_WorkSections.yaml'))
def test_import_WorkSections(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/A2_BomManagement/create_Products.yaml'))
def test_create_Products(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/A2_BomManagement/import_Formulars.yaml'))
def test_import_Formulars(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/A2_BomManagement/get_ProcessRoutes.yaml'))
def test_get_ProcessRoutes(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/A2_BomManagement/get_Materials.yaml'))
def test_get_Materials(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:创建BOM")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/A2_BomManagement/create_Bom.yaml'))
def test_create_Bom(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:查询BOM")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/A2_BomManagement/get_Bom.yaml'))
def test_get_Bom(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:编辑BOM工序物料")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/A2_BomManagement/put_Bom.yaml'))
def test_put_Bom(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:删除BOM")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/A2_BomManagement/delete_Bom.yaml'))
def test_delete_Bom(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:编辑BOM名称")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/A2_BomManagement/put_BomName.yaml'))
def test_put_BomName(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:导出BOM")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/A2_BomManagement/export_Bom.yaml'))
def test_export_Bom(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
@allure.story("接口名称:导入BOM")
@pytest.mark.parametrize('caseinfo', read_testcase_file('/testcase/A2_BomManagement/import_Bom.yaml'))
def test_import_Bom(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
- name: 创建BOM物料1
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/billofmaterial/${get_extract_data(Product_ID)}
method: post
json:
{
"processId": "${get_extract_data(WorkSection1_ID)}",
"materialDetailId": "${get_extract_data(MaterialNumber2_ID)}",
"materialName": "唯一料1",
"materialType": "唯一料",
"materialUnit": "个",
"dosage": "10",
"materialId": "${get_extract_data(Material2_ID)}"
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
- name: 创建BOM物料2
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/billofmaterial/${get_extract_data(Product_ID)}
method: post
json:
{
"processId": "${get_extract_data(WorkSection2_ID)}",
"materialDetailId": "${get_extract_data(MaterialNumber2_ID)}",
"materialName": "唯一料1",
"materialType": "唯一料",
"materialUnit": "个",
"dosage": "10",
"materialId": "${get_extract_data(Material2_ID)}"
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
- name: 创建产品
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/productmanagement/product
method: post
json:
{
"name": "产品1",
"model": "XH1",
"identificationCode": "识别码1",
"shortNumber": "JH1",
"remark": "备注1"
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
Product_ID: id
validate:
- equals: {status_code: 200}
- name: 删除BOM
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/billofmaterial/${get_extract_data(Product_ID)}
method: delete
json:
["${get_extract_data(BOM_Material2_ID)}"]
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
- name: 导入配方
base_url: ${get_base_url()}
request:
url: /api/v1/materialmanagement/billofmaterial/export
method: get
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: 创建BOM物料1
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/billofmaterial/${get_extract_data(Product_ID)}?Filter=&processidfilter=&materialType=
method: get
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
BOM_Material1_ID: id.1
BOM_Material2_ID: id.0
validate:
- equals: {status_code: 200}
- name: 创建BOM物料1
base_url: ${get_base_url(cms_url)}
request:
url: testcase/A2_BomManagement/get_BomName.yaml
method: get
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
ProductId: id.0
validate:
- equals: {status_code: 200}
- name: 查询物料信息
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/material?MaxResultCount=999&SkipCount=0&IncludeDetails=true
method: get
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
Material2_ID: id.0
MaterialNumber2_ID: id.1
Material1_ID: id.2
MaterialNumber1_ID: id.3
validate:
- equals: {status_code: 200}
- name: 查询工艺路线-获取工序id
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/messuite/query/processroutes
method: get
params:
SkipCount: 0
MaxResultCount: 999
productId: ${get_extract_data(Product_ID)}
includeDetails: false
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
extract:
WorkSection1_ID: id.0
WorkSection2_ID: id.1
validate:
- equals: {status_code: 200}
- name: 导入配方
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/billofmaterial/import
method: put
files:
file: ${get_project_path2()}\data\BOM\BOM管理.xlsx
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
- name: 导入配方
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/formulamanagement/formula/import
method: post
files:
file: ${get_project_path2()}\data\BOM\配方管理.xlsx
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
- name: 导入工序列表
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/processmanagement/worksection/import
method: post
files:
file: ${get_project_path2()}\data\BOM\工序列表.xlsx
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
- name: 编辑BOM
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/billofmaterial/${get_extract_data(Product_ID)}/${get_extract_data(BOM_Material1_ID)}
method: put
json:
{
"id": "${get_extract_data(BOM_Material1_ID)}",
"order": 2,
"processId": "${get_extract_data(WorkSection1_ID)}",
"processName": "工序1",
"materialId": "${get_extract_data(Material1_ID)}",
"materialDetailId": "${get_extract_data(MaterialNumber1_ID)}",
"materialCode": "WL2-001",
"materialName": "批次料1-修改为唯一料",
"materialType": "唯一料",
"materialUnit": "个",
"dosage": "2",
"extraProperties": { }
}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
- name: 编辑BOM名称
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/materialmanagement/billofmaterial/${get_extract_data(Product_ID)}
method: put
json:
{"bomName":"BOM1"}
headers:
X-Project: ${get_project_Authorization(x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
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/test/get_Authorization.yaml'))
def test_get_Authorization(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/test/create_project.yaml'))
def test_create_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/test/get_project_info.yaml'))
def test_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/test/upload_image.yaml'))
def test_upload_image(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/test/variable_write.yaml'))
def test_variable_write(self, caseinfo):
allure.dynamic.title(caseinfo['name'])
allure.dynamic.description(caseinfo['name'])
RequestUtil().analysis_yaml(caseinfo)
\ 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(100,999)}
path: "C:\\Users\\Administrator\\Downloads"
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/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
validate:
- equals: {status_code: 200}
- contains: id
\ No newline at end of file
- name: 上传png图片
base_url: ${get_base_url(cms_url)}
request:
url: /api/v1/view/image/gallery?group=%E6%88%91%E7%9A%84\Default
method: post
files:
formFiles: "${get_project_path()}\\data\\picture\\11.png"
headers:
X-Project: ${get_extract_data(x_project)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
- name: $csv{name}_变量下发
base_url: ${get_base_url(cms_url)}
parameters:
name-tagname-tagvalue: data/test/variable_write.csv
request:
url: /api/v1/variable/setvalues
method: post
json:
{"$csv{tagname}":"$csv{tagvalue}"}
headers:
X-Project: ${get_config(project,x_project)}
Authorization: ${get_project_Authorization(Authorization)}
validate:
- equals: {status_code: 200}
\ No newline at end of file
框架:python+pytest+allure
安装插件:执行 requestments.txt
执行文件:all_test.py
其他文件:
common:全局方法
data:文件数据
logs:运行日志
reports:报告
testcase:用例
config.yml:基础路径配置文件
conftest.py:前后置
debug_talk.py:自定义方法
extract.yaml:提取字段存储位置
pytest.ini:pytest配置文件
\ No newline at end of file
接口自动化测试框架文件编写规则
1.必须有的四个一级关键字:name,base_url,request,validate
2.在request一级关键字下必须包括两个二级关键字:method,url
3.传参方式:在request一级关键字下,通过二级关键字传参:
如果是get请求,通过params传参
如果是post请求:
传json格式,通过json关键传参
传表单格式,通过data关键传参
传文件格式,通过files关键字传参
4.接口关联,须使用一级关键字:extract,格式如下:
extract:
保存名称:提取字段
提供四种提取方式:
1).json提取方式
extract:
name: access_token
2).正则表达式提取方式
extract:
name: '"key":"(.*?)"'
3).list提取
extract:
name: id.0
(根据索引提取)
4).响应体是string,提取所有文本:
extract:
name: content
5).dict提取:
包含列表提取:字段名.索引 originalId.0 (遍历所有originalId值并取第一个)
纯字段提取: 字段名 originalId
extract:
name: originalId.0
extract:
name: originalId
5.热加载,当yaml需要使用动态参数时,可在debug_talk.py文件中写调用方法。
(注意:传参时,根据所需类型进行强转),如:
#获取随机数的方法
def get_random_number(self,min,max):
return random.randint(int(min),int(max))
引用格式:${函数名(参数1,参数2)}
6.断言:
1)实际值等于预期值,关键字:equals
用法: equals: {status_code: 200}
特列: equals: {content: "文本1"},取响应体等于预期值
2)实际值不等于预期值,关键字:not_equals
用法: not_equals: {name: aa}
3)响应体包含该字段,关键字:contains
用法: contains: user
4)响应体不包含该字段,关键字:not_contain
5)实际值大于预期值,关键字:greater_than
用法: greater_than: {A1: 10}
6)字符串长度大于预期值,关键字:length_greater_than
用法: length_greater_than: {HOUR1: 0}
注意:
1)引用csv文件数据:需加引号,如:- equals: {data: '$csv{tagvalue}'}
2)仅支持返回数据是json或列表格式,嵌套类型不支持,如列表嵌套字典,字典嵌套列表
7.数据驱动:关键字parameters,使用csv文件存储数据
yaml写法:
parameters:
name1-name2: data/get_caate_node.csv
csv文件写法:
name1,name2
创建工程1,test88
创建工程2,test99
引用:
1) $csv{name1}
2) 由于读取csv默认返回是字符串类型,需转类型,函数:ddt{{数值/动态参数}},支持如下类型的转换
1. 将字符串的true、false转为bool类型的True和False
2. 将空或null 转为 None (csv直接写入"")
3. 将带小数点的数值自动转为 浮点数
4. 将字符类数值 转为 数值型
8.日志监控,异常处理以及基础路径的设置
9、报错汇总:
1. 读取yaml文件报:expected ',' or '}', but got '{'
解决方式:格式异常,需改为yaml格式
10、典型示例:
1)上传文件:testcase/A3_9_API_Interconnection/import_apilist.yml,导入api接口
testcase/A3_9_API_Interconnection/create_tunnel.yml,导入变量
2)数据驱动:testcase/3_VariableManagement/creat_io_variable.yml
3)断言:testcase/A3_9_API_Interconnection/post_api.yml
testcase/1_EngineeringManagement/data_check(data_clear).yml.yml
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