excel+requests管理测试用例接口自动化框架

背景:

某项目有多个接口,之前使用的unittest框架来管理测试用例,将每个接口的用例封装成一个py文件,接口有数据或者字段变动后,需要去每个py文件中找出变动的接口测试用例,维护起来不方便,为了便于接口变动后维护,使用excel来管理测试用例,接口有变动不需要修改代码,只需要维护excel即可。

思路:

为了方便维护测试用例,一个接口的测试用例使用一个excel文件来管理,每个excel文件中有两个sheet页,第一个sheet页是接口的基本信息,包括接口名称,地址和请求方式,第二个sheet页为接口的测试用例,如下图所示

第一个sheet页

第二个sheet页

 接口请求的数据类型为X-WWW-FORM-URLENCODED,在测试用例中每个字段为一列,每条用例为一行,倒数第二列为预期结果,倒数第三列为该条用例的描述。

接口自动化框架结构:

common目录存放公共的方法,例如写日志,连数据库

config目录存放配置文件和读取配置文件内容的方法,cfg.ini包括发送邮件的配置信息和接口的ip和端口

data目录存放接口的测试用例

logs目录存放用例执行的日志

report目录存放测试报告

run_main.py为用例执行的入口

源码:api_test.py封装读取测试用例的数据,执行测试用例和校验测试结果

 
#coding:utf-8
 
import xlrd,os
import requests
from datetime import datetime
from xlrd import xldate_as_tuple
from config import readConfig
from common.logger import Log
 
'''
获取测试用例data所在的目录
'''
d = os.path.dirname(__file__) #返回当前文件所在目录(common文件夹路径)
parent_path = os.path.dirname(d) #返回common的父级目录
data_path = os.path.join(parent_path,'data') #返回data所在目录
data_path1 = os.listdir(data_path) #返回data目录下所有的文件
 
log = Log()
 
def api_data():
    for filename in data_path1:
        book = xlrd.open_workbook(os.path.join(data_path,filename))
 
        '''
        获取excel文件中接口信息
        '''
        table = book.sheet_by_index(0) #通过索引,获取相应的列表,这里表示获取excel的第一个列表
        inf_name = table.row_values(1)[0] #返回接口名称
        inf_address = table.row_values(1)[1] #返回接口地址
        inf_mode = table.row_values(1)[2] #返回请求方式
 
        '''
        获取excel文件中测试用例信息
        '''
        sheet = book.sheet_by_index(1) #通过索引,获取相应的列表,这里表示获取excel的第二个列表
        nrows = sheet.nrows #获取所有行数
        filed = sheet.row_values(0)
        # print(filed)
 
        for i in range(1,nrows):
            d1 = {}
            for j in range(0,len(filed)-2):
                ctype = sheet.cell(i, j).ctype  # 表格的数据类型
                cell = sheet.cell_value(i, j)
                d = {}
                if ctype == 2 and cell % 1 == 0:  # 如果是整形
                    cell = int(cell)
                elif ctype == 3:
                    # 转成datetime对象
                    date = datetime(*xldate_as_tuple(cell, 0))
                    cell = date.strftime('%Y/%m/%d')
                elif ctype == 4:
                    cell = True if cell == 1 else False
                # print(cell)
                d.update({filed[j]:cell})
                # print(d)
                d1.update(d)
            # print(d1)
 
            '''
            获取excel文件中测试用例预期结果和描述
            '''
            a = []
            for k in range(len(filed)-2,len(filed)):
                ctype = sheet.cell(i, k).ctype  # 表格的数据类型
                cell = sheet.cell_value(i, k)
                if ctype == 2 and cell % 1 == 0:  # 如果是整形
                    cell = int(cell)
                elif ctype == 3:
                    # 转成datetime对象
                    date = datetime(*xldate_as_tuple(cell, 0))
                    cell = date.strftime('%Y/%m/%d')
                elif ctype == 4:
                    cell = True if cell == 1 else False
                a.append(cell)
            # print(a[0])
            # print(type(a[0]))
 
            '''
            获取cfg.ini配置文件中接口公共信息(ip和port)
            '''
            ip = readConfig.ip  # 获取配置文件中接口ip
            i_port = readConfig.i_port  # 获取配置文件中接口port
            url = "http://" + ip + ":" + i_port + inf_address
            headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
                "X-Requested-With": "XMLHttpRequest",
                "Connection": "keep-alive"
            }
            par = d1
 
            '''
            判断请求方式是GET还是POST,并且判断测试用例预期结果与实际响应一致
            '''
            if inf_mode == 'GET':
                r = requests.get(url, params=par)
                result = r.json()
                # log.info("---编号%s,接口名称%s---")%(i,inf_name)
                print(inf_name, str(result).replace('None','null'), a[1])
                if str(result).replace('None','null') == a[0]:
                    log.info("pass")
                    log.info("--------")
                else:
                    log.info("false")
                    log.info("--------")
            elif inf_mode == 'POST':
                r = requests.post(url, data=par, headers=headers)
                result = r.json()
                print(inf_name, str(result).replace('None', 'null'), a[1])
                if str(result).replace('None', 'null') == a[0]:
                    print('pass')
                    print('--------')
                else:
                    print('false')
                    print('--------')
 
 
api_data()

配置文件cfg.ini(主要配置邮箱和接口ip+port等常用数据信息)

 
[email]
 
smtp_server = smtp.163.com
port = 465
sender = xxx;psw是QQ邮箱的授权码
psw = xxx
 
;收件人多个时,中间用逗号隔开,如'a@xx.com,b@xx.com'
receiver = xxx[interface]
 
ip = xxx
;接口ip
port = xxx
;接口端口

readConfig.py读取配置文件中数据

 
# coding:utf-8
import os
import configparser
 
cur_path = os.path.dirname(os.path.realpath(__file__))
configPath = os.path.join(cur_path, "cfg.ini")
conf = configparser.ConfigParser()
conf.read(configPath,encoding='utf-8')
 
 
smtp_server = conf.get("email", "smtp_server")
 
sender = conf.get("email", "sender")
 
psw = conf.get("email", "psw")
 
receiver = conf.get("email", "receiver")
 
port = conf.get("email", "port")
 
ip = conf.get("interface","ip")
 
i_port = conf.get("interface","port")

优化:

部分接口访问时,响应未知用户,需要用session关联接口,先调用登录接口,把登录接口的调用封装成了一个实例方法,实现了复用,登录之后,登录接口的http响应会把session以 cookie的形式set到客户端,之后的接口都会使用此session去请求封装登录接口user_login.py

 
#coding:utf-8
import requests
from common.logger import Log
 
class Login():
    log = Log()
 
    def __init__(self,s):
        self.s = s
 
    def login(self,code,passwd):
        url = "http://192.168.20.100:8081/backend/system/user/login"
        headers = {"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
                   "User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36",
                   "X-Requested-With":"XMLHttpRequest",
                   "Cookie":"JSESSIONID=92D7FB4C7FB917B7D2E8DC429A63443F",
                   "Connection":"keep-alive"
                  }
        d = {"code":code,"passwd":passwd}
 
        res = self.s.post(url,headers=headers,data=d)
        result1 = res.text #字节输出
        self.log.info(u"调用登录方法,获取结果:%s"%result1)
        return res.json()

优化api_test.py中部分代码(红色部分为优化的代码)

1.在请求接口前首先调用登录接口2.加入执行用例的编号(p),每循环一次自增1

 
#coding:utf-8
 
import xlrd,os
import requests
from datetime import datetime
from xlrd import xldate_as_tuple
from config import readConfig
from common.logger import Log
from case.user_login import Login
 
'''
获取测试用例data所在的目录
'''
d = os.path.dirname(__file__) #返回当前文件所在目录(common文件夹路径)
parent_path = os.path.dirname(d) #返回common的父级目录
data_path = os.path.join(parent_path,'data') #返回data所在目录
data_path1 = os.listdir(data_path) #返回data目录下所有的文件
 
s = requests.session()
lon = Login(s)
log = Log()
 
 
def api_data():
    p = 1
    for filename in data_path1:
        book = xlrd.open_workbook(os.path.join(data_path,filename))
 
        '''
        获取excel文件中接口信息
        '''
        table = book.sheet_by_index(0) #通过索引,获取相应的列表,这里表示获取excel的第一个列表
        inf_name = table.row_values(1)[0] #返回接口名称
        inf_address = table.row_values(1)[1] #返回接口地址
        inf_mode = table.row_values(1)[2] #返回请求方式
 
        '''
        获取excel文件中测试用例信息
        '''
        sheet = book.sheet_by_index(1) #通过索引,获取相应的列表,这里表示获取excel的第二个列表
        nrows = sheet.nrows #获取所有行数
        filed = sheet.row_values(0)
        # print(filed)
 
        for i in range(1,nrows):
            d1 = {}
            for j in range(0,len(filed)-2):
                ctype = sheet.cell(i, j).ctype  # 表格的数据类型
                cell = sheet.cell_value(i, j)
                d = {}
                if ctype == 2 and cell % 1 == 0:  # 如果是整形
                    cell = int(cell)
                elif ctype == 3:
                    # 转成datetime对象
                    date = datetime(*xldate_as_tuple(cell, 0))
                    cell = date.strftime('%Y/%m/%d')
                elif ctype == 4:
                    cell = True if cell == 1 else False
                # print(cell)
                d.update({filed[j]:cell})
                # print(d)
                d1.update(d)
            # print(d1)
 
            '''
            获取excel文件中测试用例预期结果和描述
            '''
            a = []
            for k in range(len(filed)-2,len(filed)):
                ctype = sheet.cell(i, k).ctype  # 表格的数据类型
                cell = sheet.cell_value(i, k)
                if ctype == 2 and cell % 1 == 0:  # 如果是整形
                    cell = int(cell)
                elif ctype == 3:
                    # 转成datetime对象
                    date = datetime(*xldate_as_tuple(cell, 0))
                    cell = date.strftime('%Y/%m/%d')
                elif ctype == 4:
                    cell = True if cell == 1 else False
                a.append(cell)
            # print(a[0])
            # print(type(a[0]))
 
            '''
            获取cfg.ini配置文件中接口公共信息(ip和port)
            '''
            ip = readConfig.ip  # 获取配置文件中接口ip
            i_port = readConfig.i_port  # 获取配置文件中接口port
            url = "http://" + ip + ":" + i_port + inf_address
            headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
                "X-Requested-With": "XMLHttpRequest",
                "Connection": "keep-alive"
            }
            par = d1
 
            '''
            判断请求方式是GET还是POST,并且判断测试用例预期结果与实际响应一致,所有接口请求前先调用登录接口
            '''
            code = "xxx"  #登录接口用户code
            passwd = "xxx" #登录接口用户passwd
            lon.login(code, passwd)
 
            if inf_mode == 'GET':
                r = s.get(url, params=par)
                result = r.json()
                log.info("编号:%s,接口名称:%s,测试点:%s,响应:%s"%(p,inf_name,a[1],str(result).replace('None','null')))
                # print(inf_name, str(result).replace('None','null'), a[1])
                if str(result).replace('None','null') == a[0]:
                    log.info("pass")
                    log.info("--------")
                else:
                    log.info("false")
                    log.info("--------")
            elif inf_mode == 'POST':
                r = s.post(url, data=par, headers=headers)
                result = r.json()
                log.info("编号:%s,接口名称:%s,测试点:%s,响应:%s" % (p, inf_name,a[1],str(result).replace('None', 'null')))
                # print(inf_name, str(result).replace('None', 'null'), a[1])
                if str(result).replace('None', 'null') == a[0]:
                    log.info("pass")
                    log.info("--------")
                else:
                    log.info("false")
                    log.info("--------")
 
            p=p+1
 
api_data()

执行结果:

优化二:

excel中添加结果列,将每条用例的执行结果写入excel中,因为excel版本是2007以上,采用openpyxl模块去修改excel单元格的值,执行通过用绿色字体标注pass,执行不通过的用例红色字体标注false优化api_test.py中部分代码

 
#coding:utf-8
 
import xlrd,os
import requests
import openpyxl
from openpyxl.styles import Font
# from xlutils.copy import copy
from datetime import datetime
from xlrd import xldate_as_tuple
from config import readConfig
from common.logger import Log
from case.user_login import Login
 
 
'''
获取测试用例data所在的目录
'''
d = os.path.dirname(__file__) #返回当前文件所在目录(common文件夹路径)
parent_path = os.path.dirname(d) #返回common的父级目录
data_path = os.path.join(parent_path,'data') #返回data所在目录
data_path1 = os.listdir(data_path) #返回data目录下所有的文件
 
s = requests.session()
lon = Login(s)
log = Log()
 
 
def api_data():
    p = 1
 
 
    for filename in data_path1:
        book = xlrd.open_workbook(os.path.join(data_path,filename))
 
        '''
        使用xlwt操作excel,xlwt只支持excel2007以下版本
        '''
 
        # wb = copy(book)
        # ws = wb.get_sheet(1)
 
        '''
        使用openpyxl操作excel,openpyxl支持excel2007以上版本
        '''
        wb = openpyxl.load_workbook(os.path.join(data_path,filename))
        ws = wb.worksheets[1]
        font_green = Font(color="37b400")
        font_red = Font(color="ff0000")
 
 
        '''
        获取excel文件中接口信息
        '''
        table = book.sheet_by_index(0) #通过索引,获取相应的列表,这里表示获取excel的第一个列表
        inf_name = table.row_values(1)[0] #返回接口名称
        inf_address = table.row_values(1)[1] #返回接口地址
        inf_mode = table.row_values(1)[2] #返回请求方式
 
        '''
        获取excel文件中测试用例信息
        '''
        sheet = book.sheet_by_index(1) #通过索引,获取相应的列表,这里表示获取excel的第二个列表
        nrows = sheet.nrows #获取所有行数
        ncols = sheet.ncols #获取所有列数
        filed = sheet.row_values(0)
        # print(filed)
 
        for i in range(1,nrows):
            d1 = {}
            for j in range(0,len(filed)-3):
                ctype = sheet.cell(i, j).ctype  # 表格的数据类型
                cell = sheet.cell_value(i, j)
                d = {}
                if ctype == 2 and cell % 1 == 0:  # 如果是整形
                    cell = int(cell)
                elif ctype == 3:
                    # 转成datetime对象
                    date = datetime(*xldate_as_tuple(cell, 0))
                    cell = date.strftime('%Y/%m/%d')
                elif ctype == 4:
                    cell = True if cell == 1 else False
                # print(cell)
                d.update({filed[j]:cell})
                # print(d)
                d1.update(d)
            # print(d1)
 
            '''
            获取excel文件中测试用例预期结果和描述
            '''
            a = []
            for k in range(len(filed)-3,len(filed)-1):
                ctype = sheet.cell(i, k).ctype  # 表格的数据类型
                cell = sheet.cell_value(i, k)
                if ctype == 2 and cell % 1 == 0:  # 如果是整形
                    cell = int(cell)
                elif ctype == 3:
                    # 转成datetime对象
                    date = datetime(*xldate_as_tuple(cell, 0))
                    cell = date.strftime('%Y/%m/%d')
                elif ctype == 4:
                    cell = True if cell == 1 else False
                a.append(cell)
            # print(a[0])
            # print(type(a[0]))
 
            '''
            获取cfg.ini配置文件中接口公共信息(ip和port)
            '''
            ip = readConfig.ip  # 获取配置文件中接口ip
            i_port = readConfig.i_port  # 获取配置文件中接口port
            url = "http://" + ip + ":" + i_port + inf_address
            headers = {
                "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0",
                "X-Requested-With": "XMLHttpRequest",
                "Connection": "keep-alive"
            }
            par = d1
 
            '''
            判断请求方式是GET还是POST,并且判断测试用例预期结果与实际响应一致,所有接口请求前先调用登录接口
            '''
            code = "xuxingan"
            passwd = "admin"
            lon.login(code, passwd)
 
 
 
            if inf_mode == 'GET':
                r = s.get(url, params=par)
                result = r.json()
                log.info("编号:%s,接口名称:%s,测试点:%s,响应:%s"%(p,inf_name,a[1],str(result).replace('None','null')))
                # print(inf_name, str(result).replace('None','null'), a[1])
                if str(result).replace('None','null') == a[0]:
                    # ws.write(i,ncols-1,'pass'.encode('utf-8'))
                    ws.cell(row=i+1,column=ncols,value='pass').font = font_green
                    log.info("pass")
                    log.info("--------")
                else:
                    # ws.write(i,ncols-1,'false'.encode('utf-8'))
                    ws.cell(row=i+1, column=ncols, value='false').font = font_red
                    log.info("false")
                    log.info("--------")
            elif inf_mode == 'POST':
                r = s.post(url, data=par, headers=headers)
                result = r.json()
                log.info("编号:%s,接口名称:%s,测试点:%s,响应:%s" % (p, inf_name,a[1],str(result).replace('None', 'null')))
                # print(inf_name, str(result).replace('None', 'null'), a[1])
                if str(result).replace('None', 'null') == a[0]:
                    # ws.write(i,ncols-1,'pass'.encode('utf-8'))
                    ws.cell(row=i+1, column=ncols, value='pass').font = font_green
                    log.info("pass")
                    log.info("--------")
                else:
                    # ws.write(i,ncols-1,'false'.encode('utf-8'))
                    ws.cell(row=i+1, column=ncols, value='false').font = font_red
                    log.info("false")
                    log.info("--------")
            wb.save(os.path.join(data_path, filename))
            p=p+1
 
 
    log.info("总计%s条用例"%p)
 
api_data()

执行结果

总结:

第一个版本有点粗糙,1.后续加入将每条用例的执行结果写入测试用例excel文件 2.生成自动化测试报告

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

B026-MySQL基础

目录 数据库概述数据库概念数据库的由来和发展常见的关系型数据库服务器(DBMS)SQL概述表的概念 数据库的安装与配置安装启动和连接MySQL启动MySQL服务连接MySQL MySQL图形化管理软件-Navicat数据库安装失败解决方案 MySQL数据库操作数据库操作和存储引擎…

实验五 C语言函数程序设计习题 (使用函数计算两点间的距离,请编写函数fun,使用函数输出字符矩阵,使用函数求最大公约数和最小公倍数)

1. 使用函数计算两点间的距离&#xff1a;给定平面任意两点坐标(x1,y1)和(x2,y2)&#xff0c;求这两点之间的距离(保留2位)小数。要求定义和调用dist(x1,y1,x2,y2)计算两点间的距离。坐标中两点坐标之间的距离公式如下&#xff1a; #include <stdio.h> #include <math…

再探Java集合系列—HashMap

前面我们已经针对LinkedList和ArrayList的底层原理进行了具体研究讨论&#xff0c;大家可以跳链接阅读哦~ 再探Java集合系列—ArrayList-CSDN博客 再探Java集合系列—LinkedList-CSDN博客 HashMap有哪些特征呢&#xff1f; value可以重复&#xff0c;key不能重复&#xff0c…

【C++干货铺】继承 | 多继承 | 虚继承

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 继承的概念及定义 继承的概念 继承的定义 继承基类成员访问方式的变化 基类和派生类的赋值转化 继承中的作用域 派生类的默认成员函数 构造函数 拷贝构造…

解决Flutter运行报错Could not run build/ios/iphoneos/Runner.app

错误场景 更新了IOS的系统版本为最新的17.0, 运行报以下错误 Launching lib/main.dart on iPhone in debug mode... Automatically signing iOS for device deployment using specified development team in Xcode project: GN3DCAF71C Running Xcode build... Xcode build d…

羊大师分析,鲜羊奶对健康的影响与作用

羊大师分析&#xff0c;鲜羊奶对健康的影响与作用 你是否曾经听到过“羊奶比牛奶更健康”的说法&#xff1f;而鲜羊奶作为最纯正的羊奶形式&#xff0c;其营养价值更是不可小觑。除了拥有传统奶类所包含的营养成分外&#xff0c;鲜羊奶还含有更多人体必需的氨基酸和微量元素&a…

12.1_黑马Redis实战篇Redis优化秒杀Redis消息队列实现异步秒杀

目录 实战篇22 实战篇23 实战篇24 实战篇25 实战篇26 实战篇27 实战篇28 实战篇29 实战篇30 实战篇22 将任务分布给不同的线程去做&#xff0c;可以加快程序运行速度。 放到lua脚本&#xff0c;保证原子性。同时&#xff0c;这样的优化&#xff0c;可以减轻数据库的压…

《尚品甄选》:后台系统——商品管理,对商品数据进行维护(debug一遍)

文章目录 一、表结构介绍二、列表查询三、添加功能(复杂)3.1 加载品牌数据3.2 加载商品单元数据3.3 加载商品规格数据3.4 保存商品数据 四、修改功能4.1 查询商品详情4.2 保存修改数据 五、删除商品六、商品审核七、商品上下架 一、表结构介绍 商品管理就是对电商项目中所涉及…

基于H5“汉函谷关起点新安县旅游信息系统”设计与实现

目 录 摘 要 1 ABSTRACT 2 第1章 绪论 3 1.1 系统开发背景及意义 3 1.2 系统开发的目标 3 第2章 主要开发技术介绍 5 2.1 H5技术介绍 5 2.2 Visual Studio 技术介绍 5 2.3 SQL Server数据库技术介绍 6 第3章 系统分析与设计 7 3.1 可行性分析 7 3.1.1 技术可行性 7 3.1.2 操作…

办公软件PDF转换工具 - Bruce的PDF工具pdftool

Bruce的PDF工具 - 办公软件PDF转换工具 - pdftool&#xff0c;支持&#xff1a; 1、图片转PDF&#xff0c;支持图片自动压缩&#xff0c;可预览图片 2、合并PDF&#xff0c;支持多个PDF合并成一个PDF 3、PDF转图片&#xff0c;PDF的每页转成一张图片 4、OFD转PDF&#xff0c;O…

Postman:专业API测试工具,提升Mac用户体验

如果你是一名开发人员或测试工程师&#xff0c;那么你一定知道Postman。这是一个广泛使用的API测试工具&#xff0c;适用于Windows、Mac和Linux系统。今天&#xff0c;我们要重点介绍Postman的Mac版本&#xff0c;以及为什么它是你进行API测试的理想选择。 一、强大的功能和易…

honle电源维修UV电源控制器EVG EPS40C-HMI

好乐UV电源控制器维修&#xff1b;honle控制器维修&#xff1b;UV电源维修MUC-Steuermodul 2 LΛmpen D-82166 主要维修型号&#xff1a; EVG EPS 60/120、EVG EPS 100、EVG EPS200、EVG EPS 220、EVG EPS 340、EVG EPS40C-HMI、EVG EPS60 HONLE好乐uv电源维修故障包括&#…

2023年第十二届数学建模国际赛小美赛B题工业表面缺陷检测求解分析

2023年第十二届数学建模国际赛小美赛 B题 工业表面缺陷检测 原题再现&#xff1a; 金属或塑料制品的表面缺陷不仅影响产品的外观&#xff0c;还可能对产品的性能或耐久性造成严重损害。自动表面异常检测已经成为一个有趣而有前景的研究领域&#xff0c;对视觉检测的应用领域有…

智能优化算法应用:基于平衡优化器算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于平衡优化器算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于平衡优化器算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.平衡优化器算法4.实验参数设定5.算法结果…

Docker容器中的OpenCV:轻松构建可移植的计算机视觉环境

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 构建可移植的计算机视觉环境 文章目录 前言引言简介&#xff1a;目的和重要性&#xff1a; 深入理解Docker和OpenCVDocker的基本概念和优势&#xff1a;OpenCV简介和应用领域&#xff1a;…

几个linux指令提升编程效率

history history命令是Linux/Unix系统中的一个常用命令&#xff0c;用于查看当前用户在命令行中执行过的命令历史记录。该命令允许用户查看、搜索、编辑和执行之前执行过的命令&#xff0c;为用户提供了方便、快捷的操作方式。 查看历史命令&#xff1a; history查看最近n条…

nginx三种虚拟主机的配置(IP,端口,域名)

准备工作&#xff1a; [rootbogon ~]# mkdir -p /data/nginx{1..3} #-p是用于递归创建使用 [rootbogon ~]# echo "hello nginx1" > /data/nginx1/index.html [rootbogon ~]# echo "hello nginx2" > /data/nginx2/index.html [rootbogon ~]# echo &q…

adb环境搭建(adb下载与安装)

文章目录 前言一、adb下载二、adb安装1.将下载的安装包解压缩2.将解压缩后的文件夹放到自己想存放的目录下&#xff08;不要放到带有中文的目录下&#xff09;——我这放到D盘根目录下3.配置环境变量3.1.鼠标放到 "此电脑"→鼠标右击→选择属性3.2.点击 "高级系…

海银・颖奕海南国际健康管理基地启航!“财富+健康”双轮驱动战略加速中

现场&#xff0c;颖奕集团、颖奕生物科技集团董事长凌临贵&#xff0c;海南博鳌乐城国际医疗旅游先行区管理局党委书记、局长贾宁&#xff0c;海银控股董事长韩宏伟&#xff08;从左至右&#xff09;共同启动该项目。 11月24日&#xff0c;“海银颖奕海南国际健康管理基地”在…

正则表达式及文本三剑客grep sed awk

正则表达式 1.元字符 . //匹配任意单个字符&#xff0c;可以是个汉字 [yang] //匹配范围内的任意单个字符 [^y] //匹配处理指定范围外的任意单个字符 [:alnum:] //字母和数字 [:alpha:] //代表…