3-6白盒测试_条件组合覆盖

合集下载

白盒测试的六种方法题目

白盒测试的六种方法题目

白盒测试的六种方法白盒测试是一种测试方法,旨在检查软件系统内部结构和代码的正确性。

与黑盒测试不同,白盒测试需要了解软件的内部工作原理,以便更加充分地测试系统功能。

在进行白盒测试时,有多种方法可供选择,以下将介绍其中的六种常用方法。

1. 语句覆盖语句覆盖是一种基本的白盒测试方法,旨在确保每个代码语句都被执行到。

测试用例应该被设计成覆盖代码中的每一行代码,以确保系统的每个语句都能够正确执行。

2. 判定覆盖判定覆盖是一种更加严格的测试方法,要求每个条件语句的所有可能结果都被覆盖。

测试用例应该覆盖每个条件语句的每个可能情况,包括真和假。

3. 分支覆盖分支覆盖是一种测试方法,要求每个条件语句的每个分支都被覆盖。

测试用例应该覆盖每个条件语句可能的每个分支路径,以确保系统的每个分支都被正确执行。

4. 路径覆盖路径覆盖是一种更加细致的测试方法,要求覆盖每个代码路径。

测试用例应该覆盖系统中的每个可能路径,以确保系统在各种情况下能够正确执行。

5. 条件组合覆盖条件组合覆盖是一种测试方法,要求覆盖不同条件的各种组合情况。

测试用例应该覆盖系统中每个条件之间的各种组合,以确保系统能够正确处理多个条件的情况。

6. 条件-决策覆盖条件-决策覆盖是一种测试方法,要求覆盖每个条件的真和假以及影响程序流程的相应决策。

测试用例应该覆盖每个条件的各个取值,以确保系统在各种情况下都能够正确执行相关决策。

以上是白盒测试的六种常用方法,通过采用这些方法,可以更全面地测试软件系统的内部结构和代码,确保系统的正确性和稳定性。

在实际测试过程中,测试人员可以根据实际情况选择合适的方法或综合运用多种方法,以达到更好的测试效果。

白盒测试语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖(转)

白盒测试语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖(转)

⽩盒测试语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖(转)转⾃:⽩盒作为测试⼈员常⽤的⼀种测试,越来越受到测试⼯程师的重视。

⽩盒测试并不是简单的按照⽤例,⽽是需要根据不同的测试,结合不同的测试对象,适合的⽅法进⾏测试。

因为对于不同复杂度的代码逻辑,可以衍⽣出许多种执⾏路径,只有适当的测试⽅法,才能帮助我们从代码的迷雾森林中找到正确的⽅向。

本⽂介绍六种⽩盒⼦测试⽅法:语句覆盖、判定覆盖、条件覆盖、判定条件覆盖、条件组合覆盖、路径覆盖。

⽩盒测试的概述 由于逻辑错误和不正确假设与⼀条路径被运⾏的可能性成反⽐。

由于我们经常相信某逻辑路径不可能被执⾏, ⽽事实上,它可能在正常的情况下被执⾏。

由于代码笔误是随机且⽆法杜绝的,因此我们要进⾏⽩盒测试。

⽩盒测试⼜称结构测试,透明盒测试、逻辑驱动测试或代码的测试。

⽩盒测试是⼀种测试⽤例设计⽅法,盒⼦指的是被测试的,⽩盒指的是盒⼦是可视的,你清楚盒⼦内部的东西以及⾥⾯是运作的。

⽩盒的测试⽤例需要做到: ·保证⼀个模块中的所有独⽴路径⾄少被使⽤⼀次 ·对所有逻辑值均需测试 true 和 false ·在上下边界及可操作范围内运⾏所有循环 ·检查内部结构以确保其有效性 ⽩盒测试的⽬的:通过检查软件内部的逻辑结构,对软件中的逻辑路径进⾏覆盖测试;在程序不同地⽅设⽴检查点,检查程序的状态,以确定实际运⾏状态与预期状态是否⼀致。

⽩盒测试的特点:依据软件设计说明书进⾏测试、对程序内部细节的严密检验、针对特定条件设计测试⽤例、对软件的逻辑路径进⾏覆盖测试。

⽩盒测试的步骤: 1.测试计划阶段:根据需求说明书,制定测试进度。

2.测试设计阶段:依据程序设计说明书,按照⼀定规范化的⽅法进⾏软件结构划分和设计测试⽤例。

3.测试执⾏阶段:输⼊测试⽤例,得到测试结果。

4.测试总结阶段:对⽐测试的结果和代码的预期结果,错误原因,找到并解决错误。

白盒测试中的路径覆盖与条件覆盖

白盒测试中的路径覆盖与条件覆盖

白盒测试中的路径覆盖与条件覆盖白盒测试是软件开发中常用的一种测试方法,通过深入了解软件的内部结构和代码逻辑,对各个路径和条件进行覆盖,以发现潜在的错误和漏洞。

其中,路径覆盖和条件覆盖是两种常见的测试覆盖准则。

本文将详细介绍白盒测试中的路径覆盖与条件覆盖的概念和作用。

一、路径覆盖路径覆盖是一种测试准则,通过测试用例执行软件的各个路径,并确保每个路径都至少执行一次,以实现对软件的全面覆盖。

路径覆盖可以帮助发现程序中可能存在的逻辑错误、分支错误和数据依赖关系错误,从而提高软件的质量和稳定性。

路径覆盖的实施需要深入了解软件的结构,通过代码分析和路径追踪技术来确定程序中的所有可行路径,并根据路径构造相应的测试用例。

在执行测试用例的过程中,需要记录已经覆盖过的路径,以确保每个路径至少被执行一次。

路径覆盖的具体实施步骤如下:1. 对软件进行静态代码分析,了解软件结构和路径逻辑;2. 根据代码结构确定程序中的所有可行路径;3. 根据路径设计测试用例,确保每个路径都得到覆盖;4. 执行测试用例,记录已经覆盖过的路径;5. 分析测试结果,查找潜在的错误和问题。

路径覆盖可以有效发现软件中可能存在的错误和漏洞,但其缺点是覆盖路径较多,测试用例设计和执行过程比较繁琐,需要耗费较多的时间和资源。

二、条件覆盖条件覆盖是一种测试准则,目标是覆盖软件中各个条件的不同取值情况,以验证程序在不同条件下的行为和功能。

条件覆盖可以帮助发现程序在不同条件下可能存在的逻辑错误、边界错误和数据处理错误,从而提高软件的可靠性和稳定性。

条件覆盖的实施需要深入了解软件的条件逻辑,并设计测试用例覆盖各个条件的不同取值情况。

在执行测试用例的过程中,需要记录已经覆盖过的条件和取值,以确保每个条件都得到覆盖。

条件覆盖的具体实施步骤如下:1. 对软件进行静态代码分析,了解软件的条件逻辑;2. 根据条件逻辑设计测试用例,确保每个条件的不同取值情况都得到覆盖;3. 执行测试用例,记录已经覆盖过的条件和取值;4. 分析测试结果,查找潜在的错误和问题。

白盒测试的条件覆盖测试所有可能的条件情况

白盒测试的条件覆盖测试所有可能的条件情况

白盒测试的条件覆盖测试所有可能的条件情况白盒测试是软件测试中一种关注程序内部结构和逻辑的测试方法。

在进行白盒测试时,需要覆盖测试所有可能的条件情况,以确保程序的各个分支和逻辑路径都得到有效的测试。

本文将介绍白盒测试中的条件覆盖测试以及如何进行全面的条件覆盖。

一、什么是条件覆盖测试条件覆盖测试是一种测试方法,旨在测试程序中的所有条件语句。

条件语句是根据不同条件的结果(true或false)来执行不同操作的语句。

条件覆盖测试的目标是测试每个条件的每种可能的结果,以确保程序在不同条件下的正确性。

条件覆盖测试可以分为以下几种类型:1. 判定覆盖(Decision Coverage):测试至少执行一次每个判定的两个结果,即真和假。

2. 条件覆盖(Condition Coverage):测试每个条件的两种可能取值(true和false)。

3. 条件组合覆盖(Condition Combination Coverage):测试每个条件的所有可能组合情况。

二、条件覆盖测试的重要性条件覆盖测试对于发现程序中的逻辑错误以及漏洞非常重要。

通过测试每个条件的各种情况,可以确保程序在各种可能条件下都能正确运行。

条件覆盖测试还可以帮助测试人员理解程序的逻辑流程,并发现潜在的错误路径。

三、如何进行条件覆盖测试要进行条件覆盖测试,需要按照以下步骤进行:1. 确定测试对象:确定要进行测试的软件模块或功能。

2. 定义条件:根据程序的逻辑结构,确定需要测试的条件语句。

3. 列举条件情况:对于每个条件,列举出所有可能的情况。

例如,如果条件是一个布尔变量,那么可能的情况是true和false;如果是一个数值变量,可能的情况包括大于、等于和小于等。

4. 设计测试用例:根据列举的条件情况,设计测试用例,以覆盖所有可能的情况。

5. 执行测试用例:按照设计的测试用例,执行测试。

6. 检查测试结果:检查测试结果,验证程序在不同条件下的行为是否符合预期。

白盒测试的主要方法

白盒测试的主要方法

二、 基本路径测试
基本路径测试就是在程序控制图的基础 上,通过分析控制构造的环行复杂性,导 出基本可执行路径集合,从而设计测试用 例的方法。设计出的测试用例要保证在测 试中程序的每一个可执行语句至少执行一 次。
基本路径测试-----步骤
1. 导出程序的控制流图
2. 计算程序环路复杂度:确定程序中每个可执
白盒测试的主要方法
语句覆盖 判定覆盖 条件覆盖 判定/条件覆盖 条件组合覆盖 路径覆盖 基路径测试 循环测试
逻辑覆盖
路径测试
数据流测试 其他白盒测试方法
一、 逻辑覆盖
• 1、语句覆盖:语句覆盖就是设计若干个测试用 例,运行被测试程序,使得每一条可执行语句 至少执行一次 • 2、判定覆盖(也称为分支覆盖):设计若干个 测试用例,运行所测程序,使程序中每个判断 的取真分支和取假分支至少执行一次;
条件组合覆盖
• 它的含义是:设计足够的例子,使得每个
判定中条件的各种可能组合都至少出现一 次。显然,满足“条件组合覆盖”的测试 用例是一定满足“判定覆盖”、“条件覆 盖”和“判定/条件覆盖”的。
例题1
编号 1 2 3
4 5 6 7 8
具体条件取值 a>1,b=0 a>1,b<>0 a<=1,b=0
① A=3,B=0,X=1 (沿路径acd执行); ② A=2,B=1,X=3(沿路径abe执行)
判定覆盖
A=3,B=0,X=1 (沿路径acd 执行) A=2,B=1,X=3 (沿路径abe 执行)
例题2
判定覆盖
往往大部分的判定语句是由多个逻辑条
件组合而成,若仅仅判断其整个最终结果, 而忽略每个条件的取值情况,必然会遗漏 部分测试路径 。

白盒测试--条件判定覆盖和修正条件判定覆盖的差异

白盒测试--条件判定覆盖和修正条件判定覆盖的差异

⽩盒测试--条件判定覆盖和修正条件判定覆盖的差异1 简介⽂章的⽬的在于通过⽐较发现条件判定覆盖(即Condition/Decision Coverage C/DC)和修正条件判定覆盖(Modified Condition/Decision Coverage即MC/DC)的差异.软件测试是⼀项⼤型的软件⼯程中必不可少且⾮常重要的⼀部分,软件测试使⽤两种测试⽅法:静态测试和动态测试.静态测试是指不⽤执⾏程序的测试,它主要采取⽅案——代码⾛查、技术评审、代码审查的⽅法对软件产品进⾏测试;⽽动态测试是指实际运⾏程序,并通过观察程序运⾏的实际结果来发现错误的软件测试技术,它分为⿊盒测试和⽩盒测试.⿊盒测试是在不知道程序内部结构,只知道程序规格的情况下采⽤的测试技术或策略;⽽⽩盒测试是⼀种在知道程序内部结构的情况下采⽤的测试技术或策略,就是要选取⾜够的测试⽤例,对源代码实现⽐较充分的覆盖,以便尽可能多地发现程序中的错误.它包括逻辑覆盖法和路径测试法的两种技术.C/DC和MC/DC就是⽩盒测试⽅法中的逻辑覆盖⽅法中的两个成员.⽬前这两种⽅法在软件测试中被⼴泛应⽤,尤其是MC/DC更是被很多⼤型软件测试(如飞⾏控制软件的测试)所应⽤2 对C/DC和MC/DC的描述2.1 C/DC的定义C/DC是Condition/Decision Coverage的缩写,含义是条件判定覆盖.对它的定义为:Condition/Decision Coverage——it combines the requirements for decision coverage with those for condition coverage.That is,there must be suficient test cases to toggle the decision outcome between true and false and to toggle each condition value between true and false.例如:if A and (B or C) then⋯ else⋯测试这条语句使⽤C/DC⽅法可以从表l(具有3个条件的真值表)中选择它的测试集为{ TTF,FFT},分析如下:当,B和C的值依次分别取T,T,F时判定A and (B or C)的值为T;当将A,B和C的值依次分别取F,F,T时,判定A and (B or C)的值为F;在测试中,3个条件A,B,C的所有可能取值T、F,都被测试,⽽判定 A and (B or C)的所有可能取值T和F也都被执⾏了⼀次,由此说明此测试集满⾜C/DC⽅法的要求,是C/DC⽅法的其中⼀个测试集合.2.2 MC/DC的定义MC/DC是Modified Condition/Decision Coverage(MC/DC)的缩写,含义是修正条件判定覆盖.对它的定义为:Condition —— a Boolean expression containing no Boolean operators:Decision —— a Boolean expression composed of conditions and zero or more Boolean operators:Modified Condition/Decision Coverage —— every point of entry and exit in the program has been invoked at least once,every condition in the program has taken all possible outcomes at least once,and each condition in a decision has been shown to independently affect a decision S outcome by varying just that condition while holding fixed all other possible conditions.由上可知:在MC/DC这种测试⽅法中,条件表⽰不含有布尔操作符号的布尔表达式;判定表⽰由条件和零或者很多布尔操作符号所组成的⼀个布尔表达式;⽽修正条件判定覆盖⽅法要求在⼀个程序中每⼀种输⼊输出⾄少得出现⼀次,在程序中的每⼀个条件必须产⽣所有可能的输出结果⾄少⼀次,并且每⼀个判定中的每⼀个条件必须能够独⽴影响⼀个判定的输出,即在条件不变的前提下仅改变这个条件的值,⽽使判定结果改变.与上⽂同样的例⼦:if and (B or C) then⋯ else⋯这条语句,A and (B or C)是⼀个判定,A,B,C均为条件,使⽤MC/DC⽅法找出分别对应此3个条件的测试集中有4组元素为:{TTF, F,TFT,FFT}.⽅法如下:测试元素均从表1中选取,保持A和B的值不变测试元素TFF和TFT可以改变C条件的值和整个表达式的结果(F变成了T);⽽保持A和C的值不变测试元素TTF和TFT可以改变B条件的值和整个表达式的执⾏结果(T变成了F);⽽当保持B和C的值不变测试元素TFT和FFT可以改变A条件的值和整个表达式的执⾏结果(T变成了F).这个测试集完全满⾜MC/DC的要求即当锁定的条件保持不变,⽽改变判定中⼀项条件的值,必然引起整个表达式执⾏的变化.3 C/DC和MC/DC之间的差异3.1选取两种⽅法的条件不同当以下的需求在程序测试中遇到时,需要考虑⽤MC/DC⽅法:每⼀个程序模块的输⼊和输出点都要考虑⾄少出现1次,每个程序的判定到所有可能的结果值要⾄少实现1次;程序的判定被分解为通过逻辑操作符(AND,OR,etc.)连接为BOOL条件,每⼀个条件对于判定的结果值是独⽴的,或者说单个条件的变化将导致判定的最后变化.⽽对于C/DC⽅法⽽⾔,在程序需要测试时,由于它只要求“判定中每个条件的所有可能取值⾄少执⾏⼀次,同时每个判定的所有可能判定结果⾄少执⾏⼀次”,要求⽐较简单,所以它可以与其他覆盖⽅法⼀样适合于使⽤在绝⼤多数的程序的测试中.3.2 两者的测试集不同The MC/DC criterion enhances the condition/decision coverage criterion by requiring that each condition be shown to independently affect the outcome of the decision.MC/DC⽅法虽是在C/DC⽅法上的改进,但是两者在寻找测试集时是不同的,原因在于MC/DC⽅法要求对于判定中的所有条件当固定其他条件的值时每⼀个已选定的条件必须能够独⽴地影响⼀个判定的输出.在以上的举例中:if A and (B or C) then⋯else⋯这条语句上⽂已找出⽤C/DC⽅法其⼀个测试集合为{TTF,FFT},同时如果采⽤MC/DC⽅法其测试集合可为{TTF,TFF,TFT,FFT}.对⽐两个测试集可发现测试集中的元素是不同的,⽽且元素组数也是不同(C/DC⽅法有2组,MC/DC⽅法有4组).原因是:对于C/DC⽅法来说,不管条件个数有多少,⼀个测试集中的元素组数最少可以为2个.推导如下:各个条件的取值只有两种T,F,从每个条件的取值中取出⼀个将它们组合起来形成⼀组元素,并使得这组元素分别⼀⼀对应相应条件⽽代⼈整个判定得出的最后结果值为T;然后从剩下的各个条件的取值中组合形成另⼀组元素并使得元素中的各个值分别对应相应条件代⼈整个判定后能使表达式的结果值为F(这两种情况是⼀定可以从真值表中找到的),这样就达到了C/DC取测试集的要求,即各个条件的可能取值T和F都必须取到,且判定结果的可能取值T,F也必须实现.⽽另外对于MC/DC ⽅法来说如果在⼀个表达式中N个条件只出现⼀次,那么⼀个测试集中的元素组数为N+1个.这句话说明测试集中的元素组数与表达式中的条件个数有关.3.3两者在测试中的覆盖⾯不同对于MC/DC⽅法,它的覆盖⾯是要⼤于C/DC⽅法的,也就是指在测试⼀个程序或⼀个软件时,MC/DC能⽐C/DC找到更多的错误之处,原因就在于MC/DC的测试集检测出错误发⽣的概率⽐较⾼.再举⼀个很简单的例⼦:对于这条If A or B then⋯ else⋯语句,由⽂章的前部可知使⽤C/DC⽅法它的测试集可为{TT,FF};可是如果在这条语句中的操作符号是笔误(由and⼀时⼤意写成了or ),那么即使采⽤了{TT,FF}来测试仍然检测不到错误(因为T and T = T or T,且F and F = F or F,即⽆论将测试集中的哪组元素代⼈到两个判定中⋯ V ⋯,⋯ ^ ⋯,两者所得到的判定结果相同),由此可说明虽然使⽤了判定条件覆盖(C/DC)准则来测试语句,逻辑表达式中的有些错误仍然不能检测出来;可是如果⼤家⽤MC/DC⽅法,由它的规则可得测试集合为{FF,TF,FT },只需使⽤其中的⼀组数据TF,就可知道其中发⽣了错误.原因是:T or F值为T,⽽ T and F值为F,T and F语句的判定结果本来应该得到F却得到了T,由此可说明中间的操作符号发⽣了错误,这样就检测到了错误.所以这个例⼦说明MC/DC的测试集合的覆盖⾯要⼤于C/DC⽅法,若⽤户对于测试程序的质量要求较⾼,⽽不考虑其他因素,那么可以使⽤MC/DC的⽅法来测试⾃⼰的⼤型软件或单个程序.3.4两者的⽤途不同由于MC/DC在寻找测试集时的要求⽐C/DC要严格,所以相⽐较下在测试时为了寻找出测试集合所花费的时间多,由此⽽引起的⼈⼒、物⼒、财⼒三重开销也会直接攀升,但是MC/DC测试错误的准确率却是特别地⾼,因此MC/DC适合那些⼤型的并且要求测试⾮常精确的软件测试所⽤.为达到⽤户的⽬的和⼀个较⾼的信价⽐,近年来MC/DC⽅法主要应⽤于⼤型的航空航天软件程序的测试上.对⽐⽽⾔C/DC⽅法要求较低,开销少,⽽覆盖率也低,所以⽐较适合对于例如C++,JAVA等⼩型的程序的}贝4试当中使⽤,这正是因为⼩型程序所拥有的项⽬经费较少、语句代码少则导致相应地寻找错误也⽐较容易.此时使⽤C/DC⽅法⾜以测试软件.4总结本⽂介绍了条件判定覆盖和修正条件判定覆盖两个测试⽅法的定义和使⽤,并且通过⽐较分析出两者之间所存在的差异.⽬前,在市场上,C/DC和MC/DC两种测试⽅法被社会⼴泛应⽤,但是由于两者的各个不同点,⽤户必须根据软件⾃⾝测试时能给出的条件及软件测试所需要达到的程度选择使⽤适当的测试⽅法.。

白盒测试逻辑覆盖练习题

白盒测试逻辑覆盖练习题

白盒测试逻辑覆盖练习题一、语句覆盖if (a > 0 && b > 0) {c = a + b;} else {c = 0;}def check_age(age):if age < 18:return "未成年"elif age >= 18 and age < 60:return "成年人"else:return "老年人"二、分支覆盖if (x > 0) {if (y > 0) {printf("第一象限");} else {printf("第四象限");}} else {if (y > 0) {printf("第二象限");} else {printf("第三象限");}}function calculateGrade(score) {if (score >= 90) {return 'A';} else if (score >= 80) {return 'B';} else if (score >= 70) {return 'C';} else {return 'D';}}三、路径覆盖public int calculate(int a, int b) { if (a > 0) {if (b > 0) {return a + b;} else {return a b;}} else {if (b > 0) {return b a;} else {return 0;}}}public int Max(int a, int b, int c) { if (a > b) {if (a > c) {return a;} else {return c;}} else {if (b > c) {return b;} else {return c;}}}四、条件覆盖def check_password(password):if len(password) >= 8 and any(char.isdigit() for char in password):return "密码强度高"else:return "密码强度低"function validateForm(username, password) {if (username.length > 0 && password.length > 0) { return true;} else {return false;}}五、判定条件覆盖public boolean isEligible(int age, boolean hasLicense) {if (age >= 18 && hasLicense) {return true;} else {return false;}}int isPrime(int num) {if (num <= 1) {return 0;}for (int i = 2; i < num; i++) {if (num % i == 0) {return 0;}}return 1;}六、多条件覆盖public string GetGrade(int score, bool isFinalExam) { if (score >= 90 || (isFinalExam && score >= 80)) { return "A";} else if (score >= 80 || (isFinalExam && score >= 70)) {return "B";} else if (score >= 70 || (isFinalExam && score >= 60)) {return "C";} else {return "D";}}return "Eligible";} else {return "Not Eligible";}}七、条件组合覆盖def check_login(username, password, is_admin):if (username == "admin" or username == "user") and password == "56" and not is_admin:return "User logged in";elif (username == "admin" and is_admin) and password == "admin123":return "Admin logged in";else:return "Invalid credentials";public String authenticate(String username, String password, boolean hasTwoFactor) {if (username.equals("admin") &&password.equals("admin123") && hasTwoFactor) {return "Admin access granted";} else if (username.equals("user") &&password.equals("user123") && !hasTwoFactor) {return "User access granted";} else {return "Access denied";}}八、路径条件覆盖void processOrder(int quantity, float discount) {if (quantity > 10) {if (discount < 0.1) {printf("Order processed with standard discount");} else {printf("Order processed with special discount");}} else {printf("Order processed without discount");}}function calculateTotal(price, isMember, hasCoupon) { let total = price;if (isMember) {total = 0.9; // 10% discount for members}if (hasCoupon) {total = 0.95; // Additional 5% discount for coupon}return total;}九、修改条件/判定覆盖def upgrade_account(user_type, points):if user_type == "basic" and points >= 100:return "Upgrade to premium"elif user_type == "premium" and points >= 200:return "Upgrade to elite"else:return "No upgrade available"public String checkSubscription(String type, int duration) {if (type.equals("monthly") && duration >= 6) {return "Eligible for annual plan";} else if (type.equals("annual") && duration >= 12) {return "Eligible for lifetime plan";} else {return "Continue current plan";}}答案一、语句覆盖1. 测试用例:a=1, b=1;a=1, b=12. 测试用例:age=15;age=25;age=65二、分支覆盖1. 测试用例:x=1, y=1;x=1, y=1;x=1, y=1;x=1, y=12. 测试用例:score=95;score=85;score=75;score=65三、路径覆盖1. 测试用例:a=1, b=1;a=1, b=1;a=1, b=1;a=1, b=12. 测试用例:a=10, b=5, c=3;a=5, b=10, c=8;a=5, b=5, c=10;a=3, b=3, c=3四、条件覆盖1. 测试用例:password="567";password=""2. 测试用例:username="test", password="pass";username="", password=""五、判定条件覆盖1. 测试用例:age=20, hasLicense=True;age=17, hasLicense=False2. 测试用例:num=2;num=1;num=0;num=1六、多条件覆盖1. 测试用例:score=95, isFinalExam=False;score=85, isFinalExam=True;score=75, isFinalExam=False;score=65, isFinalExam=True七、条件组合覆盖1. 测试用例:username="admin", password="admin123",is_admin=False;username="user", password="56",is_admin=False;username="admin", password="admin123",is_admin=True2. 测试用例:username="admin", password="admin123", hasTwoFactor=True;username="user", password="user123", hasTwoFactor=False;username="admin", password="wrong", hasTwoFactor=True八、路径条件覆盖1. 测试用例:quantity=15, discount=0.05;quantity=8, discount=0.05;quantity=15, discount=0.22. 测试用例:price=100, isMember=True, hasCoupon=True;price=100, isMember=False, hasCoupon=False;price=100, isMember=True, hasCoupon=False九、修改条件/判定覆盖1. 测试用例:user_type="basic", points=50;user_type="basic", points=150;user_type="premium",points=150;user_type="premium", points=2502. 测试用例:type="monthly", duration=3;type="monthly", duration=9;type="annual", duration=9;type="annual", duration=15。

白盒测试--条件覆盖、条件组合覆盖

白盒测试--条件覆盖、条件组合覆盖

条件覆盖,条件组合覆盖
白盒测试
内容要点
掌握条件覆盖设计测试用例 掌握条件组合覆盖设计测试用例
《软件工程》教学
条件覆盖
4、 条件覆盖
• 条件覆盖:设计足够多的测试用例,使 被测程序中每个判定的每个条件的每个 可能取值至少执行一次;
• 用例设计:条件取值-T1,F2,T3,T4; F1,T2,F3,F4;
序号
X
Y
路径
1
90
70
OBC
2
40
90
OBD
课堂讨论
• 请同学们,自行总结条件覆盖法的优点以 及缺点?
• 请同学们,通过比较语句覆盖、判断覆盖 、组合覆盖和今天所学的条件覆盖,你认 为目前所学的方法中,哪个方法的覆盖点 比较多?
条件覆盖
优点 条件覆盖比判定覆盖,增加了对符合判 定情况的测试,增加了测试路径。
缺点 要达到条件覆盖,需要足够多的测试用 例,但条件覆盖并不能保证判定覆盖。 条件覆盖只能保证每个条件至少有一次 为真,而不考虑所有的判定结果
条件覆盖实例讲解
《软件工程》教学
条件组合覆盖
条件组合覆盖:设计足够多的测试用例, 使被测程序中每个判定的所有可能的条 件取值组合至少执行一次。
用例设[去计掉一:些N无个效的条取件值组取合值]。:C21 *C21 *C21 *C21 (2n=16)
序号
X
Y
路径
1
90
90
OAE
2
90
70
OBCE
3
90
30
OBDE
4
70
90
CE
5
30
90
OBDE
6
70

白盒测试又称为什么可以分为什么和什么两大类

白盒测试又称为什么可以分为什么和什么两大类

白盒测试又称为透明盒测试可以分为逻辑覆盖和代码覆盖两
大类
白盒测试又被称为透明盒测试,是一种软件测试方法,它不仅关注功能和用户
界面,还深入到软件的内部结构,以确保代码的质量和逻辑的正确性。

白盒测试可以进一步分为逻辑覆盖和代码覆盖两大类,下面将详细介绍这两种类型。

逻辑覆盖
逻辑覆盖是白盒测试的一种类型,它主要关注软件中的逻辑部分,确保所有可
能的逻辑路径都被测试到。

逻辑覆盖通常包括以下几种技术:
•语句覆盖:确保每一行代码都被执行到。

•判定覆盖:确保每一个逻辑判断都被测试到,包括真值和假值。

•条件覆盖:确保每一个条件语句的各个分支都被测试到。

•多条件覆盖:确保每一个条件语句的所有组合情况都被测试到。

逻辑覆盖通过这些技术来验证软件中的各种逻辑路径,以保证程序在各种情况
下的正确性和稳定性。

代码覆盖
代码覆盖是白盒测试的另一种类型,它主要关注软件中的具体代码部分,以确
保整个代码库都被覆盖到。

代码覆盖通常包括以下几种技术:
•语句覆盖:同逻辑覆盖中的语句覆盖,确保每一行代码都被执行到。

•分支覆盖:确保每一个条件语句的各个分支都被执行到。

•路径覆盖:确保每一个可能的程序执行路径都被覆盖到。

代码覆盖通过这些技术来验证代码库的完整性和稳定性,以确保程序在各种情
况下都能正确运行。

综上所述,白盒测试又称为透明盒测试,它可以分为逻辑覆盖和代码覆盖两大类。

逻辑覆盖主要关注软件中的逻辑路径,而代码覆盖主要关注软件中的代码部分。

这两种类型的测试方法在确保程序质量和功能性方面发挥着重要作用,是软件开发过程中不可或缺的环节。

白盒测试(条件组合覆盖、条件覆盖)

白盒测试(条件组合覆盖、条件覆盖)

中每个判定的每个条件的每个可能取值至少执行 一次; 用例设计:条件取值-T1,F2,T3,T4; F1,T2,F3,F4;
序号 1 2 X 90 40 Y 70 90 路径 OBC OBD
条件覆盖
优点 条件覆盖比判定覆盖,增加了对符合判定情况的测 试,增加了测试路径。 缺点 要达到条件覆盖,需要足够多的测试用例,但条件 覆盖并不能保证判定覆盖。条件覆盖只能保证每个 条件至少有一次为真,而不考虑所有的判定结果
要求: 画出程序流程图; 标识条件表达式序列号; 用条件组合覆盖法设计测试用例; 用条件覆盖法设计测试用例。 测试用例格式如下表: 序 号 1 输入 条件 i=?,j=? 输出 结果 条件 取值 情况 路径
m=, T1T2 n=?,k =?
2 3
90 70 30 90 90 70 50
路径
OAE OBCE OBDE OBCE OBDE OBDE OBDE
条件组合
优点 多重条件覆盖准则满足判定覆盖、条件覆盖和判定 /条件覆盖准则。 缺点 线性地增加了测试用例的数量。
《软件工程》教学
4、 条件覆盖
条件覆盖:设计足够多的测试用例,使被测程序
白盒测试条件组合覆盖条件覆盖内容要点软件工程教学掌握条件组合覆盖设计测试用例掌握条件覆盖设计测试用例逻辑覆盖实例讲解软件工程教学3条件组合覆盖条件组合覆盖
条件组合覆盖,条件覆盖
白盒测试
内容要点
掌握条件组合覆盖设计测试用例
掌握条件覆盖设计测试用例
《软件工程》教学
逻辑覆盖实例讲解
《软件工程》教学
课堂练习
4.2 课堂实践-条件组合覆盖和条件覆盖.doc
Void sort(int i,int j) {

白盒测试的基本方法

白盒测试的基本方法

白盒测试的基本方法
1. 语句覆盖呀,这就像走迷宫时要把每条路都走一遍!比如在一个判断语句中,你得让程序把真和假两种情况都运行到呀。

2. 判定覆盖呢,类似于下棋要考虑到各种可能的走法!像一个 if-else 语句,得保证两种分支都被执行过哦。

3. 条件覆盖哇,就好像把每个零件都仔细检查一样!对于包含多个条件的判断,得把每个条件的不同情况都试过才行呢。

4. 判定条件覆盖呀,这好比既要走对路又要关注路上的细节!不但要让判定语句的所有分支执行,还要让条件的各种组合都出现呢。

5. 路径覆盖咧,就如同把整个地图的所有路线都走个遍!是要让程序运行经过所有可能的执行路径哦。

6. 接口测试呀,相当于检查不同部分之间连接是否顺畅!像两个模块之间的数据传递,得保证能准确无误呀。

7. 边界值测试哟,这就像行走在悬崖边要特别小心一样!比如输入范围的边界值,往往容易出问题呀,得重点关照呢。

总之,白盒测试的这些基本方法就像是我们手中的利器,能帮助我们把程序里隐藏的问题都找出来,让我们的软件变得更加可靠呀!。

白盒测试中的路径覆盖与分支覆盖方法综述

白盒测试中的路径覆盖与分支覆盖方法综述

白盒测试中的路径覆盖与分支覆盖方法综述白盒测试(White-box testing)是软件测试中的一种方法,它通过了解被测试软件的内部结构和实现细节,来设计测试用例和进行测试。

路径覆盖和分支覆盖是白盒测试中常用的两种覆盖方法,它们用于确保被测试软件的所有路径和分支都得到了适当的测试。

一、路径覆盖方法:路径覆盖是一种测试目标,要求测试用例能够遍历被测试软件的每条可能路径。

以下是几种常见的路径覆盖方法:1. 语句覆盖(Statement Coverage):语句覆盖要求测试用例能够覆盖被测试软件中的每一条语句。

通过执行每条语句,可以确保程序每个语句都不会导致错误或漏洞。

2. 判定覆盖(Decision Coverage):判定覆盖要求测试用例能够覆盖被测试软件中的每个判定,即每个条件表达式的取值为真和假。

通过测试不同的判定结果,可以检测出潜在的逻辑错误和异常情况。

3. 条件覆盖(Condition Coverage):条件覆盖要求测试用例能够覆盖被测试软件中每个条件的所有可能取值,包括真、假和边界值。

通过测试不同的条件组合,可以验证被测试软件在不同条件下的行为是否正确。

4. 路径覆盖(Path Coverage):路径覆盖要求测试用例能够覆盖被测试软件中的每个可能路径。

路径是指在程序中的一系列语句执行序列,通过测试所有可能的路径,可以检测出复杂的控制流错误。

二、分支覆盖方法:分支覆盖是一种测试目标,要求测试用例能够覆盖被测试软件中的每个分支。

以下是几种常见的分支覆盖方法:1. 简单分支覆盖(Simple Branch Coverage):简单分支覆盖要求测试用例能够覆盖被测试软件中的每个简单分支,即每个条件的真、假两个结果。

通过测试不同的分支结果,可以检测出条件判断错误和逻辑问题。

2. 多条件分支覆盖(Multiple Condition Coverage):多条件分支覆盖要求测试用例能够覆盖被测试软件中每个条件的所有可能组合,包括每个条件的真、假两个结果。

测试用例

测试用例

测试用例的设计(一)白盒技术白盒测试是结构测试,所以被测对象基本上是源程序,以程序的内部逻辑为基础设计测试用例。

1、逻辑覆盖程序内部的逻辑覆盖程度,当程序中有循环时,覆盖每条路径是不可能的,要设计使覆盖程度较高的或覆盖最有代表性的路径的测试用例。

下面根据图7-1所示的程序,分别讨论几种常用的覆盖技术。

(1)语句覆盖。

为了个提高发现错误的可能性,在测试时应该执行到程序中的每一个语句。

语句覆盖是指设计足够的测试用例,使被测试程序中每个语句至少执行一次。

如图7-1是一个被测试程序流程图:(2)判定覆盖。

判定覆盖指设计足够的测试用例,使得被测程序中每个判定表达式至少获得一次“真”值和“假”值,从而使程序的每一个分支至少都通过一次,因此判定覆盖也称分支覆盖。

(3)条件覆盖。

条件覆盖是指设计足够的测试用例,使得判定表达式中每个条件的各种可能的值至少出现一次。

(4)判定/条件测试。

该覆盖标准指设计足够的测试用例,使得判定表达式的每个条件的所有可能取值至少出现一次,并使每个判定表达式所有可能的结果也至少出现一次。

(5)条件组合覆盖。

条件组合覆盖是比较强的覆盖标准,它是指设计足够的测试用例,使得每个判定表达式中条件的各种可能的值的组合都至少出现一次。

(6)路径覆盖。

路径覆盖是指设计足够的测试用例,覆盖被测程序中所有可能的路径。

在实际的逻辑覆盖测试中,一般以条件组合覆盖为主设计测试用例,然后再补充部分用例,以达到路径覆盖测试标准。

2.循环覆盖3.基本路径测试(二)黑盒技术1.等价类划分(1)划分等价类。

①如果某个输入条件规定了取值范围或值的个数。

则可确定一个合理的等价类(输入值或数在此范围内)和两个不合理等价类(输入值或个数小于这个范围的最小值或大于这个范围的最大值)。

②如果规定了输入数据的一组值,而且程序对不同的输入值做不同的处理,则每个允许输入值是一个合理等价类,此处还有一个不合理等价类(任何一个不允许的输入值)。

白盒测试逻辑覆盖

白盒测试逻辑覆盖

3、条件覆盖(Condition Coverage)
在设计程序中,一个判定语句是由多个 条件组合而成的复合判定,判定 (a)&&(b||c)包含了三个条件:a,b和c。 为了更彻底的实现逻辑覆盖,可以采用 条件覆盖。
条件覆盖的含义是:构造一组测试用例, 使得每一判定语句中每个逻辑条件的可 能值至少满足一次。
if(x!=1)
{
} statements;
……;
99句
}
else
{
} statement; 1句
}
测试用例 x=2 语句覆盖率99% 50%的分支没有达到
2、判定覆盖(Decision Coverage)
比语句覆盖稍强的覆盖标准是判定覆盖。 判定覆盖的含义是:设计足够多的测试
用例,使程序中的每个判定至少都获得 一次“真值”或“假值”。
穷举路径仍然存在遗憾
穷举路径测试法无法检查出程序本身 是否违反了设计规范,即程序是否是 一个错误的程序;
穷举路径测试不可能查出程序因为遗 漏路径而出错;
穷举路径测试发现不了一些与数据相 关的错误;
白盒测试原则
保证一个模块中的所有独立路径至少 被测试一次;
所有逻辑值均需测试真(True)和假 (False)两种情况;
循环语句例子
for(i=0;i<10;i++) {
statement; }
While(x>3) {
statement; }
for(i=0;i<=10;i++) {
statement; }
While(x>3&&x<7) {
statement; }

白盒测试的常用技术

白盒测试的常用技术

白盒测试的常用技术白盒测试的常用技术主要有7种,下面我们将分别介绍。

一、逻辑覆盖法逻辑覆盖法主要讨论以下四点:测试覆盖率。

逻辑覆盖。

面向对象的覆盖。

测试覆盖准则。

下面分别进行讨论。

1.测试覆盖率测试覆盖率是用于确定测试所执行到的覆盖项的百分比。

其中的覆盖项是指作为测试基础的一个入口或属性,比如语句、分支、条件等。

测试覆盖率可以表示出测试的充分性,在测试分析报告中可以作为量化指标的依据,测试覆盖率越高,效果越好。

但覆盖率不是目标,而是一种手段。

测试覆盖率包括功能点覆盖率和结构覆盖率。

1)功能点覆盖率主要用于表示软件已经实现的功能与软件需要实现的功能之间的比例关系。

2)结构覆盖率包括语句覆盖率、分支覆盖率、循环覆盖率、路径覆盖率等。

2.逻辑覆盖根据覆盖目标的不同和覆盖源程序语句的详尽程度,逻辑覆盖又可分为语句覆盖、判定覆盖、条件覆盖、条件判定组合覆盖、多条件覆盖、修改条件判定覆盖、组合覆盖和路径覆盖。

(1)语句覆盖语句覆盖是选择足够多的测试数据,使得程序中的每个可执行语句至少执行一次。

语句覆盖的缺点是对程序执行逻辑的覆盖率很低。

(2)判定覆盖判定覆盖是通过设计足够多的测试用例,使得程序中的每一个判定至少获得一次真值和假值,或者使得程序中的每一个取真的分支或取假的分支至少经历一次,也称为分支覆盖。

判定覆盖的缺点是主要对整个表达式的最终取值进行度量,忽略了表达式的内部取值。

(3)条件覆盖条件覆盖是通过设计足够多的测试用例,使得程序中每个判定包含的每个条件的可能取值(真/假)都至少满足一次。

条件覆盖的缺点是不能够满足判定覆盖。

(4)条件判定组合覆盖条件判定组合覆盖是通过设计足够多的测试用例,使得程序中每个判定包含的每个条件的所有情况(真/假)至少出现一次,并且每个判定本身的判定结果(真/假)也至少出现一次。

条件判定组合覆盖的测试用例一定同时满足判定覆盖和条件覆盖。

条件判定组合覆盖的缺点是没有考虑单个判定对整体结果的影响,无法发现逻辑错误。

白盒测试技术2-逻辑覆盖法

白盒测试技术2-逻辑覆盖法
因此,采用判定/条件覆盖时,逻辑表达式中的 错误不一定能测试出来。
5、条件组合覆盖
条件组合覆盖 是指通过设计足够多的测试用例,使得运 行这些测试用例时,每个判定中条件结果 的所有可能组合至少出现一次。
条件组合覆盖的测试用例
s 入口
编 判定1各条件 编 判定2各条件
号 组合
号 组合
1 y>1,z==0
-T3,-T2 判定/条件覆盖同时包含 判定覆盖,和条件覆盖。
判定/条件覆盖仍有缺陷。从表面上看,它测试了所有条 件的所有可能结果,但事实上并不是这样。因为某些条件 掩盖了另一些条件。例如,在逻辑表达式中,如果“与” 表达式中某一条件为“假”,则整个表达式的值为“假” ,这个表达式中另外的几个条件就不起作用了。同样地, 如果在“或”表达式中,某一条件为“真”,则整个表达 式的值为“真”,其它条件也就不起作用了。
判定/条件覆盖的测试用例
❖对判定1:(y>1)&&(z==0) 条件 y>1 取真、假分别记为 T1 ,-T1 条件 z==0 取真、假分别记为 T2 ,-T2
❖判定2:(y==2)||(x>1) 条件 y==2取真、假分别记为 T3 ,-T3 条件 x>1 取真、假分别记为 T4 ,-T4
测试用例 输入 预期输出 覆盖条件
//语句块2
j=j%3;
//语句块3
}
对上述程序试用逻辑覆盖法设计测试用例。
画出流程图
a
F X>3 && z<10
Tb
c
执行语句块1
F X==4 || y>5
Td
e
执行语句块2
执行语句块3
1、语句覆盖测试用例

白盒测试的主要方法

白盒测试的主要方法

白盒测试的主要方法白盒测试是一种软件测试方法,针对测试对象的内部结构和实现进行测试。

主要通过深入理解软件的内部逻辑和代码来设计和执行测试用例,以覆盖尽可能多的代码路径和分支。

以下是一些常用的白盒测试方法:1. 语句覆盖(Statement Coverage):确保每个代码语句至少执行一次。

这是最基本的白盒测试方法之一,通过执行测试用例,观察是否能覆盖到每个语句,从而检查是否存在未执行的代码。

2. 判定覆盖(Decision Coverage):确保每个判定语句(例如if语句)的可能结果都被覆盖到。

即对每个判定语句的条件进行测试,覆盖到真和假两种可能结果。

3. 条件覆盖(Condition Coverage):确保每个条件都被覆盖到。

条件覆盖既包括判定条件的覆盖,也包括每个逻辑表达式中的各个条件的覆盖。

4. 路径覆盖(Path Coverage):覆盖到每个代码路径,包括所有可能的分支、循环和递归调用。

路径覆盖可能是一种比较耗时和复杂的测试方法,但可以有效地发现隐藏在多个条件组合之下的错误。

5. 条件组合覆盖(Condition Combination Coverage):对每个条件的不同组合进行测试,以确保逻辑上的各种可能情况都能被覆盖到。

这个方法能够发现一些因条件组合而导致的错误。

6. 简化条件组合覆盖(Simplified Condition Combination Coverage):对条件组合覆盖的测试方法进行简化,去除无关条件或冗余条件,以减少测试用例的数量和复杂性。

7. 路径约束测试(Path Constraint Testing):基于代码路径的约束条件,生成测试用例,通过限制条件的取值,测试特定路径的执行。

8. 边界值分析(Boundary Value Analysis):测试输入的边界情况,如最大值、最小值、临界值等。

边界值通常容易引起问题,因此这个方法能够有效地发现一些边界值错误或边界条件引发的错误。

白盒测试中的决策覆盖与条件覆盖

白盒测试中的决策覆盖与条件覆盖

白盒测试中的决策覆盖与条件覆盖白盒测试是软件测试中的一种重要测试方法,它主要对软件内部的逻辑结构进行测试。

在白盒测试中,决策覆盖和条件覆盖是两个常用的测试准则。

本文将针对白盒测试中的决策覆盖与条件覆盖进行探讨,以帮助读者更好地理解和应用这两种测试准则。

1. 决策覆盖决策覆盖是一种白盒测试准则,它的目标是确保软件内的所有决策路径都被执行到。

在测试过程中,我们要确保每一个判定条件的所有可能取值都被测试到,并且每一个判定条件的不同取值组合都被覆盖到。

这样可以有效地发现潜在的逻辑错误和程序错误。

下面以一个简单的示例来说明决策覆盖的概念。

假设有一个函数,其功能是根据输入的年龄判断一个人是否成年。

代码如下:```1. function isAdult(age) {2. if (age >= 18) {3. return true;4. } else {5. return false;6. }7. }```在这个例子中,判定条件是`age >= 18`,它有两个可能的取值:真(true)和假(false)。

为了实现决策覆盖,我们需要编写测试用例来测试不同的输入值,以覆盖所有可能的判定条件取值。

例如,我们可以编写以下测试用例:- 测试用例1:输入`age = 20`,预期结果为`true`- 测试用例2:输入`age = 16`,预期结果为`false`通过这些测试用例,我们可以覆盖到判定条件的所有可能取值,从而达到决策覆盖的要求。

2. 条件覆盖条件覆盖是另一种常用的白盒测试准则,它的目标是确保软件内的所有判定条件都被测试到。

在测试过程中,我们要确保每一个判定条件的所有可能取值都被测试到,包括真(true)和假(false)两种情况。

这样可以有效地发现逻辑错误和条件判断错误。

继续以之前的示例来说明条件覆盖的概念。

在上述代码中,判定条件是`age >= 18`。

为了实现条件覆盖,我们需要编写测试用例来测试该判定条件的所有可能取值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

多个逻辑条件
【条件判定覆盖率计算】
条件组合覆盖率=被评价到的条件取值组合的 数量/条件取值组合的总数
【缺点】
判定语句较多时,条件组合值比较多。
条件组合覆盖
案例
问题描述:根据输入的三角形的三边确定最 终三角形类型。(能否构成三角形,等腰、 等边、还是普通三角形)。 对该功能做条件组合覆盖的白盒测试
程序代码
条件组合覆盖:保证程序的每个判定节点中所有简 单判定条件的各种可能取值的组合应至少执行一次。 从本例来看,一共有3个判定节点,其中第2个判定 节点包含了第3个判定节点的简单判定条件。因此我们 只需考虑前两个判定节点的简单判定条件的组合。
测试分析
条件T1~T3的组合
测试分析
条件T4~T6的组合
测试分析
最终的组合
测试用例
最终的组合
测试分析
从理论上看,条件组合覆盖是较好的覆盖指标,因 为它一定满足判定覆盖、条件覆盖和判定/条件覆盖。 然而当判定表达式较为复杂的时候,条件组合覆盖 的测试用例规模是相当大的。
谢谢大家!
the
end
案例分析
【是否构成三角形】 【是否特殊三角形】 【是否一般三角形】
案例分析
流程图/执行分支/路径 开始
P1 F
a+b<=c||a+c<=b||b+c< =a
T P2
P3
a==b||b==c||a==c
F
一般三角形
F
T P4
a==b&&b==c
不是三角形
T P6
等腰三角形
等边三角形
结束
条件 T1:a+b<=c T2:a+c<=b T3:b+c<=a T4:a==b T5:b==c T6:a==c 判定: 分支1:T1||T2||T3 分支2:T4||T5||T6 分支3:T4&&T5
——条件组合覆盖
条件组合覆盖定义
定义:
条件组合覆盖,是白盒测试的一种。 条件组合覆盖,也称多条件覆盖MCC (Multiple Condition Coverage),设计 足够多的测试用例,使得每个判定中条件的 各种可能组合都至少出现一次满足条件覆盖 一定满足判定覆盖、条件覆盖、条件判定覆 盖。
相关文档
最新文档