工作日常随记-总

news2024/11/24 8:03:31

软件测试主管工作日常随记-总

前言

接下来,我将开始散文式地记录我作为一位从业3年多的软件测试人员的软测经验。这是我在繁忙的日常工作的中跋涉出来又又投入的另一工作(bushi)另一兴趣中去。
我将简单(偏流水线向)从业务/技术/项管三个方面简单汇总一下我的日常工作。后期可再针对使用到的具体技术的详解再开篇。

1.业务

(1)测试用例

测试用例,好像是每个讲软测经验的文章的基本输出。各种测试用例的设计及白盒黑盒测试方法重复出现在收集者前面。so,不走寻常路的我,决定从另外的角度去分享测试用例。日常工作中,项目上线出现的大大小小的问题都会被我收入囊中,记录在册,可以说我的项目复盘手册都快被我盘包浆了。aha 以我做过的一个电子签约项目平台为例子,这是一个中型项目,前期后期紧赶慢赶,也算把项目成功交付。后我们组织做了一次复盘会,基本复盘总结如下

主要业务流程总结

利用正交法+场景法,列出所有参数(如参与方、签署文档等)及其水平参数(如参与方有单参与方和多参与方),将其有序地组合成一个个场景,这样可以很好地覆盖项目的主要功能流程,以保障主要业务流程尽可能不漏测。

测试主流程

输入框功能测试点

输入框功能测试点

搜索框功能测试点

搜索框功能测试点

导出导入功能测试点

导出导入功能测试点

如此总总,就不一一 枚举。总而言之,业务流程上,正交法+场景法yyds;其他普通功能点,上面的涉及到的,直接cv,复用率极高。

2.技术

(1)接口自动化

jmeter-反电诈项目

这个我做过的一个非常有意义的项目,和腾讯合作的,主要为用户拦截并提示所有可能涉及到的诈骗类型,并以裂变的形式扩展用户,这个项目前期后端先完成,并出了完善的API文档,数据库设计说明,这不则正是为接口自动化提供了良好的前期条件么。于是我组织组内测试人员经过5天时间设计并完成了关于该项目的jmeter接口自动化脚本的编写,并将其简单转化成性能、稳定测试的脚本。

详细脚本截图
用户定义变量

下面截图是对用户变量的描述,放于测试计划下,作用于所有线程组(这些变量一旦定下,无需再修改,最后执行的tearDown线程组会直接从测试数据库删除这些变量以达到无限重复使用,达成自动化的实现)
用户定义变量

线程组例子

一个线程,原则上由一个功能点的1个或多个接口组成,需从正向和反向测试。
 线程组例子

jmeter关于数据库的连接

jmeter关于数据库的连接-1

jmeter关于数据库的连接-2

主要接口的性能脚本编写

这边就浅浅说一下性能测试较值得分享的技能,大数据量级别的接口数据关联如何实现。

xx项目的主要业务接口需要进行性能测试,而该接口实现的前提是登陆接口请求后获得的token作为其请求头。单用户的接口可以直接通过关联的方式实现该功能。而性能接口测试的目的就是获取目标接口的某数量级别请求后的具体数据(tps,qps等),如利用多接口关联则会破坏数据的真实性。

实际工作中,我使用了BeanShell 后置处理程序处理了该问题,使得性能测试数据更独立,更真实、可用度更高。具体实现方式如下:

  • 利用BeanShell把响应结果写入本地
    利用BeanShell把响应结果写入本地

  • 添加配置元件:CSV 数据文件设置,从CSV文件读入,后续直接引用TOKEN
    从本地提取文件变量

(2)UI自动化

这是算我第一次比较全面,系统的建立一个UI自动化的测试框架,真真从0到1的突破。

首先就是从框架的选取,挑选合适做自动化测试的功能,设计对应的测试用例。我选择的pytest框架,详细框架架构如图

UI自动化框架

(3)集成

Jenkins构建-关于接口自动化及测试管理

Jenkins的作用不用我多说大家都知道,部署环境、定时跑任务。那在测试工作的环节上就免不了跟测试自动化挂钩上。

下面我将从两方面介绍Jenkins在我测试工作中的举足轻重的作用。

1、接口自动化

上章节我们介绍到jmeter自动化脚本的编写,写完呢,每次测试的时候都大费周章的打开jmeter,然后一线程一线程的执行,然后再去根据结果树,一个一个的查看结果、分析。如果领导需要一份测试报告,还要费尽脑汁的重立框架、组织语言去总结输出文档。NoNoNo 这绝不是一个成熟的测试工程师的工作样本。以始为终,为降本增效,我们就需要利用到Jenkins了。

  • 源码管理
    源码管理

  • 构建触发器
    构建触发器

  • 构建
    构建

  • 构建后操作
    构建后操作

接口自动化构建后操作-测试数据分析结果告知项目组

邮件通知

测试报告

2、bug管理统计配置

bug统计的Jenkins项目配置截图

构建触发器
源码管理
构建
构建后操作

(4)测试左移、测试右移

左移

测试左移,这个概念在日常测试工作中常有听说,但是左移的实践甚少。这也将是以后高级测试发展的方向,如代码路径测试、针对代码的建议,如正则表达式匹配的建议等

右移-生产问题汇总、跟进

在我后半段的测试工作经验中也涉及较多。如专门设计的生产问题反馈的处理流程、协作安排、处理人员的调度、跟进修复的进度、及时复测以便更版生产。

3.项目管理

(1)集成技术控制

1、bug管理统计

某天老板叫我到办公室,严肃地问了我一个问题:你觉得目前的开发人中,谁的水平最高,工作效率最快。好家伙,这不能妥妥得罪人的问题么,这开发老师我们平时可是放在手心上哄的呀。这锅我不能背,那就让数据说话吧。于是乎,我想到禅道,禅道可是妥妥记录开发在测试员的整个‘成长历史’:模块开发时长、开发产生bug数、bug修复时长、bug激活次数、bug的遗留个数等等。我反手就打开我的pycharm,整了以下关于禅道的sql语句,统计出我要的数据,通过python的整理,以htlml的格式将数据每日定时发送至钉钉群,方便老板以及各部门领导更好的每日观察各位开发的工作情况。

具体统计sql语句代码如下
def bug_total(self, cursor, now,begin_day,total_day):
    """
    最近总的BUG情况统计统计
    :param: day 根据输入天数
    :return:
    """
  
    # 新增bug数
    new_near_bug_sql = """SELECT COUNT(*) as new_near_bug from zt_bug where openedDate between "%s" and "%s" and deleted='0';""" % (begin_day, now)
    cursor.execute(new_near_bug_sql)
    new_near_bug = cursor.fetchone()
    # print("新增bug数")
    # print(new_near_bug)

    # 已解决bug数
    close_bug_sql = """SELECT COUNT(*) as close_bug from zt_bug where status = "closed" and openedDate between "%s" and "%s" and deleted='0';""" % (begin_day, now)#"%s"表示这里将被替换成一个新的字符串,依次为recent_sevenday, now
    cursor.execute(close_bug_sql)
    close_bug = cursor.fetchone()
    # print("已解决bug数")
    # print(close_bug)

    # 未解决bug数
    open_bug_sql = """SELECT COUNT(*) as open_bug from zt_bug where status = "active" and openedDate between "%s" and "%s" and deleted='0';""" % (begin_day, now)
    cursor.execute(open_bug_sql)
    open_bug = cursor.fetchone()
    # print("没解决bug数",)
    # print(open_bug)

    # 已解决待验证bug数
    close_unbug_sql = """SELECT COUNT(*) as close_unbug from zt_bug where status = "resolved" and openedDate between "%s" and "%s" and deleted='0';""" % (begin_day, now)
    cursor.execute(close_unbug_sql)
    close_unbug = cursor.fetchone()
    # print("已解决待验证bug数", )
    # print(close_unbug)

    #研发人员发生bug数排行。
    dev_bug_sql = """SELECT COUNT(*) num,realname FROM zt_bug b INNER JOIN zt_user u ON u.account = b.resolvedBy
                        WHERE DATE_FORMAT(b.openedDate, '%%Y-%%m-%%d') between '%s' and '%s'
                        AND u.deleted='0' AND u.role='dev' 
                        GROUP BY b.resolvedBy ORDER BY num DESC;""" % (total_day, now)
    cursor.execute(dev_bug_sql)
    dev_bug = cursor.fetchall()
    print("研发人员发生bug数降序排行", )
    # print(dev_bug)
    add_str_dev_bug = ''  # 空字符串
    #让降序排行一行一人
    for _tuple in dev_bug:
        a = ' \n \n {0}'.format(
            _tuple)
        add_str_dev_bug += str(a)
        
        
 #研发人员发生bug激活数排行。
    activation_bug_sql = """SELECT SUM(激活次数) 激活次数,中文姓名 FROM (SELECT b.id,COUNT(*) 激活次数,u.realname 中文姓名 FROM
        zt_bug b INNER JOIN zt_action a ON a.objectID = b.id INNER JOIN zt_user u ON u.account = b.resolvedBy
        WHERE DATE_FORMAT(b.openedDate, '%%Y-%%m-%%d') between "%s" and "%s" AND a.objectType = 'bug' AND a.action = 'activated'
        AND u.deleted='0'  and u.role='dev'
        GROUP BY b.id ORDER BY 激活次数 DESC) tem GROUP BY tem.中文姓名 ORDER BY 激活次数 DESC;""" % (total_day, now)
    cursor.execute(activation_bug_sql)
    activation_bug = cursor.fetchall()
    print("研发人员BUG被激活次数(非一次性修复)", )
    print(activation_bug)
    add_str_activation_bug = ''  # 空字符串
    #让降序排行一行一人
    for _tuple in activation_bug:
        a = ' \n \n {0}'.format(
            _tuple)
        #(Decimal('19')中的(Decimal('')去掉
        a = re.sub('[(Decimal('')]', '', a)
        # print(a)
        add_str_activation_bug += str(a)

    # print("拆开元组,研发人员BUG被激活次数(非一次性修复)", )
    # print(add_str_activation_bug)


    # 提BUG、指派、转派【已解决待验证】、改BUG,=====================\n\n研发人员BUG被激活次数(非一次性修复):{5}\n\n
    statistics_bug = "本年度新增bug总情况({6}~{7}) \n\n 新增BUG数:{0} \n\n 未关闭BUG数:{1} \n\n 已关闭BUG数:{2} \n\n 已解决待验证BUG数:{3}\n\n =====================\n\n研发人员今年(2023)BUG数倒序:\n\n{4}\n\n =====================\n\n研发人员今年BUG被激活次数(非一次性修复):\n\n{5}\n\n".format(
        new_near_bug[0], open_bug[0], close_bug[0], close_unbug[0], add_str_dev_bug, add_str_activation_bug, total_day, now)
    # print("bug的统计汇总:"+statistics_bug)
    return statistics_bug
具体关联钉钉代码
import datetime
from dingtalkchatbot.chatbot import DingtalkChatbot, FeedLink

class ding_talk():
    def send_bug(self,url, data_file,sign_mark):#设置发送的信息样式
        '''
        :param url: 钉钉机器人的webhook
        :param data_file: 查看详情中的markdown信息
        :param sign_mark: 用户而可以自定义字段为本周、还是本月的禅道BUG情况统计
        :return:
        '''
        xiaoding = DingtalkChatbot(url)
        # Markdown消息@所有人
        now = datetime.datetime.now().strftime("%Y%m%d")
        # print("当前时间:"+str(now))
        
        # 含html
        xiaoding.send_markdown(title='BUG统计%s' % (now),
                               text='**禅道BUG情况统计**\n\n 各位同事,以下是禅道BUG情况统计。统计结果供各组组长参考,烦请做好督促,尽快处理bug!\n\n=====================\n\n {0} \n\n[查看历史遗留bug详情](http://192.168.100.135:9080/test/bugdetail.html) \n'.format(
                                   data_file,now), is_at_all=False)
                             data_file, now), is_at_all=False)
            
    def bug_html2(self, lis, html_file):
        """
        对查询bug明细转html文件
        :param lis
        :param html_file
        """
        """
                对查询bug明细转html文件
                :param lis
                :param html_file
                """
        conten_title = []
        for key in ( "项目名称","开始", "结束","姓名", "bug标题", "bug_id"):
            conten_title.append(key)
        a = "</th><th>".join(conten_title)
        con_title = "<tr><th>" + a + "</th></tr>"
        conten_val = ""
        con = ""
        # lis_arr = lis.fetchall()
        for i in range(0, len(lis)):
            for index, v in enumerate(lis[i]):
                if index == 0:
                    # 20231114修复字符串拼接
                    conten_val = "<tr><td>" + str(lis[i][index]) + "</td><td>"
                    # conten_val = "<tr><td>" + lis[i][index] + "</td><td>"
                    con = con + conten_val
                    continue
                con = con + str(lis[i][index]) + "</td><td>"
            con = con[0:-2] + "r>"
            con = con + "\n"
        head = """<meta charset="utf-8">
                <style type="text/css">
                table.tftable {font-size:12px;color:#333333;width:100%;border-width: 1px;border-color: #9dcc7a;border-collapse: collapse;}
                table.tftable th {font-size:12px;background-color:#abd28e;border-width: 1px;padding: 8px;border-style: solid;border-color: #9dcc7a;text-align:left;}
                table.tftable tr {background-color:#ffffff;}
                table.tftable td {font-size:12px;border-width: 1px;padding: 8px;border-style: solid;border-color: #9dcc7a;}
                </style>\n<table id="tfhover" class="tftable" border="1">\n"""
        last = "</table>"
        htm = head + con_title + con + last
        with open(html_file, "w+", encoding="utf-8") as f:
            f.write(htm)
具体实现情况如下

关联钉钉自动推送

(2)每日晨会汇总表-产品沟通群

这个其实也涉及到我们上面提到的测试右移
组织每日站立会议,主要内容就是:跟进1.0项目的总体进度,及时反馈项目的各种可能发生的风险:如延迟,功能点偏移;汇总2.0+的项目生产问题、新需求、优化等。关于晨会每日的汇总表格,简单而优雅,不失重点,涉及有具体问题、具体人员、具体处理点、具体完成时间都要详细绘出。及时做好与需求提出者(产品or运营)的沟通,反馈研发的整个流程的问题处理情况。
汇总、跟进项目(新旧项目,需求、优化、bug)

(3)QC→QA

质量检查-质量保证
这一点其实主要是本人对测试行业的。。算是浅薄认知吧。以前讲测试,我们都理所当然地想到这是讲质量检查。基操就是:发现问题,、反馈问题、待处理问题后复测问题。这个流程都是相对被动的。被产品告知需求,被开发告知提测,待开发修复问题,待运维上线不同环境,再次冒烟。
是否,我们能从被动,慢慢转向主动,从质检,慢慢转向真正意义上的质保。毕竟,成熟的测试是要能提得了需求,开发得了代码(bushi)成熟的测试应能对产品的质量做出保证,竭尽全力在测试的过程中尽多地找出bug,尽全力提高DDP(缺陷探测率),在需求提出,力驳需求的可实现性,在需求阶段将不合理逻辑修正;在需求分析和开发代码的阶段,利用时间差系统梳理项目,临摹执行测试的步骤,编写详细的测试用例。协助将整体测试左移,把控项目进度,前紧后松,减少后期项目执行的各类风险的产生,提高系统测试阶段的效率。

后序

浅谈管理

这个管理包含自己、项目、团队

自我管理

做乙方,multi-task是常态,我经常手上同时3、4个项目一起提测,一起运行的,不可能优哉游哉地让我做好一件事情再进入下一项,所以我必须要学会左右腾挪,尽最大可能提高自己的时间密度。那么有什么是可以跟大家分享的实操技巧呢。
首先,制定日计划,开启一天工作前,把自己今天需要做的大小事项,每项大概需要花费多少时间一一记录在我们的to do list中, 一目了然。(实际工作中我们会有一个dingding在线文档可以生效该功能)
有些工作可能我花费个半小时、一小时可以完成的,比如有些简单的遗留bug的复测,这样的工作我会优先做完,然后在我的to do list中划掉;那有些工作需要我重点攻坚的,那我就会拿出3、4个小时的完整时间来沉浸式完成,如整体的项目需求分析。我在单位时间的效率是较高的,因为我能很快地专注到我所做的工作当中,进入到一个心流模式。

项目管理

敏捷工作方法,确认最小可交付物能到什么程度。先完成,再完美。以我在编写测试用例的为例子,我是不奢求一开始就尽全力覆盖所有的功能点的测试。我会现在xmind中罗列、拼凑出bullet point(要点),System functions(具体功能)。以实名认证为例,我会先罗列出项目所需支持的实名认证的各种方式;再深入一层,这几项在测试环境的业务流程要涉及哪些测试数据;再进一步拆解,从反向的测试数据、流程去验证整个实名认证代码的系统逻辑性是否都有覆盖到。简单说就是我会把框架完成之后再去缝制外衣,再去丰富内层,注入血肉,这是一个井然有序的过程

团队管理

我负责的是一个测试小团队,团队只有三人,但我们的工作一向都是有序进行,我们之间的关系相辅相成。展开说,团队管理要点如下

  • 成员们先要有一个共同的目标,在工期结束前,完成项目的测试工作,保证产品更高的测试覆盖率,更低的缺陷探测率。
  • 其次,利用好辅助工具。在测试项目管理中,禅道可以实现全面,可视化管理。我们团队利用禅道制定测试用例,从而与开发团队共享测试用例,在开发团队执行我们生成的冒烟用例后,我们开始利用禅道执行系统测试,并利用禅道系统有序地记录此过程产生的bug,指派给对应开发。当然,实际测试工作中会使用到的辅助工具远不止这一个,在此就不细细一一展开。
  • 我们小组成员按分配模块,各自执行自己负责的模块,统一分配任务,不仅能够提高效率,还能够实现更好的管理。我也能很好的掌握组员的负责模块完成进度、质量
  • 团队也需要提升,为此,我会在忙碌的测试工作中安插测试技术的分享会,自己遇到难题后寻找到的解决办法也会实时共享出来,我很乐于分享我实时获得的最新测试相关技术,因为测试团队就是一个整体,成员的优秀是完善团队至关重要的一步。

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

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

相关文章

性能升级,INDEMIND机器人AI Kit助力产业再蜕变

随着机器人进入到越来越多的生产生活场景中&#xff0c;作业任务和环境变得更加复杂&#xff0c;机器人需要更精准、更稳定、更智能、更灵敏的自主导航能力。 自主导航技术作为机器人技术的核心&#xff0c;虽然经过了多年发展&#xff0c;取得了长足进步&#xff0c;但在实践…

windwos安全加固

一、账号管理 按用户类型分配账号 目的&#xff1a;根据系统要求&#xff0c;设定不同账户和组&#xff0c;管理员、数据库 sa、审计用户、来宾用户等 实施方法&#xff1a; 打开本地用户和计算机管理器 ​ 1.打开运行&#xff0c;输入lusrmgr.msc 2.根据用户要求将账户加入…

一文涵盖Lambda,Stream,响应式编程,从此爱上高效率编程

一文涵盖Lambda,Stream,响应式编程&#xff0c;从此爱上高效率编程 前言 本文结构为 先是一个例子&#xff0c;带你快速体验&#xff0c;之后再去深究里面的方法。以及一些底层原理是如何实现的。从如何用&#xff0c;到如何用好&#xff0c;如何用精。学习操作&#xff0c;学…

设计模式——2_7 状态(State)

欲买桂花同载酒&#xff0c;终不似&#xff0c;少年游 ——刘过《唐多令芦叶满汀州》 文章目录 定义图纸一个例子&#xff1a;如何模拟一个转笔刀自动转笔刀PencilPencilSharpener 投诉和改善钝刀BladePencilSharpener 没有铅笔PencilSharpener if if ifStatePencilSharpener 碎…

雪亮工程视频联网综合管理/视频智能分析系统建设方案(一)

一、行业背景 雪亮工程主要是针对农村地区治安防控的监控项目&#xff0c;在乡村的主干道、路口、人群聚集地部署高清摄像头&#xff0c;通过三级综治中心和指挥平台&#xff0c;将视频图像信息系统纵向下延至县、乡、村&#xff0c;同时利用系统拓展在安防、社会治理、智慧交…

细胞世界:4.细胞分化(划区域)与细胞衰老(设施磨损)

(1)细胞凋亡 1. 概念&#xff1a;细胞凋亡可以比作城市的规划者主动拆除某些建筑来更新城市或防止危险建筑对市民的潜在伤害。这是一个有序的过程&#xff0c;由城市&#xff08;细胞内部&#xff09;的特定规划&#xff08;基因&#xff09;所决定。 2. 特征&#xff1a;细…

LeetCode-1143. 最长公共子序列【字符串 动态规划】

LeetCode-1143. 最长公共子序列【字符串 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;动规五部曲解题思路二&#xff1a;1维DP解题思路三&#xff1a;0 题目描述&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。…

【攻防世界】Confusion1

php的标志是大象&#xff0c;Python的标志是蛇 。Python 的 Flask 框架( Flask 使用 Jinja2 作为模板引擎 ) 点进register.php 输入{{3*4}} 输入 {{config}} 也有回显&#xff0c;ssti 判断是否存在ssti注入&#xff1a; 1. {{8*8}} 2. {{config}} 过滤了关键字&#xff0…

详解Qt添加外部库

在Qt项目中添加外部库是一项常见任务&#xff0c;无论是静态库还是动态库都需要正确的配置才能让项目顺利编译链接。以下是详细步骤和不同场景下的配置方法&#xff1a; 方法一&#xff1a;手动编辑.pro文件 添加头文件路径&#xff1a; 在Qt项目中的.pro文件中使用INCLUDEPAT…

在线视频教育平台|基于Springboot的在线视频教育平台系统设计与实现(源码+数据库+文档)

在线视频教育平台目录 基于Springboot的在线视频教育平台系统设计与实现 一、前言 二、系统设计 三、系统功能设计 1、前台&#xff1a; 2、后台 用户功能模块 教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&a…

Kingbase(人大金仓数据库)(总结全网精华,虚拟机:从安装到操作数据库一条龙)

前言&#xff1a; 前一阵子一直在捣鼓人大金仓数据库&#xff0c;虽然国产化的数据库很值得夸赞&#xff0c;但是网上的资料确实少的可怜。特此记录一下我在学习这个数据库的心酸历程。 安装就看这个大哥的&#xff0c;我之前安装就是看的他的&#xff0c;非常靠谱。 linux安装…

海外代理IP如何助力YouTube广告投放?

一、海外代理的角色与优势 拓展地理访问&#xff1a; 海外代理允许您从其他国家或地区的IP地址进行网络访问。通过使用海外代理&#xff0c;您可以绕过部分限制&#xff0c;实现访问YouTube和其他平台的目的。扩展受众&#xff1a; 利用海外代理&#xff0c;您可以将广告投放面…

每日一题---OJ题: 相交链表

片头 嗨! 小伙伴们,大家好! 今天我们来一起学习这道OJ题---相交链表,准备好了吗? Ready Go! ! ! emmm,看这道题好像不怎么难,我们一起画图分析分析 上图中,A链表有5个结点,分别为 a1,a2,c1,c2,c3 ; B链表有6个结点,分别为 b1,b2,b3,c1,c2,c3 ; A链表和B链表在c1结点相交 …

【Python】数学函数和特殊内置函数大揭秘:Python中隐藏的秘密武器

欢迎来CILMY23的博客 本篇主题为 数学函数和特殊内置函数大揭秘&#xff1a;Python中隐藏的秘密武器 个人主页&#xff1a;CILMY23-CSDN博客 个人专栏系列&#xff1a; Python | C语言 | 数据结构与算法 | C 感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关…

Partisia Blockchain:被严重低估的隐私区块链生态

在今年 3 月&#xff0c;隐私公链 Partisia Blockchain 迎来了重要的进展&#xff0c;该生态通证 $MPC 上线了交易所&#xff0c;目前 $MPC 通证可以在 Kucoin、Gate、BitMart、Bitfinex、Bitture 等平台交易&#xff0c;并将在不久后上线 MEXC 平台。 在上个月上线市场至今&am…

【Linux】进程间通信——system V版本 共享内存

目录 共享内存 原理 实践 shmget() 创建共享内存 shmctl() 删除共享内存 shmat() 挂接进程和共享内存 shmt() 进程和共享内存去关联 共享内存的特性 优势 劣势 用共享内存实现进程间通信 共享内存 原理 两个进程的PCB各自维护着一个进程地址空间。当两个进…

VsCode 安装Jupyter Notebook

VsCode 安装Jupyter Notebook 安装 1、打开 VSCode 编辑器&#xff0c;点击界面左端的【扩展】栏&#xff1b; 2、在【搜索框】中输入python&#xff0c;点击第一个Python&#xff0c;检查是否已经安装 python 插件&#xff0c;没安装的点击安装&#xff1b;已安装的继续第3步…

32单片机入门持续更新中

配套资料为野火霸道V2 初识 STM32 4.1 什么是 STM32 STM32&#xff0c;从字面上来理解&#xff0c;ST 是意法半导体&#xff0c;M 是 Microelectronics 的缩写&#xff0c;32 表示 32 位&#xff0c;合起 来理解&#xff0c;STM32 就是指 ST 公司开发的 32 位微控制器。在如今…

C++数据结构与算法——动态规划子序列系列

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月 (2024.1.30-2024.4.10已完结&#xff09;&#xff0c;任务量确实有点大&#xff0c;包括春…

Mysql主从同步原理

master每次提交事务时都会将数据变更记录到二进制文件BINLOG中&#xff0c;binlog文件主要记录除查询以外的DDL和DML&#xff0c;slave的IO线程读取master的BINLOG文件&#xff0c;并写入中继日志Relay log文件中&#xff0c;然后slave的SQL线程读取relay log文件并重做事务映射…