excel管理接口测试用例

news2024/11/23 16:57:04

闲话休扯,上需求:自动读取、执行excel里面的接口测试用例,测试完成后,返回错误结果并发送邮件通知。

分析:

1、设计excel表格
2、读取excel表格
3、拼接url,发送请求
4、汇总错误结果、发送邮件

开始实现:

1、设计excel接口用例表格,大概长这样:  

依次为:用例编号、接口名称、接口主host、接口路由、请求方式、请求参数类型、请求参数、断言

这次案例中用到的接口,其实就是如何优雅的进行接口测试使用的快递查询接口,一时半会儿没找到好用的,之前写的也找不到了,只好作罢。

2、读取excel表格,获取每个用例的数据

import xlrd
import sys

def test_cases_in_excel(test_case_file):
    test_case_file = os.path.join(os.getcwd(), test_case_file)
    # 获取测试用例全路径 如:E:\Python\httprunner\interface_excel\testcases.xlsx
    print(test_case_file)
    if not os.path.exists(test_case_file):
        print("测试用例excel文件存在或路径有误!")
        # 找不到指定测试文件,就退出程序 os.system("exit")是用来退出cmd的
        sys.exit()
    # 读取excel文件
    test_case = xlrd.open_workbook(test_case_file)
    # 获取第一个sheet,下标从0开始
    table = test_case.sheet_by_index(0)
    # 记录错误用例
    error_cases = []
    # 一张表格读取下来,其实就像个二维数组,无非是读取第一行的第几列的值,由于下标是从0开始,第一行是标题,所以从第二行开始读取数据
    for i in range(1, table.nrows):
        num = str(int(table.cell(i, 0).value)).replace("\n", "").replace("\r", "")
        api_name = table.cell(i, 1).value.replace("\n", "").replace("\r", "")
        api_host = table.cell(i, 2).value.replace("\n", "").replace("\r", "")
        request_url = table.cell(i, 3).value.replace("\n", "").replace("\r", "")
        method = table.cell(i, 4).value.replace("\n", "").replace("\r", "")
        request_data_type = table.cell(i, 5).value.replace("\n", "").replace("\r", "")
        request_data = table.cell(i, 6).value.replace("\n", "").replace("\r", "")
        check_point = table.cell(i, 7).value.replace("\n", "").replace("\r", "")
        print(num, api_name, api_host, request_url, method, request_data_type, request_data, check_point)
        try:
            # 调用接口请求方法,后面会讲到
            status, resp = interface_test(num, api_name, api_host, request_url, method, 
                                            request_data_type, request_data, check_point)
            if status != 200 or check_point not in resp:
                # append只接收一个参数,所以要讲四个参数括在一起,当一个参数来传递
                # 请求失败,则向error_cases中增加一条记录
                error_cases.append((num + " " + api_name, str(status), api_host + request_url))
        except Exception as e:
            print(e)
            print("第{}个接口请求失败,请检查接口是否异常。".format(num))
            # 访问异常,也向error_cases中增加一条记录
            error_cases.append((num + " " + api_name, "请求失败", api_host + request_url))
    return error_cases

3、拼接url,判断请求方式(get/post),发送请求传入读取用例的各种参数,先判断请求方式,再拼接参数通过requests库来发送请求


import requests

def interface_test(num, api_name, api_host, request_url, method, 
                    request_data_type, request_data, check_point):
    # 构造请求headers
    headers = {'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8',
                      'X-Requested-With' : 'XMLHttpRequest',
                      'Connection' : 'keep-alive',
                      'Referer' : 'http://' + api_host,
                      'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36'
                }
    # 判断请求方式,如果是GET,则调用get请求,POST调post请求,都不是,则抛出异常
    if method == "GET":
        r = requests.get(url=api_host+request_url, params=json.loads(request_data), headers=headers)
        # 获取请求状态码
        status = r.status_code
        # 获取返回值
        resp = r.text
        if status == 200:
            # 断言,判断设置的断言值,是否在返回值里面
            if check_point in str(r.text):
                print("第{}条用例'{}'执行成功,状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))
                return status, resp
            else:
                print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))
                return status, resp
        else:
            print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))
            return status, resp
    elif method == "POST":
        # 跟GET里面差不多,就不一一注释了
        r = requests.post(url=api_host+request_url, params=json.loads(request_data), headers=headers)
        status = r.status_code
        resp = r.text
        if status == 200:
            if check_point in str(r.text):
                print("第{}条用例'{}'执行成功,状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))
                return status, resp
            else:
                print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))
                return status, resp
        else:
            print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))
            return status, resp
    else:
        print("第{}条用例'{}'请求方式有误!!!请确认字段【Method】值是否正确,正确值为大写的GET或POST。".format(num, api_name))
        return 400, "请求方式有误"

4、汇总错误结果、发送邮件4.1、汇总错误结果,保存为简易html报告,并通过邮件发送到指定接收人


def main():
    # 执行所以测试用例,获取错误的用例
    error_cases = test_cases_in_excel("testcases.xlsx")
    # 如果有错误接口,则开始构造html报告
    if len(error_cases) > 0:
        html = '<html><body>接口自动化扫描,共有 ' + str(len(error_cases)) + ' 个异常接口,列表如下:' + '</p><table><tr><th style="width:100px;text-align:left">接口</th><th style="width:50px;text-align:left">状态</th><th style="width:200px;text-align:left">接口地址</th></tr>'
        for test in error_cases:
            html = html + '<tr><td style="text-align:left">' + test[0] + '</td><td style="text-align:left">' + test[1] + '</td><td style="text-align:left">' + test[2] + '</td></tr>'
        send_email(html)
        print(html)
        with open ("report.html", "w") as f:
            f.write(html)
    else:
        print("本次测试,所有用例全部通过")
        send_email("本次测试,所有用例全部通过")

4.2、构造邮件函数

先读取配置文件,新建config.yml配置文件,内容如下:

sender为发送邮件的邮箱,receiver为接收者着的邮箱,支持多个,smtpserver邮箱服务,username发送者邮箱少去后缀,password密码 

import yaml

def get_conf():
    with open ("config.yml", "r", encoding='utf-8') as f:
        cfg = f.read()
        dic = yaml.load(cfg)
        sender = dic['email']['sender']
        receiver = dic['email']['receiver']
        smtpserver = dic['email']['smtpserver']
        username = dic['email']['username']
        password = dic['email']['password']
        print(sender, receiver, smtpserver, username, password)
        return sender, receiver, smtpserver, username, password

然后构造发送邮件的函数

import smtplib
import time
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.header import Header

def send_email(text):
    today = time.strftime('%Y.%m.%d',time.localtime(time.time()))
    sender, receiver, smtpserver, username, password = get_conf()
    # subject为邮件主题 text为邮件正文
    subject = "[api_test]接口自动化测试结果通知 {}".format(today)
    msg = MIMEText(text, 'html', 'utf-8')
    msg['Subject'] = subject
    msg['From'] = sender
    msg['To'] = "".join(receiver)
    smtp = smtplib.SMTP()
    smtp.connect(smtpserver)
    smtp.login(username, password)
    smtp.sendmail(sender, receiver, msg.as_string())
    smtp.quit()

以上内容就将需求实现了,由于现在很晚了(懒),上面所以函数就对在一个py文件里面了,来运行下吧 

 

邮件一会儿就收到了

所有代码如下:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

'''
需求:自动读取、执行excel里面的接口测试用例,测试完成后,返回错误结果并发送邮件通知。
一步一步捋清需求:
1、设计excel表格
2、读取excel表格
3、拼接url,发送请求
4、汇总错误结果、发送邮件
'''
import xlrd
import os
import requests
import json
import yaml
import smtplib
import time
import sys
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.header import Header


def test_cases_in_excel(test_case_file):
    test_case_file = os.path.join(os.getcwd(), test_case_file)
    # 获取测试用例全路径 如:E:\Python\httprunner\interface_excel\testcases.xlsx
    print(test_case_file)
    if not os.path.exists(test_case_file):
        print("测试用例excel文件存在或路径有误!")
        # 找不到指定测试文件,就退出程序 os.system("exit")是用来退出cmd的
        sys.exit()
    # 读取excel文件
    test_case = xlrd.open_workbook(test_case_file)
    # 获取第一个sheet,下标从0开始
    table = test_case.sheet_by_index(0)
    # 记录错误用例
    error_cases = []
    # 一张表格读取下来,其实就像个二维数组,无非是读取第一行的第几列的值,由于下标是从0开始,第一行是标题,所以从第二行开始读取数据
    for i in range(1, table.nrows):
        num = str(int(table.cell(i, 0).value)).replace("\n", "").replace("\r", "")
        api_name = table.cell(i, 1).value.replace("\n", "").replace("\r", "")
        api_host = table.cell(i, 2).value.replace("\n", "").replace("\r", "")
        request_url = table.cell(i, 3).value.replace("\n", "").replace("\r", "")
        method = table.cell(i, 4).value.replace("\n", "").replace("\r", "")
        request_data_type = table.cell(i, 5).value.replace("\n", "").replace("\r", "")
        request_data = table.cell(i, 6).value.replace("\n", "").replace("\r", "")
        check_point = table.cell(i, 7).value.replace("\n", "").replace("\r", "")
        print(num, api_name, api_host, request_url, method, request_data_type, request_data, check_point)
        try:
            # 调用接口请求方法,后面会讲到
            status, resp = interface_test(num, api_name, api_host, request_url, method, 
                                            request_data_type, request_data, check_point)
            if status != 200 or check_point not in resp:
                # append只接收一个参数,所以要讲四个参数括在一起,当一个参数来传递
                # 请求失败,则向error_cases中增加一条记录
                error_cases.append((num + " " + api_name, str(status), api_host + request_url))
        except Exception as e:
            print(e)
            print("第{}个接口请求失败,请检查接口是否异常。".format(num))
            # 访问异常,也向error_cases中增加一条记录
            error_cases.append((num + " " + api_name, "请求失败", api_host + request_url))
    return error_cases


def interface_test(num, api_name, api_host, request_url, method, 
                    request_data_type, request_data, check_point):
    # 构造请求headers
    headers = {'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8',
                      'X-Requested-With' : 'XMLHttpRequest',
                      'Connection' : 'keep-alive',
                      'Referer' : 'http://' + api_host,
                      'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36'
                }
    # 判断请求方式,如果是GET,则调用get请求,POST调post请求,都不是,则抛出异常
    if method == "GET":
        r = requests.get(url=api_host+request_url, params=json.loads(request_data), headers=headers)
        # 获取请求状态码
        status = r.status_code
        # 获取返回值
        resp = r.text
        if status == 200:
            # 断言,判断设置的断言值,是否在返回值里面
            if check_point in str(r.text):
                print("第{}条用例'{}'执行成功,状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))
                return status, resp
            else:
                print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))
                return status, resp
        else:
            print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))
            return status, resp
    elif method == "POST":
        # 跟GET里面差不多,就不一一注释了
        r = requests.post(url=api_host+request_url, params=json.loads(request_data), headers=headers)
        status = r.status_code
        resp = r.text
        if status == 200:
            if check_point in str(r.text):
                print("第{}条用例'{}'执行成功,状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))
                return status, resp
            else:
                print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))
                return status, resp
        else:
            print("第{}条用例'{}'执行失败!!!状态码为{},结果返回值为{}.".format(num, api_name, status, r.text))
            return status, resp
    else:
        print("第{}条用例'{}'请求方式有误!!!请确认字段【Method】值是否正确,正确值为大写的GET或POST。".format(num, api_name))
        return 400, "请求方式有误"


def main():
    # 执行所以测试用例,获取错误的用例
    error_cases = test_cases_in_excel("testcases.xlsx")
    # 如果有错误接口,则开始构造html报告
    if len(error_cases) > 0:
        # html = '<html><body>接口自动化扫描,共有 ' + str(len(error_cases)) + ' 个异常接口,列表如下:' + '</p><table><tr><th style="width:100px;text-align:left">接口</th><th style="width:50px;text-align:left">状态</th><th style="width:200px;text-align:left">接口地址</th><th   style="text-align:left">接口返回值</th></tr>'
        html = '<html><body>接口自动化扫描,共有 ' + str(len(error_cases)) + ' 个异常接口,列表如下:' + '</p><table><tr><th style="width:100px;text-align:left">接口</th><th style="width:50px;text-align:left">状态</th><th style="width:200px;text-align:left">接口地址</th></tr>'
        for test in error_cases:
            # html = html + '<tr><td style="text-align:left">' + test[0] + '</td><td style="text-align:left">' + test[1] + '</td><td style="text-align:left">' + test[2] + '</td><td style="text-align:left">' + test[3] + '</td></tr>'
            html = html + '<tr><td style="text-align:left">' + test[0] + '</td><td style="text-align:left">' + test[1] + '</td><td style="text-align:left">' + test[2] + '</td></tr>'
        send_email(html)
        print(html)
        with open ("report.html", "w") as f:
            f.write(html)
    else:
        print("本次测试,所有用例全部通过")
        send_email("本次测试,所有用例全部通过")


def get_conf():
    with open ("config.yml", "r", encoding='utf-8') as f:
        cfg = f.read()
        dic = yaml.load(cfg)
        # print(type(dic))
        # print(dic)
        sender = dic['email']['sender']
        receiver = dic['email']['receiver']
        smtpserver = dic['email']['smtpserver']
        username = dic['email']['username']
        password = dic['email']['password']
        print(sender, receiver, smtpserver, username, password)
        return sender, receiver, smtpserver, username, password


def send_email(text):
    today = time.strftime('%Y.%m.%d',time.localtime(time.time()))
    sender, receiver, smtpserver, username, password = get_conf()
    # subject为邮件主题 text为邮件正文
    subject = "[api_test]接口自动化测试结果通知 {}".format(today)
    msg = MIMEText(text, 'html', 'utf-8')
    msg['Subject'] = subject
    msg['From'] = sender
    msg['To'] = "".join(receiver)
    smtp = smtplib.SMTP()
    smtp.connect(smtpserver)
    smtp.login(username, password)
    smtp.sendmail(sender, receiver, msg.as_string())
    smtp.quit()


if __name__ == "__main__":
    # send_email("test")
    main()

 View Code

思考:

需要改进的地方有很多:

1、增加日志:导入logging模块,代码里面的print一通copy即可,自己尝试哈

2、回写excel表格:xlrd既然可以读取excel文档,肯定可以写入的。可以新增一列,每次执行完用例,将结果写进去,自己去尝试哈

3、request data type没有做判断,这里偷懒了,因为只用了一个接口,而且大晚上在赶工,就没有做判断。可以参照判断请求方式(get/post)来写。

4、报告渣:1、可以尝试使用htmlreport库;2、也可以自己尝试使用一些前端框架生成,如bootstrap

5、未做持续集成:什么是持续集成?听起来高大上,说白了就是找个数据库或者其他玩意儿,将用例、执行结果等等,都存储起来。python有很多库,可以连接各种数据库(mysql、mongoDB),读取excel或者其他接口脚本文档,存入数据库;然后请求接口后,再从库里面读取出来。balabala......

6、无界面:没有界面,其实要不要都无所谓,毕竟只要维护一份excel表格即可。如果一定要的话,可以考虑使用django或者flask框架,构造web页面,将用例的导入导出、新增、编辑、发送请求,生成报告等等一系列操作,全部移交到前端。这就需要懂一点前端代码,如果有兴趣,你也可以尝试。

Python接口自动化测试零基础入门到精通(2023最新版)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1098232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字节跳动2023测试开发岗 3+1 面经+经验分享(收到offer,入职月薪27K)

现在&#xff0c;招聘黄金时间已经来临&#xff0c;在网上看了很多大佬的面经&#xff0c;也加了很多交流群&#xff0c;受到了很多朋友的提点&#xff0c;今天终于轮到我来分享面经啦&#xff0c;之前面试了几家公司&#xff0c;最后在十月初拿到了字节跳动测试岗的 offer&…

竞赛选题 深度学习YOLO图像视频足球和人体检测 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov5算法5 数据集6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习YOLO图像视频足球和人体检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非…

ArcGIS在VUE框架中的构建思想

项目快要上线了&#xff0c;出乎意料的有些空闲时间。想着就把其他公司开发的一期代码里面&#xff0c;把关于地图方面的代码给优化一下。试运行的时候&#xff0c;客户说控制台有很多飘红的报错&#xff0c;他们很在意&#xff0c;虽然很不情愿&#xff0c;但能改的就给改了吧…

git 创建并配置 GitHub 连接密钥

前记&#xff1a; git svn sourcetree gitee github gitlab gitblit gitbucket gitolite gogs 版本控制 | 仓库管理 ---- 系列工程笔记. Platform&#xff1a;Windows 10 Git version&#xff1a;git version 2.32.0.windows.1 Function&#xff1a; git 创建并配置 GitHub…

照片全屏水印轻松去除,让你的照片焕然一新

当需要处理带有全屏水印的照片时&#xff0c;想要去除照片全屏水印往往是一个让人感到棘手的问题&#xff0c;然而幸运的是现在有一些非常出色的一键去水印工具可供选择。这些工具操作简单易用&#xff0c;处理速度快&#xff0c;去除水印的效果也非常令人满意&#xff0c;基本…

如何进行开关电源能效(效率)测试?纳米软件电源测试系统如何助力?

开关电源在实际工作中输入与输出转换是有一定的能量损耗的&#xff0c;并不会完全无损耗转换&#xff0c;电源效率就是用来衡量能量转换损耗的一个重要指标。那么开关电源效率要如何测试呢? 电源效率是指输出功率与输入功率之比&#xff0c;计算公式如下&#xff1a; ​​​​…

阿里云服务器ECS实例规格族字母命名说明

阿里云服务器ECS实例命名规则&#xff1a;ecs.<规格族>.large字母含义命名说明&#xff0c;包括x86、ARM架构、GPU异构计算、弹性裸金属、超级计算集群SCC云服务器&#xff0c;c代表计算型、g代表通用型、r代表内存型、u代表通用算力型、e代表经济型e实例&#xff0c;阿里…

一键搞定!黑群晖虚拟机+内网穿透实现校园公网访问攻略!

文章目录 前言本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是前排提醒&#xff1a; 1. 搭建群晖虚拟机1.1 下载黑群晖文件vmvare虚拟机安装包1.2 安装VMware虚拟机&#xff1a;1.3 解压黑群晖虚拟机文件1.4 虚拟机初始化1.5 没有搜索到黑群晖的解…

成集云 | 人货客数据分析系统集成ERP | 解决方案

方案介绍 用友T是一款由用友畅捷通推出的新型互联网企业管理系统&#xff0c;它主要满足成长型小微企业对其灵活业务流程的管控需求&#xff0c;并重点解决往来业务管理、订单跟踪、资金、库存等管理难题。 成销云-人货客数据分析系统是一种针对零售、电商等行业的客户数据分…

使用EMD分解进行去噪

EMD分解去噪 对于掺杂噪声的原始信号&#xff0c;可以使用EMD分解&#xff0c;去除高频的IMF达到去噪效果。 验证代码 测试的IMF由c代码产生&#xff0c;具体链接可见C仿写emd分解代码 %% clear all; clc;%% raw load(result_VS\test.txt); imfs load(result_VS\imfs.txt…

2023年【制冷与空调设备运行操作】考试资料及制冷与空调设备运行操作考试试卷

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年制冷与空调设备运行操作考试资料为正在备考制冷与空调设备运行操作操作证的学员准备的理论考试专题&#xff0c;每个月更新的制冷与空调设备运行操作考试试卷祝您顺利通过制冷与空调设备运行操作考试。 1、【单…

外汇天眼:群雄聚首,盈在世界!外汇模拟周赛火热进行中

你是否是新手幻想过在交易场上游刃有余&#xff1f;是否是资深玩家想在汇市一展身手&#xff1f;是否想成为像巴菲特那样叱咤风云的交易大神&#xff1f;现在机会来了&#xff01; 只要下载外汇天眼APP&#xff0c;参与外汇模拟比赛&#xff0c;就能与高手对决&#xff01;来一…

使用Apache和内网穿透实现私有服务公网远程访问——“cpolar内网穿透”

文章目录 前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpolar web ui管理界面3.2 创建公网地址 4. 固定公网地址 前言 Apache作为全球使用较高的Web服务器…

Android串口开发之使用JNI实现ANDROID和串口通信

导语&#xff1a;Android串口通信在物联网、智能家居等领域具有广泛的应用。本文将详细介绍如何使用JNI技术实现Android设备与串口的通信&#xff0c;包括串口的打开、设置参数和读写数据等过程。 目录 一、背景知识二、环境准备三、创建Android串口项目四、串口通信相关代码实…

Android7.1 新增开机广播过滤(只有特定apk可以接收开机广播)

一、需求 对开机广播进行过滤&#xff0c;只有特定的apk才能接收开机广播&#xff08;包名白名单、或者包名前缀匹配&#xff09;。 二、需要修改的地方 对于广播的过滤&#xff0c;在frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java这个文件…

RCNN系列网络的理解

R-CNN 作者 &#xff1a; Ross Girshick FAST R-CNN 作者 &#xff1a; Ross Girshick FASTER R-CNN 作者 &#xff1a; Jian Sun MASK R-CNN 作者 &#xff1a;kaiming he 一…

第四章 输入输出 Pro

四、输入输出 1、字符输入输出函数 一、字符输出函数 一般形式 putchar() 二、字符输入函数 一般形式 cgetchar() 无参数 三、说明&#xff1a; (1)getchar&#xff08;)只能接受一个字符&#xff0c;以回车结束&#xff1b; (2)连续输入多个字符时&#xff0c;中间不用空格…

超微收购Nod.ai 提升开源AI软件实力 | 百能云芯

超微半导体AMD日前宣布签署最终协议以收购Nod.ai&#xff0c;拓展其在开源AI软件的实力。收购Nod.ai将带来经验丰富的团队&#xff0c;该团队开发领先业界的软件技术&#xff0c;能够加快为AMD Instinct资料中心加速器、Ryzen AI处理器、EPYC处理器、Versal系统单晶片&#xff…

2023年中国半导体检测设备发展概况分析:国产替代化进程预计将持续推进[图]

半导体检测设备是用于检测半导体器件的物理参数及性能的设备&#xff0c;可对制造过程中的半成品和成品芯片进行质量控制和性能测试。它们通常使用各种测试技术和方法&#xff0c;例如电学测试、光学测试、热学测试等&#xff0c;以评估器件的关键参数和功能。 半导体检测设备…

公司销售个人号如何管理?

微信管理系统可以帮助企业解决哪些问题呢&#xff1f; 一、解决聊天记录监管问题 1.聊天记录的保存&#xff0c;让公司的管理者可以随时查看公司任意销售与客户的聊天记录&#xff0c;不用一个一个员工逐一去看&#xff0c;方便管理&#xff1b; 2.敏感词监控&#xff0c;管理者…