没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记111(2005)113-136www.elsevier.com/locate/entcsProTest:B规格的自动测试环境马诺兰詹·萨特帕提英国雷丁大学计算机科学系,雷丁RG6 6AY电邮地址: M. reading.ac.uk迈克尔·巴特勒电子与计算机科学学院,南安普敦大学,High Field,南安普敦,SO17 1BJ,英国电子邮件:{mal,mjb}@ ecs.soton.ac.uk摘要我们提出了ProTest,一个B规格的自动测试环境。B是一种面向模型的符号,其中系统是根据抽象状态和抽象状态上的操作来指定的。ProTest首先通过穷举模型检查生成B规范的状态覆盖图,然后遍历覆盖图以生成一组测试用例,每个测试用例都是B操作序列。为了使模型检查是穷举的,对B机中使用的集合应用了一些变换。该方法也适用于不穷举的情况;在状态空间探索期间,可以在任何时间点停止,并从所获得的覆盖图生成测试用例迄今ProTest然后同时执行B机器的动画和Java中相应实现的执行,并对测试结果进行判决。由于对B操作施加了一些限制,整个测试过程都是机械地进行的。我们证明了我们的测试环境的有效性,通过执行一个小的案例研究,从行业。此外,我们提出了一个解决方案,处理B操作中的非确定性的问题保留字:基于规范的测试,B方法,测试环境,不确定性。1介绍软件测试大致分为两类:结构化测试和功能测试[2,6]。结构化测试(或白盒测试)从实现或部分实现的结构中导出测试用例。这样的测试用例是从程序员的角度派生出来的1571-0661 © 2004 Elsevier B. V.根据CC BY-NC-ND许可证开放访问。doi:10.1016/j.entcs.2004.12.009114M. Satpathy et al.理论计算机科学电子笔记111(2005)113目的是尽可能多地覆盖被测对象的结构。这种方法可能会遗漏许多bug,因为它可能会提供我们可能需要的所有代码覆盖率,但它可能不会提供用户可能期望的所有系统覆盖率。另一方面,功能测试(或黑盒测试)的测试用例是从用户的角度编写的。它们来自于软件行为的外部规范,而不考虑内部组织、逻辑、控制或数据流。结构化测试告诉开发人员代码正在做正确的事情,而功能测试告诉开发人员代码正在做正确的事情[8]。功能测试包括执行与一组测试用例相关的测试实现,并检查生成的输出的正确性。在这方面,我们有以下问题:• 测试用例的生成:如何获得测试用例,使它们覆盖所有场景下的需求的所有特性?• 测试用例的执行:如何执行从需求或规范中获得的测试用例?这可能是一项艰巨的任务,因为即使实现保留了要求/规范的意图,也可能无法保留后者的结构或逻辑。• 测试结果的验证一旦我们运行了测试用例,程序就会产生一些输出。如何确保结果正确?如果开发过程是正式的,那么上述许多问题都可以以严格的方式处理。形式规范精确地定义了软件的高级方面,同时省略了详细的结构信息;它们更有可能编码所有必需的功能及其场景。因此,测试人员可以使用底层的数学框架来生成(可能是机械地)功能测试的测试用例即使我们从规范中获得测试用例,使用它们来执行实现也可能不容易。这是因为高级功能可能已经以各种方式实现,并且高级功能和低级实现之间的映射对于测试者可能不是显而易见的考虑一个测试用例的例子,它是一个规范级别的高级操作序列,但是这个操作序列可能不容易映射到实现级别的操作。一些作者提出使用称为表示映射的特殊映射来弥合这种语义差距[17]。此外,还有非决定论的问题。由非确定性操作做出的选择可能不对应于由实现做出的确定性选择那么我们如何使用一个涉及非确定性的测试用例呢?M. Satpathy et al.理论计算机科学电子笔记111(2005)113115当一个系统执行一个测试用例时,它产生一个结果,并且这个结果通常由测试人员解释,以分配一个系统已经通过测试的结论。这个问题可以通过将神谕纳入测试过程来解决[17,23]。一个测试预言机确定系统是否在测试用例中正确运行。测试神谕通常从规范中获得。测试用例的结果和从测试预言机获得的结果需要匹配,以建立抽象输出和具体结果之间的等价性。在这个上下文中有两个问题;第一,在规范的抽象状态和实现的具体状态之间必须有一个映射,第二,必须有一个机制来显示它们的等价性。第一个问题可以通过表示映射来解决; Antony和Hamlet [4]已经讨论了用户如何为具体数据结构之间的表示映射编写显式代码C++实例变量和规范的抽象。第二个问题可以通过使用探测或观察操作无论是在抽象的层面还是在具体的国家层面。在本文中,我们讨论了ProTest,一个B规格的自动测试环境。ProTest基于ProB,一个用于B的模型检查和动画工具[16]。ProTest遵循类似于Dick和Faivre [10]的方法(在第2节中讨论),并通过对状态不变量和规范的操作前提进行分区分析,从B规范生成测试用例。我们的方法提供了一些指导方针,如果实现遵循它们,那么整个测试过程的周期可以自动化。我们还讨论了一个小的工业案例研究,以说明我们的方法和测试环境。我们的论文的主要结果可以总结如下:• ProTest通过划分和探索状态空间来生成测试用例。然后,ProTest同时对规范进行动画处理,并针对测试用例运行实现,并判定实现是否通过测试。整个过程是自动的;然而,在这个阶段,测试环境对操作参数和结果施加了一些限制。• 我们已经提出了一个解决方案来处理B操作中的非确定性;但是ProTest的当前实现不支持这一点。本文的结构如下。第二节讨论了相关的工作。第3节介绍了我们的方法。第4节讨论了我们的实现,在第5节中,我们预先分析了与现有工作相关的测试环境。第六节是论文的总结。116M. Satpathy et al.理论计算机科学电子笔记111(2005)113∧∧←−|⇒←−|⇒2相关工作基于规范的测试的概念很可能起源于Hall [13]的工作,他在工作中讨论了通过检查Z规范操作中的谓词来划分输入空间[20]。其目的是根据测试结果归纳软件正确性。Dick和Faivre [10]的工作是对软件测试中使用形式化方法的一个重大贡献,他们讨论了从面向模型的形式化规范生成测试用例的策略一个VDM [14]规范有状态变量和一个不变量(Inv)来限制状态变量。一个操作,比如说OP,由一个前置条件(OPpre)和一个后置条件(OPpost)指定。Dick和Faivre的方法是通过将表达式OPpre OPpost Inv转换为其析取范式(DNF)来划分OP的输入空间;它的每个析取表示OP的一个输入子域。接下来,OP的操作实例被创建为与DNF中的非矛盾析取的数量一样多。然后尝试创建FSA(有限状态自动机),其中每个节点表示可能的机器状态,并且边缘表示操作实例的应用然后通过遍历FSA生成一组测试用例,其中每个测试用例是一系列操作实例。Dick和Faivre的工作只讨论了分割算法的机械化Legeard等人[15]开发了一种称为BZ测试工具(BZ- TT)的工具,用于从Z或B规范中导出测试用例。由于我们的方法与BZ-TT有许多相似之处,我们在这里详细介绍。就B specifications而言,他们假设(i)specifications由单个B机器组成,(ii)B机器中的所有集合都被转换为有限枚举集合。测试用例生成按以下步骤进行:• 每个B运算Op的定义被转换成其归一化形式[1],其看起来像:输出Op(inps)= Pre@ sJ,输出J。 Post = outs,s:= outsJ,sJ其中,s是机器的状态变量,Pre是前提条件(超过inps和s),Post是后置条件。INPS和OUT分别是操作输入和结果。 范式告诉:提供前为真,则值sJ和outsJ被非确定性地选择,使得岗位满意。 Post可以指s和outs,也可以指sJ和outsJ。• Pre和Post被转换成它们的DNF;Op的定义于是变成:输出Op(inps)=(i Pre i)@ sJ,输出J。(jPost j) =out,s:=outJ,sJ• 上面的表达式将输入空间划分为M. Satpathy et al.理论计算机科学电子笔记111(2005)113117形式:[咒语] (i前i)后j.使用CLP(约束逻辑编程)求解器从上述表达式生成测试用例然而,为了生成边界目标,BZ-TT使用成本函数来进一步划分输入子域。如果输入子域由谓词#(W<$R<$A)#{X1,X2,X3}表示,则<最大化和最小化成本函数可以是#W+ #R+#A= 2和#W+ #R+ #A= 0。给定一个边界条件,Prolog搜索技术被用来生成一个测试前导。在边界状态,所有合格的操作被应用以生成作为操作实例序列的测试用例。从测试用例中,自动测试脚本以目标语言生成,并且手动创建表示映射。由于非确定性和抽象与具体状态之间的匹配问题,自动判决分配没有实现。值得注意的是,BZ-TT不处理常量,属性和集合理解,所有这些我们都在案例研究中使用Richardson等人的工作。[17]讨论了在多语言和多范式(正式)规范的背景下检查测试结果的测试神谕的推导和使用。测试预言来自规范,并结合与某些测试标准相关的测试数据的推导。测试执行被监控,结果被验证,有时作者认为除了最终结果之外,还比较中间结果是有用的。为了使验证成为可能,他们的方法在实现的名称空间和oracle的名称空间(与规范的名称空间相同)之间构建映射。有两种映射:控制和数据。控制映射是实现中的控制点和规范中的位置之间的映射,其中实现和规范应该处于相同的状态。数据映射描述了实现中的数据结构和规范中的对象之间的转换。这些映射也被称为表示映射[15],通常它们是手动开发的。在预定的控制点上监控实现状态和状态变化,并使用数据映射来建立实现和指定状态之间的对应关系,如oracle。作者指出,所描述的许多步骤可以自动化。118M. Satpathy et al.理论计算机科学电子笔记111(2005)113≥3我们的方法让我们假设一个正式的规范已经充分规范了所有可能场景下的所有需求函数。然后,我们的目标是生成测试用例,这些测试用例将在给定的场景下测试相应实现的所有此类功能此外,我们的测试环境将检查测试结果以分配判决。ProTest是B规范的测试环境。3.1B方法B方法最初由J. R. Abrial [1]是计算机系统形式化开发B在Z和VDM的意义上是面向模型的B用于覆盖整个软件开发周期;规范用于生成代码,其间有一系列细化步骤。在每个阶段,当前的细化都需要证明与先前的细化一致。B方法中的基本指定单元称为B机。更大的规格可以通过以分层(树状)方式链接B机器来获得。这是B方法的设计限制,目的是进行组合证明。B机由一组变量、一个限制变量的不变量和一组修改状态变量的操作组成。一台机器有一个初始状态,它包含状态变量。一个操作有一个前提条件,只有当前提条件成立时,操作调用才被定义。 初始化动作和操作体被写为用称为广义替换语言[1]的语言编码的原子动作。该语言允许指定确定性和非确定性赋值。操作将机器状态转换为新状态。B机器的行为可以用一系列操作来描述;序列的第一个操作来自机器的初始状态3.2我们的示例对于我们的案例研究,我们将考虑飞利浦电子公司的商业电视图文电视系统的一个组成部分[18]。该组件描述如下:电视屏幕有一个由R行组成的显示窗口,可以显示N个图文电视页标题的序列。在任何时候,可以显示所发送的序列的子序列,因此,N个页面标题(NR)需要滚动。 页面标题可以滚动通过按下电视遥控器的向上和向下箭头按钮每M. Satpathy et al.理论计算机科学电子笔记111(2005)113119显示窗口电视遥控器图文电视页号序列图1.一、在大小为R的显示窗口上显示N个页面标题显示窗口的窗口具有默认颜色,并且可以显示图文电视页面标题。在任何时间点,光标都停留在一个以不同颜色显示的插槽上。该组件具有重要的光标移动操作。该组件的图示形式如图1所示。我们已将这个图文电视组件指定为一台B机,其草图已在附录中显示B机器有一个名字,在我们的例子中,它被称为Teletext。SETS子句显示计 算 机 将 使 用 的 集 合 。 CONSTANTS 子 句 声 明 机 器 中 使 用 的 常 量 ,PROPERTIES子句说明它们的类型和值。VARIABLES标题显示状态变量,INVARIANT子句以谓词的形式对状态变量进行限制;在附录中,我们展示了一个片段 的不变量。INITIALISATION子句定义状态变量。OPERATIONS子句显示了一组可以探测机器状态或修改机器状态的操作。在我们的示例中,最重要的操作是define、upCursor和downCursor。upCursor尝试将光标向上移动一个位置,它可能涉及滚动。downCursor试图将光标向下移动一个位置,它可能涉及向相反方向滚动。如果定义操作已将机器置于定义的操作模式,则所有这些操作都是可能的。120M. Satpathy et al.理论计算机科学电子笔记111(2005)113∨ ¬3.3输入空间B机器有一个状态,可以通过机器的操作来修改。INITIALISATION子句将B机器置于其初始状态。此后,当一项行动的先决条件成立时,该行动就有资格申请。合格操作的应用定义了机器的行为。遵循Dick和Faivre [10]的术语,我们将测试用例定义为一系列合格的操作。每个操作都有一个先决条件,它定义了输入空间。Dick和Faivre将这个输入空间划分为子空间,这意味着每个子空间定义了一个可能的场景,在这个场景下可以应用该操作。我们对B机器采用相同的方法。我们在下面的步骤中列举我们的分区方法。步骤1:考虑一个机器操作OP1.计算操作前条件的DNF。正如Legeard等人所指出的那样。[15],在实践中,操作的前提条件有时是微不足道的,因此,基于DNF的分析将不会导致感兴趣的分区。为了解决这个问题,我们做了如下的转换。 考虑一个在其主体中具有IF构造的操作,例如:IF THEN. 别的...然 后 ,我们(通过合取)将谓词(< if-predicate>)添加到前提条件中。请注意,上面是一个重言式,因此,它并没有修改前提条件,但它会导致输入空间的更好我们对操作中的所有if-predicate执行相同的操作。参考图3.3中的upCursor操作,观察原始的前提条件是如何被扩展以创建更多分区的。请注意,这种转换不仅限于IF谓词。它们还应用于CASE和SELECT语句的谓词将谓词添加到前提条件的规则如表5在附录中在所有这些前提条件的转换之后,它受到DNF分析。请注意,目前,类似AN Y语句中的IF语句的情况被忽略。问题是:它可能依赖于不属于输入或初始状态的约束变量。第二步:假设OP 1的前提条件的DNF是析取项C1,C2,.的析取项。,C p. 我们在操作体中从谓词中提取重言式的方式意味着,可能是自相矛盾的,而且其中一些可能与B机的不变量相矛盾。然后,我们通过一个朴素的定理证明器来过滤这些矛盾的析取式。设滤波后剩下的析取式为C1,C2,.. ,C k. 这些析取项划分了OP1到k子空间。M. Satpathy et al.理论计算机科学电子笔记111(2005)11312111我(一)upCursor= PREStatus= DEFINED THEN如果选择> 1则选定:=选定-1||IF(Plist_size>= Display_size)THENIF Scroll> 0 THEN如果选择=滚动+ 2则滚动:=滚动-1||......这是什么?否则如果 (DisColours(Display_size)=white&DisPnames(Display_size)=blank)................................ 则DisColours:={nn,cc|... }其他变色:= {nn,cc|......}端端其他/* 不需要滚动 */如果选择>= 2,则变色:= {nn,cc |{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}端端否则变色:= {nn,cc|...}结束;(B)上光标=预Status = DEFINED&(选定> 1或选定<= 1)&(Plist_size>= Display_size或Plist_size 0或Scroll<= 0)&(选定=滚动+2或选定/=滚动+2)(选定>= 2&或选定2)((DisColours(Display_size = white&&DisPnames(Display_size)=空白)或(DisColours(Display_size)/=白色或DisPnames(Display_size)/=blank))(选定= 1或选定>1)(滚动= 0或滚动>0)&&然后结束;图二.将谓词提升到前提条件:(A)操作upCursor的定义,(B)upCursor步骤3:创建操作OP 1的k个实例;让实例OPi对应于析取算子C i,1 ≤i≤k。这意味着当条件Ci成立时,实例OP有资格应用的路将谓词提升到前置条件意味着每个操作实例表示操作OP1内的有效控制路径。步骤4:为机器中的所有操作创建类似的实例第 五 步 : 探 索 B 机 器 的 完 整 状 态 空 间 , 构 造 一 个 FSM ( finite statemachine),其初始节点是B机器的初始状态。FSM中的每个节点代表一个可能的机器状态,边由操作实例标记。当然,为了探索完整的状态空间,我们假设所有指定的集合都是有限类型的,并且它们的大小很小。状态空间搜索由ProB工具执行;稍后将讨论有关实现的更多信息。这里的目标是我们在划分分析中生成的所有操作实例在FSM中至少出现一次然而,这并不总是可能的,因为某些操作实例可能无法访问。122M. Satpathy et al.理论计算机科学电子笔记111(2005)113状态spec规范动画测试用例判决图三. 测试过程第六步:从初始状态开始,遍历FSM生成集合使得FSM中的每个操作实例在生成的序列中至少出现一次。每个操作序列都应该从初始状态开始,一个操作实例可能出现在多个不止一个序列。每个这样的序列将构成后续实现的一个测试用例。这组测试序列就是我们的测试套件。遍历有限状态机以生成最佳数量的测试序列是NP3.4测试策略我们生成的测试套件中的每个测试用例只不过是B机器指定我们问题的一系列操作。我们在这里不讨论非决定论的问题,它将在后面的章节中讨论。如果我们可以动画B机器关于一个测试用例,在覆盖测试序列的末尾,我们将获得一个状态,比如说状态规范。让我们假设我们有一个B机器的实现,并且我们能够执行与相同测试用例相关的实现,并将结果状态称为Stateimpl。现在,如果我们能够将Statespec与Stateimpl匹配,那么我们就可以判定实现是否通过了测试。整个过程如图3所示。3.5匹配问题B机器的操作可以分为两类:可以修改机器状态的更新操作和只对状态变量执行查询的探测操作探测操作可以查询系统状态以提取出重要的状态方面。表1显示了我们案例研究中的所有更新和探测操作。我们假设状态implProTest环境匹配M. Satpathy et al.理论计算机科学电子笔记111(2005)113123实现者实现所有探测以及更新操作。规范的探测操作和实现的探测操作现在可以分别查询Statespec和Stateimpl的重要属性,并匹配它们的响应。当然,这需要在Statespec的名称空间和Stateimpl的名称空间之间进行映射,这种映射类似于Richardson等人的工作[17]。4实现:ProTest环境ProTest是一个建立在ProB工具之上的测试环境,ProB工具由Leuschel和Butler [16]开发。在下文中,我们将对其进行简要说明4.1ProB工具ProB工具是通过模型检查和基于约束的检查来自动检查B机器的一致性。一致性检验活动表明机器的操作保持了机器不变量。ProB环境主要在SICStusProlog中开发,并在Tcl/Tk中实现了图形用户界面。ProB使用JBTools [22]包将B机器转换为XML形式,然后使用Pillow package [7]将XML文件转换为Prolog术语表示。ProB前端然后使用这个Prolog术语表示。ProB animator提供了迄今为止由animator探索的状态空间的可视化。关于ProB的更多细节可以在[16]中找到ProB的模型检查器组件试图系统地、自动地探索B机的状态空间。 它会提醒用户,找到类似于不变量违反的问题,然后在已经探索的状态中呈现从初始状态到错误位置的最短迹线。模型检查器还检测何时已经探索了有限状态模型的所有状态,因此可以正式保证没有错误。对于这种详尽的模型检查,机器的集合被限制为小的有限集合,并且整数变量被限制为小的数值范围。只有在这些限制下,ProB才能遍历机器的所有可达状态(并显示限制内没有错误)。ProB还可以为B机器制作动画。此外,ProB支持随机动画,其中随机应用符合条件的操作,直到它们的数量达到用户给定的特定限制除了时间模型检查,即上述类型的模型检查之外,ProB还支持基于约束的检查。如果由于操作调用而存在不变量冲突,ProB模型检查器可以发现124M. Satpathy et al.理论计算机科学电子笔记111(2005)113通过系统的探索。然而,基于约束的检查发现了满足不变量的机器状态,但我们可以应用单个操作来达到违反不变量的状态ProB通过使用Prolog的co-routining和约束工具来支持我们将在测试环境中使用ProB的这两种方法4.2ProTest工具我们的测试环境做了以下假设:(i) B规格由一台机器组成。这是因为,在这个阶段,ProB可以对单个B机器进行动画和模型(ii) 机器的操作参数和实现的操作参数都是基本类型的,此外,操作具有基本类型的单个我们目前的实现在这些限制下执行自动verdict分配。它们使规范和实现名称空间之间的表示映射保持简单。不过,将来我们打算取消这些限制。(iii) 所有的机器操作都是确定性的。 请注意,在本文中,我们将提出我们的解决方案来处理非确定性;然而,我们目前的实现不支持它们。ProB工具已通过以下增强功能进行了增强,以构建ProTest环境:• Partition Analyser:提取前提条件和机器不变量,并将其转换为DNF。一个朴素的定理证明器,然后试图消除所有的析取从DNF的先决条件,这是自相矛盾的或矛盾的不变量。其余的析取符用于创建操作输入空间的分区,然后创建操作实例。• ProTest有一个接口,用于运行Java程序的测试用例,并通过使用探测操作来探索执行状态。• 覆盖图显示:ProTest可以以图形的形式显示状态空间覆盖。图中的节点表示抽象的机器状态,边用操作实例标记。边通过应用标记的操作实例来表示状态变换。M. Satpathy et al.理论计算机科学电子笔记111(2005)113125操作名称类型分区数目生成分区数目覆盖PageAtColumn1探测11ColourAtColumn1探测11当前光标位置探测11PageAtCursor探测11ColourAtCursor探测11PageAtLastColumn探测11ColourAtLastColumn探测11定义更新33下芬更新11上光标更新4515downCursor更新9618表1每个操作4.3测试用例的机械生成在预处理阶段,B机器的无限集和延迟集被转换为有限枚举状态;并且尺寸保持较小,以便于穷举模型检查。ProTest分区分析器对每个B操作的输入空间进行分区,以生成一组操作实例。然后,ProB模型检查器尝试探索整个状态空间并生成状态覆盖图。覆盖图是一个有向图,它有一个起始状态,也称为覆盖图的根。图4显示了我们案例研究中(定义 请注意,定义操作的不同分配将导致不同的覆盖图。 表1显示了生成的一些图所涵盖的操作实例的数量。可以看出,对于upCursor和downCursor操作,只有一小部分实例出现在覆盖图中。原因是:(i)给定的初始化和常数设置使得许多实例不可达,以及(ii)我们的朴素定理证明器在这个阶段没有删除一些可能不一致的分区。需要注意的是,绝大多数未覆盖的划分都是矛盾的,目前我们的简单定理证明器没有捕捉到它们;我们正在努力使用CLP来捕捉更多。表2中的试探法用于遍历状态覆盖图以生成一组测试用例,每个测试用例的形式为(preamble(p)::OP,假设(NJ)),其中OP是连接节点对(N,NJ)的边的标签,preamble(p)是从图的根到N的路径的标签序列,preamble(p)::OP是连接节点对(N,N j)的边的标签。126M. Satpathy et al.理论计算机科学电子笔记111(2005)113{JS{
下载后可阅读完整内容,剩余1页未读,立即下载
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![gz](https://img-home.csdnimg.cn/images/20210720083447.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pptx](https://img-home.csdnimg.cn/images/20210720083543.png)
![whl](https://img-home.csdnimg.cn/images/20210720083646.png)
![gz](https://img-home.csdnimg.cn/images/20210720083447.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![whl](https://img-home.csdnimg.cn/images/20210720083646.png)
![gz](https://img-home.csdnimg.cn/images/20210720083447.png)
![whl](https://img-home.csdnimg.cn/images/20210720083646.png)
![gz](https://img-home.csdnimg.cn/images/20210720083447.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 新皇冠假日酒店互动系统的的软件测试论文.docx
- 上海空中营业厅系统的软件测试论文.doc
- 网上选课系统的设计与实现论文.doc
- 师生互动网站设计与实现 ()论文.doc
- 学生档案管理系统论文_正文.doc
- 视频会议系统的设计与实现毕业论文.docx
- 基于web的职工电子档案管理系统的设计与实现毕业论文.docx
- 考试辅导网站的设计与实现论文.doc
- 论文 云端图书馆管理系统设计与实现.docx
- 计算机等级考试网上辅导系统的设计与实现论文.doc
- 基于web烘焙坊网站的设计与实现论文.doc
- 论文_基于J2EE的高校后勤采供管理系统开发.docx
- 老龄化社区服务及其系统应用论文.doc
- 论文-java基于SSM的大学生创新创业信息系统.docx
- 猎豹安全浏览器的软件测试论文.doc
- 基于Web的网上书店系统的设计与实现毕业论文.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)