python 性能测试自动化

代码结构:

-- 全流程性能测试.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&current=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&current=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&current=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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值