第二章:input partitioning

news2024/11/28 14:42:12

文章目录

  • Input partitioning
    • input partitioning 的目的
    • computational / domain faults
    • 等价类(equivalence classes)
      • input conditions & valid / invalid inputs
      • partitioning and equivalence classes
        • 等价类划分的原则
      • 白盒 - Domain testing
        • 复合谓词 (compound predicates)
        • 程序中的循环
      • 黑盒 - Equivalence Partitioning
        • step1:识别初始的等价类
          • guideline1 - Range
          • guideline2- 离散集合
          • guideline3- 输入数量
          • guideline4- zero-one-many
          • guideline5 - Must rule
          • guideline-6 知觉 + 经验
      • step2: 合并并减少等价类
      • step3:选择 test cases
      • 实例
    • Test Template Trees
      • start:从 testable input domain 开始
      • repeat
      • End
      • Result
      • 缓解 tree 爆炸的问题
    • Combining partition 组合分区
      • All Combinations
      • Each Choice Combinations
      • Pair-Wise Combinations
    • 简单总结

Input partitioning

input partitioning 的目的

  • 在之前的章节中提到 input domain 是 program / function 的所有可能的输入

  • 但是这些输入中有一些是没有意义的,而且如果全部测量的话也是非常耗时的

  • 因此如何筛选出一部分 input test cases 能够又快又好地找出 failures 就是 testing 中关注的重点

  • 这部分 input partitioning

    • 我们可以将很多 test case 划分成相同的类别 (equivalence class 等价类) 从而用一个 test case 就能代替一群,这样也可以提高 test 效率而且还有助于更快发现 failure
  • 使用 input partitioning 相当于使用一个分类器,将所有的 input 划分成不同的类别 (input class),每个类别经过相同的代码段和处理
    在这里插入图片描述
    在这里插入图片描述

  • 这个 D i D_i Di 代表的就是所有 input 切分成多个类别中的第 i i i 个输入类; F i F_i Fi 表示就是这一类的输入经过的都是同一个函数
    在这里插入图片描述

computational / domain faults

  • 上述代码中可以认为分成了两个 F 1 F_1 F1 F 2 F_2 F2 其中 F 1 F_1 F1 包含 3, 4, 5, and 7 行, F 2 F_2 F2 包含 3, 4, and 7

  • 根据对程序的这种观点,存在两种可能的故障类型 (types of faults):

    • 计算故障:(computational faults) 在选择了正确路径但沿该路径发生了错误计算;以及

    • 领域故障:(domain faults): 在每个路径上计算都是正确的,但选择了错误的路径。

导致选择错误路径的可能原因有:(1)输入领域执行了错误路径;(2)构成路径选择的决策可能包含故障;以及(3)正确路径(或用于计算所必需的部分路径片段)可能被简单地遗漏。

输入划分的目标是派生测试输入,至少能够执行程序中每个函数一次。在本章中,我们介绍了两种将输入划分为等价类别的方法。

等价类(equivalence classes)

在这里插入图片描述

  • 例如在前面的 2.1 图中, D i D_i Di 就是第 i i i 个等价类,其中的测试用例都是等价的
  • if / else / while 这些条件可以天然地划分等价类

input conditions & valid / invalid inputs

在这里插入图片描述

  • input domain 上的输入条件 (input condition) 是对输入域中单个变量值 single variable 的谓词 (predicate)。当我们需要考虑输入域中多个变量的值时,我们称之为输入条件的组合。
  • valid input 指的是符合 specification 的 input case,例如根据程序的 specification 能够不触发错误,如果 function 传入的参数是 divide 的分母,那么 0 就是一个 invalid 的输入,除了 0 以外的其他值都是 valid
  • invalid input输入域中不被期望或由程序规范给出的错误值的元素。换句话说,无效输入是指在输入域中不是有效输入的值。invalid 还包括 testablenon testable 的 input
    • non testable 的输入是 违反程序前置条件的输入。前置条件是对程序输入变量的一种假设,即在执行该程序时假定满足该条件。这意味着程序员明确假设前置条件在程序开始时成立,并且因此,对于任何违反前置条件的输入,程序的行为是 undefined。 如果行为未定义,则我们不进行测试。比如如果程序要求是 有序的列表(在 binary search 中),这是一个前置条件,硬性要求,不满足就直接没有测试的必要,因此是 non-testable
    • testable 但 invalid 输入是指不违反前置条件但仍然无效的输入。 通常情况下,这些指代返回错误代码或抛出异常的输入。

在这里插入图片描述

partitioning and equivalence classes

  • 等价类划分基于的假设是,等价划分背后的假设是,类的所有成员在故障方面表现出相同的方式,因此选择等价类中的任何一个成员与其他成员相比,在检测到故障的可能性上是相同的。
    在这里插入图片描述
  • 虽然这个假设是错误的,但是依然是价值的
等价类划分的原则
  • 任何两个等价类不重叠(disjoint)
  • 等价类的总和要覆盖所有的 input domain

白盒 - Domain testing

在这里插入图片描述

  • 首先将输入空间划分为一组互斥的等价类。每个等价类对应一个程序路径。
  • 其思想是基于 domain 边界选择测试用例,并探索 domain 边界以确定 sub-domains 是否正确。 (Domain Testing 不仅关注等价类,而且特别关注边界值,因为历史数据和经验告诉我们大部分的错误发生在输入或输出范围的边界上。)更准确地说,从以下两个方面选择测试用例:
    • 领域边界;
    • 靠近领域边界的点。
      在这里插入图片描述
      在这里插入图片描述
  • 上述内容有 4 条path,因此有 4 个 input domain
  • 每个域都由一个线性边界定义。这些在图2.5中显示。在这个图中,TT指的是程序中两个分支都评估为真的域。TF、TF和FF与其他可能的评估类似地被定义。
    在这里插入图片描述
  • 如果程序的分支使得某些路径不可行,则该路径的域为空。
    在这里插入图片描述
    在这里插入图片描述
  • 但 domain testing 假设程序是线性域的组合
  • 线性边界需要更少的测试点来进行检查,并且可以以更高的确定性进行检查。如果一个程序违反了这个假设,那么使用这种策略进行测试可能不如在程序满足假设的情况下发现错误有效,因为解决非线性等式和不等式比解决线性等式和不等式要困难得多。 在非线性情况下,一个点可能位于一个域中,但计算上过于昂贵而无法准确检查;例如,一个多项式:
    在这里插入图片描述
复合谓词 (compound predicates)
  • 简单谓词决定简单的边界情况

  • 复合谓词导致复杂的边界情况,甚至定义一个突边界( A N D AND AND);而通过 O R OR OR 构建的复合谓词,则导致了不连续的、不重叠的边界
    在这里插入图片描述

  • 为了解决这个问题,将用 O R OR OR 构建的复合谓词转化为两个条件:
    在这里插入图片描述

程序中的循环
  • 对于一些包含循环的程序,我们有 无限多个路径,因此也有 无限多个等价类。为每个等价类选择测试输入显然是不可能的,所以我们需要一种技术来使其变得有限。

一个典型的解决方法是应用 zero-to-many 规则。即某段程序可以执行的最小次数是零, 因此这是一条路径。 同样地,**某些循环具有上界,所以将其视为一条路径。**关于循环的一个通用准则是选择能够执行该循环的测试输入:

在这里插入图片描述
对于循环次数有上限的程序,让 N + 1 N+1 N+1 等于运行次数的上限。

在这里插入图片描述
在这里插入图片描述

  • 第一个 predicate 是个复合谓词,在这里简写为 v a l i d ( x , y , z ) valid(x,y,z) valid(x,y,z)
  • 针对 isosceles case (等腰三角形的情况),有三种等价类:
    在这里插入图片描述
  • 对于普通的三角形,有一种等价类:
    在这里插入图片描述
  • 对于等边三角形有一种等价类:
    在这里插入图片描述
  • 对于 invalid 的三角形,有一种等价类:
    在这里插入图片描述

黑盒 - Equivalence Partitioning

  • 目标是尽量减少所需的测试用例数量,以覆盖您已经确定的所有等价类。通常方法只需要三个步骤:
    • 识别初始的等价类
    • 识别 overlap 的等价类,并且将重叠部分划分成新的等价类
    • 从每个等价类中选择一个元素作为测试输入,并计算出该测试输入的预期结果。

在这里插入图片描述

step1:识别初始的等价类

有 6 个原则:

guideline1 - Range
  • 如果输入条件指定了一个值范围,请为该范围内的值集合确定 一个有效等价类,以及两个无效等价类;一个用于范围下方的值集合,另一个用于范围上方的值集合。
    在这里插入图片描述
guideline2- 离散集合
  • 集合中的每个元素确定一个有效等价类,以及对于不在该集合中的元素确定一个无效等价类。
    在这里插入图片描述
guideline3- 输入数量

在这里插入图片描述

  • 规定输入数量为一个定值(例如 3),那么将输入 3 个值为有效等价类, < 3 <3 <3 > 3 >3 >3 个值分别作为无效的等价类
guideline4- zero-one-many
  • 如果输入条件指定输入是一组项目,并且该集合的大小可以变化;例如,一个元素列表或集合;为大小为 0 0 0 的集合定义一个有效等价类,为大小为 1 1 1 的集合定义一个有效等价类,并为大小 > 1 >1 >1 的集合定义为一个有效的等价类
  • 如果同时有上界的话,那么 > 1 >1 >1 的集合应该变成 > 1 a n d < u p p e r   b o u n d >1 and < upper~ bound >1and<upper bound 的集合
guideline5 - Must rule
  • 应用在 must be 的场景中,例如下面要求第一个字母是数字,那么这种情况将第一个字母是数字的看成是有效等价类,而其他的是无效的等价类
    在这里插入图片描述
guideline-6 知觉 + 经验

在这里插入图片描述

step2: 合并并减少等价类

在这里插入图片描述

  • 很多等价类中有重合的部分
    在这里插入图片描述
  • 消除重叠之后:
    在这里插入图片描述

step3:选择 test cases

  • 一旦等价类被确定,选择测试用例就很简单了。等价类中的任何一个值都被认为与该类中的其他任何值一样可能导致失败,因此该类的任何元素都可以作为测试输入,并且从该类中选择任意元素即可。

实例

在这里插入图片描述

  • 这个程序需要三个输入 (x,y,z)
  • 程序会根据 x,y,z 的值打印其是什么类型的三角形

  • 一个潜在的 specification 是:x,y,z 的值都要 > 0 > 0 >0 因此根据 must rule 原则,我们可以定义 > 0 >0 >0 的是 valid 的等价类,而 < = 0 <=0 <=0 的是无效等价类
    在这里插入图片描述

  • 然而这三个条件本就是互不重叠的,因此我们其实可以将这三个条件写成一个等价类:
    在这里插入图片描述

  • 同样的,我们可以继续将这个条件丰富为:三边都 > 0 且任意两边之和大于第三边,因此等价类可以进一步被丰富为:
    在这里插入图片描述

  • 接下来就是按照不同的三角形种类来划分等价类了,这非常直觉:

    • 对于等边三角形:
      在这里插入图片描述
    • 对于等腰三角形应该有 3 个不同的等价类(其实相当于一种,因此可以写成一个等价类): x = y ≠ z   O R   x = z ≠ y   O R   z = y ≠ x x=y≠z ~OR ~x=z≠y ~OR ~z=y≠x x=y=z OR x=z=y OR z=y=x
    • 对于其他类型的三角形则是三边都不等 x ≠ y ≠ z x≠y≠z x=y=z
  • 对于 invalid 的三角形,应该是以下六类:
    在这里插入图片描述

  • 当然上面的等价类都有重叠:
    在这里插入图片描述

  • 对于每一个不同的等价类都找一个 test case

  • 但这样随机从等价类中选一个值并不是最优的方法,因为很有可能存在那种 coincidental correct,但是测试人员对此并不知情

  • 很直觉的方法是从一个等价类中选择多个 test cases,但这会让 test suites 的规模变大

  • boundary value analysis 是一种比 equivalence partitioning 更好的办法,但对 平方函数 中的那种 coincidental correct 也无效

在这里插入图片描述

  • GetWord函数必须接受一个字符串,并返回两个项目:

    • (1)字符串中的第一个单词;
    • 和(2)删除了第一个单词后的字符串。
  • 单词被认为是不包含空白字符的一串字符。

  • 单词之间的空白字符可以是空格、制表符或换行符。

  • 字符串长度最长为200个字符。
    在这里插入图片描述

  • 等价划分只需要指定程序来推导测试用例。这使得它非常适合 系统级测试和集成级测试。

  • 由于此函数只能接受 200 个字符以内的输入,因此可以使用 range guideline :在这里插入图片描述

  • 由于输入是一个字符串,而且 specification 中提到,切分完的字符串要具备一系列条件,因此我们可以将字符串的 EC 进行细分:
    在这里插入图片描述

  • 同样的,等价类之间也存在重叠,因此最后三个是可以一定程度合并的,所以可以有下面的测试用例:
    在这里插入图片描述

Test Template Trees

  • 相比于 等价类划分,使用这种树的方式是一种更加结构化的方法,可以在开始的时候就避免引入 overlapping
    在这里插入图片描述

start:从 testable input domain 开始

  • 从可测试的输入域开始,并旨在将其分解为更小的等价类,以便进行良好的测试。

repeat

  • 每个步骤中,我们选择一个等价划分准则来应用于测试模板树中的一个或多个叶节点将叶节点分解为多个新的叶节点,每个新的叶节点比其父节点更具体,并且不再是一个叶节点。
    在这里插入图片描述
  • 当我们对每个叶节点进行分区时,我们确保分区是:
    • (a)不相交的-分区不重叠;和
    • (b)它们的父节点被其子节点所覆盖

End

当满足以下条件之一时,该过程结束:

  • (a) 没有更多合理的分区可应用;
  • 或者 (b) 我们的树变得太大,无法再管理复杂性(尽管我们很快将讨论如何缓解这个问题)。

Result

  • 构建等价类时,我们只需取每个叶节点,并从该叶节点到树的根派生出等价关系。
    在这里插入图片描述
    在这里插入图片描述

缓解 tree 爆炸的问题

  • 只对无效、异常和错误情况进行一次测试: 由于许多程序使用防御性编程,一旦检测到错误或异常输入,程序往往会立即抛出错误或异常,并停止进一步执行。因此,对于引发异常的输入,进一步细分并测试正常情况下的功能是不太可能发现更多错误的,因为异常输入导致的错误或异常往往发生在程序的前端,所以程序的后续部分并不会执行。简而言之,对于会立即引发异常的输入,进行多个正常情况下的功能测试是不必要的,因为它们不会触发程序的其他部分,也就不会发现额外的错误。
  • 重点考虑变量之间的相互作用: 在应用等价划分原则时,应当基于经验和直觉,选择那些涉及变量相互作用可能性的当前叶节点进行细分。以图书馆借阅系统为例,系统输入包括借出日期、借阅时长、书籍/DVD名称、作者等。借出日期和借阅时长之间存在明显的相互作用,因为它们共同决定了归还日期。而书名和作者与归还日期(可能)无关。因此,在测试借阅时长的不同值时,应该优先考虑与借出日期相关的节点,而不是书名和作者。**这样做可以减少需要应用的划分数量,**从而避免测试用例数量爆炸性增长的问题。

Combining partition 组合分区

  • 当对程序的多个变量应用不同的标准时,很容易生成 重叠的等价类。举例来说,如同在之前例子中提到的三角形程序测试中,通过对三个不同变量应用两种不同标准,生成了六个表示无效三角形的重叠等价类。在这里插入图片描述
    如果尝试移除这些重叠的情况,将产生大量的测试用例因为我们需要对重叠的等价类进行进一步细分,这个过程产生很多 test cases),其中许多可能并不实用。举例来说,其中的三个测试案例可能如下:
    在这里插入图片描述
  • 这些中的粗体表示使三角形 invalid 的值
  • 虽然看起来是三个不同的等价类,但其实有冗余,因为对于第三个 EC 来说,程序顺序执行,当检测到 x < = 0 x<=0 x<=0 其实就已经无效了,这个结果跟 case1 是一样的,所以是冗余的
  • 冗余不是唯一的问题。如果我们考虑在三个不同变量上使用分区方法,一个具有非负整数域(变量x),一个具有非正整数域(变量y),以及一个具有字符z域,我们可能会得到以下分区:
    在这里插入图片描述
  • Ammann和Offutt将这些块组合称为**“block combinations”,因为尽管等价类有重叠,但存在着某种不同的独特块**。在上述情况中,这些块是基于变量的,并且每个变量都有对应的等价类。
  • 当我们组合变量时,会遇到重叠。问题是如何解决重叠,以免产生过多的测试用例。我们提出了三个不同的准则来解决这个问题:全组合准则 (all combinations)、两两组合准则 (pair-wise combination)和每项选择组合准则 (each choice combination)。

All Combinations

  • 全组合准则指定必须使用每个块之间的等价类的所有组合。这类似于集合的笛卡尔积。因此,如果我们考虑具有输入x、y和z的程序,则我们需要18个测试用例:
    在这里插入图片描述
  • 测试用例的数量是每个块中的 block 数和 EC 数的乘积。在这种情况下,它与变量的数量以及每个变量的等价类别数有关。因此,如果有两个额外的变量,每个变量都有三个等价类别,则测试用例的数量将为 3 ∗ 2 ∗ 3 ∗ 3 ∗ 3 = 162 3*2*3*3*3=162 32333=162 test cases.
    在这里插入图片描述

Each Choice Combinations

  • 每个选择准则指定只能从每个等价类中选择一个测试用例。这是我们在示例14中对三角形程序进行测试时采取的方法。 以三变量程序为例,每个选择准则可以通过选择满足以下三个等价类的输入来满足
    在这里插入图片描述

Pair-Wise Combinations

  • 配对组合准则旨在将值进行组合,但不是对所有可能的组合进行详尽枚举。顾名思义,每个块中的等价类必须与其他所有块中的每个等价类配对。

  • 在我们上面的例子中,这意味着我们必须有测试用例来满足以下21种配对组合:
    在这里插入图片描述
    在这里插入图片描述

  • 然而,一个单独的测试输入可以涵盖其中多个。例如,测试输入:
    在这里插入图片描述

  • 考虑到这一点,我们可以选择只满足九个等价类的测试用例;以下是其中三个:
    在这里插入图片描述

简单总结

  1. input partitioning 分为 domain testing (白盒测试,主要注重边界情况) 和 equivalence partitioning (黑盒测试方法)
  2. 当等价类划分有重叠的情况,有两种方法:
    • 将重叠的等价类部分单独构建等价类
    • 采用 combining partition 的方法
      单独将重叠的等价类划分出来通常并不是最好的做法,因为这会导致测试用例的数量急剧增加,许多测试用例可能会对相同的代码路径进行测试,从而浪费资源。相反,更有效的方法是进行合并分区(combining partitioning)。
  • 合并分区(三种方法)的好处在于:
    • 减少测试用例数量: 通过合并重叠的等价类,可以减少测试用例的总数,因为不必为每个可能组合都创建一个单独的测试用例。
    • 增加测试效率: 避免重复测试相同的条件或代码路径,这使得测试过程更加高效。
    • 更全面的覆盖: 通过合并,可以确保测试用例涵盖了所有重要的边界条件和异常路径,而不是仅仅因为重叠而多次测试相同的路径。

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

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

相关文章

curl(七)上传和下载

一 上传 ① -T | --upload 上传 ​1、向ftp服务器 传一个文件&#xff1a;curl -T localfile -u name&#xff1a;passwd ftp://upload_site&#xff1a;port/path/2、向http服务器上传文件curl -T localfile http://www.wzj.com/wzj.html注意: 这时候使用的协议是HTTP的PUT…

全球首款双模型AI手机METAVERTU2,为用户开发“第二大脑”

在2023年11月1日&#xff0c;英国奢侈手机品牌VERTU在香港举办了一场新品发布会&#xff0c;它推出了一款全新的AI手机称为METAVERTU2&#xff0c;这是全球首款双模型AI手机。此款手机将Web3技术与人工智能相结合&#xff0c;通过AI模型标记数据和AI Agent的方式&#xff0c;将…

在线安装Arthas以及常用命令介绍

Arthas介绍&#xff1a;arthas(阿尔萨斯)是阿里巴巴开源的一款 Java 诊断工具&#xff0c;它可以对运行中的 Java 程序进行实时监控和故障排查。Arthas 提供了丰富的功能&#xff0c;如线程分析、内存分析、类加载分析等&#xff0c;帮助开发者快速定位问题并提高开发效率。 主…

自动控制原理答案

题目 现有一个单位反馈系统的开环传递函数为 试对该系统进行以下分析。 1.基础分析 计算该系统的闭环传递函数。 2.稳定性分析 2.1 使用劳斯判据分析该系统的稳定性 2.2 使用MATLAB编程&#xff0c;计算该系统有关于稳定性分析的零、极点&#xff0c;分析其稳定性。 3.暂态性…

性能测试知多少---吞吐量

我们每天的生活中都在用水用电&#xff0c;我只会关心自己的水管是否有水&#xff0c;水压是否稳定&#xff0c;如果我们把水龙头拧到最大&#xff0c;还是一滴一滴的流水。那我们就要愤怒了&#xff0c;直接找房东问明情况。我们从来没想过去找自来水公司。我们每天都会上网&a…

【原创】java+swing+mysql宠物领养管理系统设计与实现

摘要&#xff1a; 生活中&#xff0c;有很多被人遗弃的宠物&#xff0c;这些宠物的处理成为了一个新的难题。生活中也有许多人喜欢养宠物&#xff0c;为了方便大家进行宠物领养&#xff0c;提高宠物领养管理的效率和便利性。本文针对这一问题&#xff0c;提出设计和实现一个基…

Matlab上机三(Apriori算法)

1、题目要求 &#xff08;1&#xff09; 读取给定的交易数据库test3.txt&#xff0c;将整个交易数据库表示为一个矩阵&#xff0c;每个元组表示成一个行向量&#xff0c;向量长度为4。其中&#xff0c;一个项目出现在这个元组中&#xff0c;则相应位置设为1&#xff0c;否则为…

比亚迪被曝 24 小时收到 12 万份简历?

众所周知&#xff0c;今年找工作的难度都相当大&#xff0c;不论是应届毕业生还是经验丰富的职场人士&#xff0c;都面临相同的困境。然而&#xff0c;没想到情况居然如此糟糕&#xff0c;着实让人震惊。 最近&#xff0c;比亚迪公司被曝收到了12万份简历&#xff0c;简历投递…

深度学习框架TensorFlow.NET环境搭建1(C#)

测试环境 visual studio 2017 window10 64位 测试步骤如下&#xff1a; 1 新建.net framework控制台项目&#xff0c;工程名称为TensorFlowNetDemo&#xff0c;.net framework的版本选4.7.2&#xff0c;如下图&#xff1a; 2 分别安装TensorFlow.NET包(先装)和SciSharp.…

分治法——找众数

分治法——找众数 要求&#xff1a; 寻找整数数组的众数&#xff0c;如果存在多个众数&#xff0c;则返回权值最小的那个 第一步&#xff1a; 要利用分治法找众数&#xff0c;首先就先要使数组有序。这里&#xff0c;我们用C语言库中的qsort进行快排&#xff1a; qsort(nums…

Verilog HDL语言基础知识

目录 Verilog HDL语言基础知识 6.1.2 Verilog HDL模块的结构 6.1.3 逻辑功能定义 6.2.1 常量 6.3 运算符及表达式 6.4.2 条件语句 Verilog HDL语言基础知识 先来看两个Verilog HDL程序。 例6.1 一个8位全加器的 Verilog HDL源代码 module adder8(cout,sum,ina,…

如何用 GPT-4 全模式(All Tools)帮你高效学习和工作?

「十项全能」的 ChatGPT &#xff0c;用起来感受如何&#xff1f; 之前&#xff0c;作为 ChatGPT Plus 用户&#xff0c;如果你集齐下面这五个模式&#xff0c;就会成为别人羡慕的对象。 但现在&#xff0c;人们更加期盼的&#xff0c;是下面这个提示的出现&#xff1a; 这个提…

Python---字符串中的count()方法

count()方法 主要功能&#xff1a;求子串在字符串中出现的次数 count 英 /kaʊnt/ v. &#xff08;按顺序&#xff09;数数&#xff1b;计数&#xff0c;点数目&#xff1b;把……算入&#xff0c;包括&#xff1b;重要&#xff1b;被允许&#xff0c;被接受&#xff1b;…

项目实战:新增@RequestMapping和@GetMapping和@PostMapping三个注解

1、RequestMapping package com.csdn.mymvc.annotation; import java.lang.annotation.*; Target(ElementType.TYPE) Retention(RetentionPolicy.RUNTIME) Inherited public interface RequestMapping {String value(); }2、PostMapping package com.csdn.mymvc.annotation; im…

Java自学第5课:Java web开发环境概述,更换Eclipse版本

1 Java web开发环境 前面我们讲了java基本开发环境&#xff0c;但最终还是要转到web来的&#xff0c;先看下怎么搭建开发环境。 这个图就是大概讲了下开发和应用环境&#xff0c;其实很简单&#xff0c;对于一台裸机&#xff0c;win7 系统的&#xff0c;首先第1步&#xff0c;…

Makefile初识

目录 0.前期准备0.1、程序编译链接&#xff1a; 1.Makefile基础1.1、认识Makefile1.2、Makefile定义模式&#xff1a;(1) 定义模式&#xff1a;(2) 执行Makefile&#xff1a; 1.3、Makefile的变量(1) 变量定义&#xff1a;(2) **变量的赋值符**:(3) 自动化变量 1.4 伪目标1.5 文…

【C++】特殊类设计+类型转换+IO流

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

【QT5之QFtp模块】编译及使用

下载 传送门&#xff1a;https://github.com/qt/qtftp 或者 git clone https://github.com/qt/qtftp.git 下载ZIP&#xff0c;解压待用。 编辑 使用QtCreator打开qtftp.pro; 修改如下&#xff1a; qtftp.pro中&#xff0c;将第21行注释; src/qftp.pro中&#xff0c;将第4行…

JavaEE-博客系统3(功能设计)

本部分内容为&#xff1a;实现登录功能&#xff1b;强制要求用户登录&#xff1b;实现显示用户信息&#xff1b;退出登录&#xff1b;发布博客 该部分的后端代码如下&#xff1a; Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws Ser…

微服务之初始微服务

文章目录 一、服务架构演变1.单体架构2.分布式架构 二、认识微服务三、总结四、微服务技术对比五、SpringCloud注意 一、服务架构演变 1.单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;打成一个包部署。 优点&#xff1a; 架构简单部署成本…