




已阅读5页,还剩82页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
下午3时6分,白盒测试 White-box testing,任课老师:黄武,下午3时6分,提纲,白盒测试概述 静态白盒测试 动态白盒测试,下午3时6分,1. 白盒测试概述,白盒测试概念 白盒测试过程 白盒测试的应用范围 白盒测试的优点 白盒测试的缺点 白盒测试的发展历程,下午3时6分,1.1 白盒测试概念,白盒测试是一种基于软件内部路径,结构和代码实现基础上的软件测试策略,该测试方法通常需要详细的编程技巧 例:请找出下面代码的错误 void main ( ) int x; if( x 0 ) x = -x; / 翻转负数 ,下午3时6分,1.2 白盒测试过程,通用的白盒测试过程如下: 分析测试软件的内部实现 识别被测软件的工作路径 选择输入,执行被测路径,并确定期望的测试结果 运行测试 比较真实输出和期望输出的异同 作出被测软件功能正确性的判断,下午3时6分,1.3 白盒测试的应用范围,白盒测试能够应用到所有的系统开发阶段,包括单元测试,集成测试和系统测试 白盒测试通常进行路径测试,我们可以通过这种方法测试单元内部,单元之间,子系统之间以及系统内部的各种执行路径 路径(测试路径):从开始到结束执行之间运行的语句序列,Unit,Integration,System,白盒测试的应用,1.4 白盒测试的优点,迫使测试人员去思考软件的实现 可以识别和测试代码中的每条分支路径,对代码的测试比较彻底 揭示隐藏在代码中的错误或缺陷 根据内部结果进行最优化测试,下午3时6分,1.5 白盒测试的缺点,执行路径可能非常多造成无法进行完全测试 白盒测试假设控制流是正确的,因此测试人员只基于存在的路径进行测试,而对于不存在的路径则无法测试 测试员必须具备编程知识,可能有很多测试员不具备这种知识,将无法进行白盒测试,比如财会人员无法对财务软件进行白盒测试,下午3时6分,1.6 白盒测试的发展历程,第1代到第4代白盒测试方法的主要差别,下午3时6分,1.6.1白盒测试的发展历程说明,第1代白盒测试方法属于无组织、无约束的测试方法,典型情况是拿调试当测试,或者简单的在被测代码中加入print、assert等语句 第2代白盒测试方法主要克服第1代方法的两大缺陷:一是没有测试评估(比如覆盖率),二是未对测试操作进行重用,重用测试操作必然以某种形式化语言描述测试过程 。常见的第2代白盒测试工具有:Rational的RTRT、Parasoft的CppTest、IPL的Cantata+等,下午3时6分,1.6.1 几代白盒测试的差异说明,第3代白盒测试方法区别第2代方法最主要特点是:它支持持续集成的操作模式,这在理念上有了一次飞跃。第3代白盒方法主要代表是xUnit系列测试工具,如JUnit、NUnit、DUnit等 第4代白盒测试方法相对第3代方法,主要是引入了调测一体的理念。遵循第4代白盒测试方法的测试工具主要以VcTester为代表,下午3时6分,2 静态白盒测试,静态白盒测试概述 正式审查 编码标准和规范 通用代码审查清单,下午3时6分,2.1 静态白盒测试概述,静态白盒测试是指在不执行软件的条件下有条理地仔细审查软件设计、体系结构和代码,从而找出软件缺陷的过程,有时又称为结构分析 对于要求严格的代码,比如军队,金融,工业控制,医药类软件,通常会自觉组织静态白盒测试,下午3时6分,2.1.1 静态白盒测试的原因,静态白盒测试可以从整体上把握软件代码的质量,比如可以轻易找到代码不合规范的地方 进行静态白盒测试可以尽早发现软件缺陷,便于及时改进 静态白盒测试为动态测试准备的案例提供思路,下午3时6分,静态白盒测试的原因,下午3时6分,2.1.2 静态白盒测试的困难,由于静态白盒测试投入高,耗时多,而且没有直接的产出,很多公司难于接受,往往不能善始善终 静态白盒测试要求公司具有对编程标准和规范了解深刻的程序员,但很多公司不具备这种程序员,造成执行困难 静态白盒测试可能会减缓软件开发的进度,下午3时6分,2.2 正式审查,正式审查是进行静态白盒测试的过程,其含义广泛,从两个程序员之间的交谈,到代码的严格检查均属于此 正式审查是一个逐步建立的过程。如果正确进行正式审查,这将是早期发现软件缺陷的好方法,下午3时6分,2.2.1 正式审查的4个要素,审查准备 每一个合作者都要精心准备,他们在审查中扮演不同角色,比如程序员,测试员,管理员等,明确自己的责任和义务。很多问题是在准备阶段发现的 遵守规则 审查要遵守一套固定的规则,比如设定要评审的代码量,花费的时间,审查的形式,哪些需要备注等,下午3时6分,2.2.1 正式审查的4个要素,确定问题 审查的目标是找出软件的问题,包括错误和遗漏。在审查时,只针对代码而不要针对程序员,避免相互指责 编写审查报告 审查小组必须做出总结审查结果的书面报告,并使报告便于开发小组的成员使用,下午3时6分,2.2.2 正式审查的间接效果,交流审查成员之间加强了交流,从而相互理解,相互学习 质量程序员的代码通过逐行审查,不仅提高审查代码的质量,同时也对程序员起到促进作用,下午3时6分,2.2.3 同事审查,同事审查是指在编写代码的程序员和充当审查员的程序员或测试员之间进行的小范围正式审查,这是最简单的正式审查,又被称为伙伴审查 为了避免同事审查流于形式,同事审查也要保证正式审查的4个关键要素:审查准备,遵守规则,确定问题以及编写审查报告,下午3时6分,2.2.4 公开陈述,公开陈述是使同事审查正规化的下一步。编程人员需要向专门组成的审查小组公开陈述代码,包括逐行的解释代码,说明代码的工作原理等,审查人员则需要提出问题 在进行公开陈述之前,程序员要向审查人员提供代码,以便审查人员事先检查和提出问题 在审查人员中至少有一位资深的程序员,下午3时6分,2.2.5 检验,检验是最正式的审查类型,具有高度的组织化,要求每一个参与者都接受训练 检验与公开陈述的不同之处在于表述代码的人员不是代码的编写者,这要求他学习和了解表述的材料,从而有可能在检验会议上提出不同的看法和解释 另外的参与者称为检验员,其职责是从不同角度,例如用户、测试人员或者产品支持人员的角度去审查代码 检验经证实是在所有软件交付内容中,特别是设计文档和代码中发现软件缺陷的最有效方法,下午3时6分,2.3 编码标准和规范,标准(Standard)1986年国际标准化组织发布的ISO第2号指南中提出的标准定义(草案)是:“得到一致(绝大多数)同意,并经公认的标准化团体批准,作为工作或工作成果的衡量准则、规则或特性要求,供(有关各方)共同重复使用的文件,目的是在给定范围内达到最佳有序化程度。” 标准比较严格,有些标准带有强制性 规范(Specification)某一范畴内以明文规定或约定俗成的形式规定的规则 规范相对标准而言比较放松一些,不具有强制性,下午3时6分,2.3.1 坚持编码标准和规范的原因,坚持符合标准和规范编码的三个重要原因: 可靠性严格按照某种标准或规范编写的代码比不这样做的代码更加可靠,缺陷更少 可读性/维护性符合标准和规范的代码易于阅读、理解和维护 可移植性代码经常在不同的硬件上运行,或者使用不同的编译器,如果代码遵循设备标准,将更容易使软件具有移植性 软件审查小组在开始审查前需要了解相应的标准和规范,下午3时6分,2.3.2 标准或规范的格式,软件标准通常由4个部分组成 标题:描述标准包含的主题 内容:描述标准或规范内容 解释说明:给出标准背后的原因,以使程序员理解采用标准的原因 示例:给出如何使用标准的简单程序示例,这是可选择的,下午3时6分,2.3.3 标准或规范的示例,TOPIC:3.05 Control-Restriction on control structures STANDARD The go to statement (and hence labels as well) should not be used. The while loop should be used instead of the do-while loop, except where the logic of the problem explicit requires doing the body at least once regardless of loop condition. If a single if-else can replace a continue, and if-else should be used JUSTIFICATION The go to statement is prohibited for the empirical reason that its use is highly correlated with errors and hare-to-read code, and for the abstract reason that algorithms should be expressed in structures that facilitate checking the program against the ,下午3时6分, 标准或规范的示例1,TOPIC:7.02 C_problems problem areas from C GUIDELINE Try to avoid C language features if a conflict with programming in C+ Do not mix C-style FILE I/O (using stdio.h) with C+ style I/O (using iostream.h or stream.h) on the same file. Avoid using C functions like memcpy or memcmp for copying or comparing objects of a type other than array-of-char or just-a-struct. Avoid the C macro NULL; use 0 instead. JUSTIFICATION Each of these features concerns an area of traditional C usage which creates some problem in C+.,下午3时6分, 公司内部的规范示例,TOPIC: sentence 每行一个语句 每行最多包含一个语句。如 a+; /推荐 b-; /推荐 a+; b-; /不推荐,下午3时6分,2.3.4 标准或规范的资源,下午3时6分, 标准或规范的资源网站1,全国信息技术标准化网 /,下午3时6分, 标准或规范的资源网站2,电气电子工程师协会 ,下午3时6分,2.3.5 程序风格,遵循不同的标准、规范(包括自己的)就形成了程序员的编程风格 比如在函数前进入注释,每行代码不超过100列宽,遵循严格的缩进格式 良好的代码风格是代码维护的基础,比如 /* FUNCTION: void Fill_Scan_Disp_Data(DWORD dwStart, int iNum, short *p) PURPOSE: This function fill p data to displaying buffer. PARAMETERS:dwStart - display buffer start position. iNum - the data number to fill displaying buf. *p - Temporary data buffer pointer. RETURN: None. */ void CTM_WAVEDoc:Fill_Scan_Disp_Data(DWORD dwStart, int iNum, short *p) ,下午3时6分,2.4 通用代码审查清单,数据引用错误 数据声明错误 计算错误 比较错误 控制流错误 子程序参数错误 输入/输出错误 其他错误,下午3时6分,2.4.1 数据引用错误,数据引用错误是指使用未经正确初始化和引用方式的变量、常量、数据、字符串等导致的软件缺陷,包括: 是否引用了未初始化的变量 数组和字符串的下标是否为整数,是否未访问边界或越界 是否在使用常量的地方使用了变量 变量是否被赋予不同类型的值 使用了未分配内存指针吗等,下午3时6分, 数据引用错误举例,变量被赋于不同数据类型的值,下午3时6分,2.4.2 数据声明错误,数据声明错误的原因是不正确地声明或使用变量和常量,包括: 所有变量都赋予了正确的长度、类型吗? 变量是否在声明的同时进行了初始化 存在声明过但从未引用过的变量吗 在特定模块中所有变量都显示声明了吗?如果没有,是否可以理解为该变量与更高级别的模块共享(全局变量),下午3时6分, 数据声明错误举例,int Get_Max_Value( int start, int iNum, short *p ) short max, min; max = *(p+start); / The first value evaluate to max for(int i=start+1; istart+iNum; i+) if( max *(p+i) ) max = *(p+i); return (max); min变量申明后从未使用过,下午3时6分,2.4.3 计算错误,计算错误是基本的数据逻辑问题,即不能得到正确的计算结果,包括: 计算中是否使用了不同数据类型的变量 赋值的目的变量是否小于赋值的源变量 在数值计算中是否可能出现溢出 除数/模是否可能为0 对于整形运算,是否会丢失精度 变量的值是否超过有意义的范围 对于包含多个操作数据求值表达式是否不清晰,下午3时6分, 计算错误举例,int Get_Ave_Value( int start, int iNum, short *p ) int ave = 0; int sum = *(p+start); for(int i=start+1; istart+iNum; i+) sum += *(p+i); ave = sum/iNum; / if iNum=0,Its error return (ave); ,下午3时6分,2.4.4 比较错误,小于、大于、等于、不等于、真、假等比较和判断逻辑错误,可能造成边界条件问题,包括: 比较正确吗,应该使用小于还是小于等于 精度会影响浮点数之间的比较结果吗?1.00000001和1.00000002是否相等 每一个逻辑表达式都正确计算吗,次序正确吗 逻辑表达式的值都是逻辑值吗,是否包含整数的整形变量,下午3时6分, 比较错误举例,int Read_Queue_Data(int iNum, long *buf) /1. - set reverse flag. - if( rp+iNum iQueue_Size ) bReverse_Flag = false; /2. - Read actual data from queue. - for (int i=0; i和=混淆引发错误,下午3时6分,2.4.5 控制流错误,控制流程错误的原因是编程语言中循环等控制结构未按预期方式工作,他们通常由计算或比较错误直接或间接引起,包括: 复合语句是否配对 程序、模块、子程序和循环能否终止 可能存在死循环吗 循环可能从不执行吗 在switchcase语句中超出分支范围是否处理,下午3时6分, 控制流错误举例,switch ( iType ) case LABEL_TYPE_GENERAL: Draw_A_Label( i, pDC, label, rect ); break; case LABEL_TYPE_STIMULATE: Draw_A_Sti_Label( i, pDC, label, rect ); break; case LABEL_TYPE_DROP: Draw_A_Drop_Label( i, pDC, label, rect ); break; 如果不出现上面三种情况,程序如何处理?,下午3时6分,2.4.6 子程序参数错误,子程序参数错误的来源是软件子程序不正确地传递参数,包括: 子程序接收的参数类型和大小与调用代码发送的实参匹配吗 如果子程序有多个入口点,引用的参数是否与当前入口点没有关联 常量是否当作形参传递,意外在子程序中改动 子程序是否更改了仅作为输入值的参数 每一个参数的单位与相应的形参匹配吗比如ms和s,ml和l等,下午3时6分,2.4.7 输入/输出错误,输入/输出错误包括文件读取、键盘或鼠标输入以及打印机输出等设备写入错误,包括: 软件是否遵守外部设备读写数据的专用格式 文件或者外设不存在或未准备好如何处理 外设未连接、不可用或者读写过程中存贮器满如何处理 检查错误提示信息的准确性,正确性以及语法和拼写等,下午3时6分,2.4.8 其他错误,其他错误包括: 软件是否存在国际化问题 软件是否要运行在不同的操作系统下 是否考虑了软件的硬件兼容性,比如内存、图形捕获卡等 程序编译是否产生了警告或提示信息,这些信息通常指示进行了有疑问的处理,下午3时6分,2.4.9 通用代码审查清单总结,上面的通用代码审查清单在我们进行静态白盒测试时起到指南的作用 由于上面的错误具有通用性,目前很多系统的编译器都能够对这些错误进行检查,如果我们提高编译器检查错误的等级,那么它会列举出很多这样的错误供我们参考,下午3时6分,在V C 6.0中设置编译警告级别,选择“Project”菜单下的“Settings”命令进入,下午3时6分,3 动态白盒测试,动态白盒测试概述 动态白盒测试和调试 分段测试 数据范围 控制流测试,下午3时6分,3.1 动态白盒测试概述,动态白盒测试是指利用查看代码功能和实现方式得到的信息来确定哪些要测试,哪些不测试,如何开展测试,又称为结构测试,下午3时6分,3.1.1 动态白盒测试的内容,直接测试底层功能、过程、子程序和库 以完整程序的方式从顶层测试软件,但是根据对软件运行的了解调整测试案例 从软件获得读取变量和状态信息的访问权,以便确定测试与预期结果是否相符,同时,强制软件以正常测试难以实现的方式运行 估算执行测试时覆盖的代码量,然后调整测试,去掉多余的,补充遗漏的,下午3时6分,3.2 动态白盒测试和调试,动态白盒测试的目标是寻找软件缺陷,调试的目标是修复软件缺陷 进行动态白盒测试,需要使用与程序员相同的工具,了解程序的运行状态,动态白盒测试和调试的关系,下午3时6分,3.3 分段测试,一开始就对程序进行整体测试,可能会造成两个缺陷: 难以找到导致问题的原因,因为受到众多因素的影响 某些缺陷掩盖了其他缺陷,导致一个缺陷解决马上又引起新的缺陷,下午3时6分,3.3.1 单元和集成测试,我们应该采取代码分段建立和测试的策略,这样容易形成稳定的代码,主程序,模块1,模块2,模块11,模块111,模块112,模块113,模块21,模块22,模块12,独立建立代码模块并分别测试,然后再集成测试,下午3时6分,3.3.2 单元测试,在底层进行的测试被称为单元测试或模块测试 采取这种测试策略很容易隔离软件缺陷 在单元级发现问题时,问题肯定在单元中 在多个单元集成时发现软件缺陷,那么它通常与模块之间的交互相关,下午3时6分, 自底向上的单元测试,自底向上的测试中,需要编写称为测试驱动的模块以进行单元测试 测试驱动模块以将来真正模块同样的方式挂接,向处于测试的模块发送测试案例数据,接受返回结果,并验证正确性,下午3时6分, 自顶向下的单元测试,自顶向下的测试中,是对完成的高层软件进行测试,而下层软件则使用存根代码来模拟 这样做的目的是测试在实际中不宜出现的数据,因为存根软件可以按要求产生各种数据,温度显示模块,温度计接口模块,测试过的温度显示模块,测试员书写的存根模块,模拟,测试文件,实际配置,测试配置,下午3时6分,3.4 数据范围,由于软件可以分为数据和状态,白盒测试也包含数据测试和状态测试 数据包括常量、变量、数组、结构,键盘和鼠标输入、文件、屏幕输出,网络输入输出等 数据流范围主要是指在整个软件中跟踪一批数据 如果在底层测试函数,就会使用调试器观察变量在运行期间值的变化,下午3时6分,3.4.1 次边界,在白盒测试中,我们通过查看代码,找到程序内部的次边界,然后建立他们的测试案例 下面是程序内部的一些次边界的例子: 计算时从采用数据表转换为使用公式 为了获得更高的精度,复杂的数值分析程序根据数字大小切换不同的处理方式,下午3时6分,3.4.2 公式和等式,查看公式中存在的数据隐患,例如计算银行复利的公式如下: A=P(1+r/n)nt 其中:P = 本金 r = 年利率 t = 年数 n = 每年复加的利率次数 A = 若干年的本息总和 在上面的代码中,如果设定n=0,就会造成代码崩溃,下午3时6分,3.4.4 错误强制,有些数据在实际系统中很难出现,我们难于测试,比如连接超过10个的USB设备,屏幕的分辨率为3000像素,为了对这些情况进行测试,我们需要在调试器中强制设定相关变量的值,以便调试在这些情况下的程序运行,下午3时6分, 错误强制举例,在VC6中强制修改变量的值,下午3时6分,3.5 控制流测试,我们除了测试数据之外,还需要对程序的控制流进行测试 我们需要测试程序的状态以及其中的程序流程,必须设法进入和退出每一个模块,执行每一行代码,追踪每一条逻辑和决策分支,这些测试称为控制流测试,即代码范围分析 我们通常会使用代码范围分析工具作这样的工作,下午3时6分,3.5.1 控制流测试概述,控制流测试通过识别程序代码中的执行路径建立覆盖那些路径的测试案例 不幸的是,试图对任何适当的模块进行彻底地控制流路径测试都是不现实的。测试路径的数量太多造成无法在合理的时间内测试完成 测试中每增加一个判定条件就会加倍测试路径并且任何一个循环将被乘增量测试路径(2n),下午3时6分, 控制流测试的缺陷,路径太多使控制流无法完全测试 for ( i=0; i1000; i+ ) for ( j=0; j1000;j+ ) for ( k=0; k1000; k+ ) doSomethingWith (i, j, k ); doSomethingWith () 函数将执行10亿次 ( 1000 10001000 ),相当于10亿条路径,下午3时6分, 控制流测试的缺陷2,程序执行路径可能在模块中被遗失,任何基于实现路径的测试方法都不能测试没有实现的路径,例如: if ( a0 ) doIsGreater (); if ( a=0 ) doIsEqual(); / 遗失语句: if ( a0 ) doIsLess();,下午3时6分, 控制流测试的缺陷3,软件本身的逻辑错误无法通过测试找到,例如: / actual ( but incorrect ) code a = a+1; /correct code a=a-1;,下午3时6分,3.5.2 控制流图,尽管控制流测试存在缺陷,但它仍然是白盒测试的重要工具 控制流图是控制流测试的基础,控制流图包含3个部分: 进程块(Process Block) 判定点(Decision Point ) 连接点(Junction Point ),下午3时6分, 控制流图的进程块,进程块是从头至尾顺序执行的程序语句序列,只有起始块可以没有进入点,只有结束块可以没有退出点 一旦进程块启动,其内部的每一条语句都会被顺序执行 进程块使用圆型泡泡+入口点+出口点构成,Process block,下午3时6分, 控制流图的判定点,判定点是模块中某一点,在这一点控制流能够改变方向。很多判定点是二值化的并且使用if-then-else语句实现;多路判定点通常使用case语句实现。 判定点使用包含一个输入和多个输出的泡泡表示,判定点,下午3时6分, 控制流图的连接点,连接点是将控制流结合起来的点 连接点使用包含多个输入和1个输出的泡泡表示,连接点,下午3时6分, 控制流图的举例,下面代码的控制流图如右所示: q=1; b=2; if(a=2) x=x+2; else x= x/2; p=q/r; if(b/c3) z=x+y;,q=1 b=2,if(a=2),x = x+2,x= x/2,p = q/r,if(b/c3),z= x+y,下午3时6分,3.5.3 代码测试的覆盖范围,在控制流测试中,定义了8种级别测试覆盖范围(coverage) 覆盖范围(coverage)的意思是已经被测试的代码百分比,下午3时6分, 小于100%语句覆盖范围,0级: 测试与调试之间没有区别,除了支持调试,测试本身没有目的 缺陷可能会偶尔被发现,但是没有正式的努力去找到它们,下午3时6分, 100%语句覆盖范围,1级: 最低覆盖范围是指100%语句覆盖,可以简称为语句覆盖 语句覆盖意味着测试模块中的每一条语句都至少被执行一次。这好像是合理的目标,但这种测试会导致很多缺陷遗失,例如: 1. if (a0) 2. x= x+1; 3 . if (b=3) 4. y=0;,左边程序段的状态图 用例a=6, b=3就可以完成100%语句覆盖,下午3时6分, 语句(statement)覆盖范围,上例中有4条独立的路径,但却只执行了一条,由于测试路径的遗漏,可能会导致缺陷的发生。语句测试只是入门测试,下午3时6分, 判定(decision)覆盖范围,2级: 下一级的控制流测试是100%判定测试,这又被称为分支测试 在分支测试下,要求测试用例至少保证每个判定条件为真、假的情况至少出现一次 分支测试不能保证路径覆盖,但是可以保证语句覆盖,下午3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年潮玩消费市场深度解读:收藏价值与文化传承研究
- 2025年家庭教育指导服务市场细分产品供给与需求匹配研究报告
- 2025年生鲜新零售市场供应链优化与冷链物流效率提升报告
- 河北省昌黎县靖安学区2021-2022学年五年级上学期科学期中试卷(含答案)
- 民法典物权法课件
- 2025年造价工程师考试冲刺押题卷-工程造价计算与招标投标专项训练
- 2025年Python二级考试专项训练试卷 知识点押题精讲版
- 现代化衣柜知识培训内容课件
- 2025年公务员考试行测数量关系全真试卷 高频考点冲刺押题
- 2025年高考英语词汇短语专项训练试卷
- 2024年国药控股股份有限公司招聘笔试冲刺题(带答案解析)
- “新高考、新课标、新教材”背景下2025届高考地理二轮三轮复习备考策略
- 葡萄糖耐量试验课件
- 常见泌尿系统疾病的护理与治疗
- 儿童读写三十讲
- 可编程控制器系统应用编程(1+X)培训考试题库汇总(附答案)
- 不等式及其基本性质说课课件
- 肺切除术后支气管胸膜瘘处理策略
- 中国有色金属行业:决战元素周期表-20210810-海通国际-201正式版
- 00052管理系统中计算机应用(实践)考试题目
- 人教版七年级英语上册单词带音标(WORD)
评论
0/150
提交评论