代码结构:
-- 全流程性能测试.py
--功能1性能.py
--功能2性能.py
--功能3性能.py
-- get_token.py # 在执行前先获取一个token
全流程性能测试.py:
import os from 性能自动化.get_token import get_token from 性能自动化.testCTP import auto_ctpanaly, manual_ctpanaly from 性能自动化.testDeL import Test_Del_Study from 性能自动化.testRealign import TestRealign from 性能自动化.testUpload import testupload if __name__ == '__main__': base_url = 'https://test.dinova.com:8081' study_paths = r'F:\CTP三类\测试数据\性能自动化\单序列1' patient_name = "XN_Test001" get_token() token = os.environ.get("token1") result = [] circle = 1 while circle < 2: """1 调用影像上传""" upload_time = testupload().upload(base_url=base_url, study_path=study_paths, token=token) print(f"影像上传耗时:{upload_time}") """2 调用影像校正""" realign_time = TestRealign().send_realign(base_url=base_url, patient_name=patient_name, token=token) print(f"影像校正耗时:{realign_time}") """3 统计自动选取动脉点及自动分析耗时""" auto_analy_time = auto_ctpanaly(base_url, patient_name, token) print(f"time is:{auto_analy_time}") print(f"自动选取动脉点耗时:{auto_analy_time[0]}, 自动分析耗时:{auto_analy_time[1]}") """4 调用手动分析耗时:动脉曲线及分析结果""" manual_analy_time = manual_ctpanaly(base_url, patient_name, token) print(f"time is:{manual_analy_time}") print(f"手动选取动脉点耗时:{manual_analy_time[0]}, 手动分析耗时:{manual_analy_time[1]}") """5 删除当前影像数据""" Test_Del_Study(base_url, patient_name, token) """6 测试结果写入Excel""" result.append([upload_time, realign_time, auto_analy_time, manual_analy_time]) circle += 1 for idx in result: print(idx)
get_token.py:
import os import requests import urllib3 from common.encryOPS import EncryOPS from common.getBaseInfo import GetBaseInfo from common.pathSetting import PathSetting def get_token(): config_path = PathSetting().path_setting("test_config_path") url = GetBaseInfo().get_value_bySection(config_path + "\\baseEnv.ini", "testenv")["baseurl"] + "/user/login" username = GetBaseInfo().get_value_byoption(config_path + "\\baseEnv.ini", "userinfo", "username") pwd = GetBaseInfo().get_value_byoption(config_path + "\\baseEnv.ini", "userinfo", "pwd") pwd = EncryOPS().encry_sha1(pwd.encode("utf-8")) data = { "username": username, "password": pwd } try: urllib3.disable_warnings() res = requests.post(url=url, params=data, verify=False) token = res.json()["data"]["token"] os.environ["token1"] = str(token) except Exception as e: print(f"获取token失败:用户名{username},密码{pwd}")
upload.py:
import os from datetime import datetime import requests import urllib3 from 性能自动化.get_token import get_token class testupload: # upload @staticmethod def upload(base_url, study_path, token): file_sets = set() filedirs = os.listdir(study_path) for fl in filedirs: fl_path = study_path + "\\" + fl file_sets.add(('file', (fl, open(fl_path, 'rb')))) # 封装header headers1 = { "token": token } url = base_url + "/study/upload" files = file_sets begin_time = datetime.now() print("开始上传中,请稍等...") urllib3.disable_warnings() rs = requests.post(url, files=files, headers=headers1, verify=False) print("上传已完成.") if rs: end_time = datetime.now() over_time = end_time - begin_time return over_time else: return False if __name__ == '__main__': # base_url = sys.argv[1] # study_paths = sys.argv[2] base_url1 = 'https://test.dinova.com:8081' study_paths = r'F:\CTP三类\测试数据\性能自动化\单序列1' get_token() token1 = os.environ.get("token1") testupload().upload(base_url=base_url1, study_path=study_paths, token=token1)
realign.py:
import os import time import requests from conftest import get_my_sql_info from common.dbconn import Dbconn from 性能自动化.get_token import get_token import urllib3 class TestRealign: @staticmethod def get_header(token): return {"token": token} # get study_id def get_study_id(self, base_url, patient_name, token): s_url = base_url + "/studies/page?pageSize=20¤t=1&patientName=" + patient_name urllib3.disable_warnings() s_result = requests.get(s_url, headers=self.get_header(token), verify=False) return s_result.json()["data"]["resultList"][0]["id"] # 发起校正 def send_realign(self, base_url, patient_name, token): study_id = self.get_study_id(base_url, patient_name, token) url = base_url + "/study/" + str(study_id) + "/ctp" print("开始校正中,请稍等...") urllib3.disable_warnings() requests.put(url, json={}, headers=self.get_header(token), verify=False) """ 通过查询DB获取校正开始和结束时间: t_series_flow.status = 3(分析中) """ time.sleep(30) query_sql = f'select t_series_flow.update_dt ,t_series_flow.create_dt from t_series_flow where EXISTS (' \ f'select * from t_study where t_study.id = t_series_flow.study and EXISTS ( select * from ' \ f't_patient where t_patient.id = t_study.patient and t_patient.patient_name = "{patient_name}")) ' \ f'and t_series_flow.series_status = 3 order by t_series_flow.update_dt desc ' i = 1 while i < 15: # 超三分钟没结果就返回False db = Dbconn(dbinfo=get_my_sql_info()) realign_dates = db.select(query_sql) if realign_dates: res = realign_dates['update_dt'] - realign_dates['create_dt'] print("校正已完成.") return res else: time.sleep(10) i += 1 db.close() print("超过3分钟还未校正完成.") return False if __name__ == '__main__': base_url1 = 'https://test.dinova.com:8081' patient_name1 = "XN_Test001" get_token() token1 = os.environ.get("token1") # base_url = sys.argv[1] # patient_name = sys.argv[2] rs = TestRealign().send_realign(base_url1, patient_name1, token=token1) print(rs)
ctp.py:
import os import time from datetime import datetime import requests from conftest import get_my_sql_info from common.dbconn import Dbconn import urllib3 from 性能自动化.get_token import get_token # set heander def get_header(token): return {"token": token} # get study_id def get_study_id(base_url, patient_name, token): s_url = base_url + "/studies/page?pageSize=20¤t=1&patientName=" + patient_name urllib3.disable_warnings() s_result = requests.get(s_url, headers=get_header(token), verify=False) return s_result.json()["data"]["resultList"][0]["id"] # get series_id def get_seriesId(base_url, patient_name, token): try: study_id = get_study_id(base_url, patient_name, token) url = base_url + "/study/" + str(study_id) + "/series" urllib3.disable_warnings() res = requests.get(url=url, params="", headers=get_header(token), verify=False) return res.json()["data"][0]["id"] except Exception as e: print(f'获取series_id异常:{e}') # get aif曲线图 def get_aif_result(base_url, token, series_dx): try: url = base_url + "/dx/perfusion/" + str(series_dx) i = 1 time.sleep(20) while 1 < 10: urllib3.disable_warnings() res = requests.get(url=url, params="", headers=get_header(token), verify=False) if 'chartData' in res.json()['data']['aifVof']: return True else: i += 1 time.sleep(5) except Exception as e: print(e) return False # ctp 手动分析 def manual_ctpanaly(base_url, patient_name, token): study_id = get_study_id(base_url, patient_name, token) res = ["0", "0"] url = base_url + "/dx/perfusion" series_data = { "seriesId": get_seriesId(base_url, patient_name, token), "type": 1, "aifLocation": { "imageId": "dicomweb:https://test.dinova.com/data/ai_res/ctp3/1.2.840.113619.186.808617090127.20200712124670607.100/1.3.12.2.1107.5.1.4.76058.30000020071721246798730190517/ctp02_mid_line_det/base/1.3.12.2.1107.5.1.4.12468.30000020071722470798700191099.dcm", "t": 15, "x": 291.74025974025983, "y": 191.16883116883116, "z": 10} } print("开始手动分析,请稍后...") urllib3.disable_warnings() rs = requests.post(url, json=series_data, headers=get_header(token), verify=False) """手动分析需要获取seriesdx:序列诊断id,便于后续循环查询动脉曲线的接口""" series_dx = rs.json()['data']['seriesDx'] query_aif_sql = f'select tp.update_dt,tp.aif_vof_dt from t_perfusion tp where series_dx = {series_dx}' query_analy_sql = f'select tp.update_dt,tp.aif_vof_dt from t_perfusion tp where exists(select * from (select * from ' \ f't_series_dx tsd where tsd.study = {study_id} and tsd.submit_type = 1) dx where dx.id = tp.series_dx) and result is not null ' """ 手动选取动脉点时间 """ if get_aif_result(base_url, token, series_dx): db = Dbconn(get_my_sql_info()) rs = db.select(query_aif_sql) if rs: analy_time_update = rs['update_dt'] try: analy_time_aifdate_tmp = rs['aif_vof_dt'].split(".")[:-1][0] except: analy_time_aifdate_tmp = rs['aif_vof_dt'] analy_time_aifdate = datetime.strptime(analy_time_aifdate_tmp, "%Y-%m-%d %H:%M:%S") res[0] = str(analy_time_update - analy_time_aifdate) """手动分析时间""" i = 1 time.sleep(20) while i < 20: db = Dbconn(dbinfo=get_my_sql_info()) rs = db.select(query_analy_sql) if rs: analy_time_update = rs['update_dt'] try: analy_time_aifdate_tmp = rs['aif_vof_dt'].split(".")[:-1][0] except: analy_time_aifdate_tmp = rs['aif_vof_dt'] analy_time_aifdate = datetime.strptime(analy_time_aifdate_tmp, "%Y-%m-%d %H:%M:%S") res[1] = str(analy_time_update - analy_time_aifdate) break else: i += 1 time.sleep(5) db.close() return res def auto_ctpanaly(base_url, patient_name, token): """ 因为自动分析在点击+CT灌注分析就会自动触发,所以这里直接根据sql去查询DB结果即可 如果要添加手动发起的自动分析,后续再加一个逻辑:如果当前存在一条自动分析中的则不新增,不存在则发起 """ study_id = get_study_id(base_url, patient_name, token) query_aif_sql = f'select tp.update_dt,tp.aif_vof_dt from t_perfusion tp where exists(select * from (select * from ' \ f't_series_dx tsd where tsd.study = {study_id} and tsd.submit_type = 0) dx where dx.id = tp.series_dx) and aif_vof != " " and result is null ' query_analy_sql = f'select tp.update_dt,tp.aif_vof_dt from t_perfusion tp where exists(select * from (select * from ' \ f't_series_dx tsd where tsd.study = {study_id} and tsd.submit_type = 0) dx where dx.id = tp.series_dx) and result is not null ' res = ["0", "0"] """自动选取动脉点时间""" time.sleep(20) i = 1 while i < 20: db = Dbconn(dbinfo=get_my_sql_info()) rs = db.select(query_aif_sql) if rs: aif_time_update = rs['update_dt'] try: analy_time_aifdate_tmp = rs['aif_vof_dt'].split(".")[:-1][0] except : analy_time_aifdate_tmp = rs['aif_vof_dt'] analy_time_aifdate = datetime.strptime(analy_time_aifdate_tmp, "%Y-%m-%d %H:%M:%S") res[0] = str(aif_time_update - analy_time_aifdate) break else: i += 1 time.sleep(5) db.close() """自动分析时间""" i = 1 time.sleep(20) while i < 20: db = Dbconn(dbinfo=get_my_sql_info()) res = db.select(query_analy_sql) if res: analy_time_update = res['update_dt'] try: analy_time_aifdate_tmp = res['aif_vof_dt'].split(".")[:-1][0] except: analy_time_aifdate_tmp = res['aif_vof_dt'] analy_time_aifdate = datetime.strptime(analy_time_aifdate_tmp, "%Y-%m-%d %H:%M:%S") res[1] = str(analy_time_update - analy_time_aifdate) break else: i += 1 time.sleep(5) db.close() return res if __name__ == '__main__': base_url1 = "https://test.dinova.com:8081" patient_name1 = "XN_Test001" get_token() token1 = os.environ.get("token1") # base_url1 = sys.argv[1] # patient_name1 = sys.argv[2] # get_token(base_url) rs = auto_ctpanaly(base_url=base_url1, patient_name=patient_name1, token=token1) print(rs)
deldatas.py:
import requests # set header def get_header(token): return {"token": token} # get study_id def get_study_id(base_url, patient_name, token): s_url = base_url + "/studies/page?pageSize=20¤t=1&patientName=" + patient_name requests.packages.urllib3.disable_warnings() s_result = requests.get(s_url, headers=get_header(token), verify=False) return s_result.json()["data"]["resultList"][0]["id"] def Test_Del_Study(base_url, patient_name, token): study_id = get_study_id(base_url, patient_name, token) url = base_url + "/study/" + str(study_id) print("开始删除中,请稍等...") requests.packages.urllib3.disable_warnings() requests.delete(url, json={}, headers=get_header(token), verify=False) print("影像已删除") if __name__ == '__main__': base_url = "https://test.dinova.com:8081" patient_name = "pacs0001" # base_url1 = sys.argv[1] # patient_name1 = sys.argv[2] # get_token(base_url)